---
title: 系統層級資料流圖（DFD Level 0）
eyebrow: Guidant AI 資安檢視總報告 · 系統資料流（DFD）
h1: 系統層級資料流圖（DFD Level 0）：誰連誰、走什麼、傳什麼
lede: 把整套產品當一個系統，畫出**運作時所有會發生連線的地方**——誰發起、連到誰、什麼協定與埠、傳的是什麼資料、怎麼驗身分。這是後續各模組細部 DFD 與威脅建模（STRIDE）的底圖；程式架構本身見[架構手冊](../../features/architecture-handbook/big-picture.html)。**依 2026-10-02 在 STG（188 安裝版 stack）實際查到的服務、埠、設定與連線畫，不是依文件推。**
---

> **怎麼讀**：方框是**處理程序**（我們跑的服務），虛框圓角是**外部實體**（我們不控制的人或系統），圓柱是**資料儲存**。每條線寫「協定／埠 · 傳什麼」。虛線是**依設定才存在**或**待驗**的連線。
>
> **事實來源**：`docker ps`／`docker inspect` 的服務與環境變數、容器內 `/proc/net/tcp` 的即時連線、FE 容器的 nginx 設定、stack DB 的 `system_configs`／`log_forwarding_settings`／`tenant_detection_tool_configs`、agent 安裝包的 compose。查法與原始輸出見本頁末段。

## 一、全系統資料流圖

一張圖塞 27 條線會糊成一團，拆成四張閱讀版：**邊界圖**（誰從外面進來）→ **內部圖**（stack 裡的服務怎麼接）→ **對外整合圖兩張**（依設定才存在的那些）；最後一張是**全貌版**，只看形狀用。

### 圖 1 — 邊界：兩種「外面的東西」怎麼碰到系統

```{.mermaid cap="圖 1 — 進入系統的兩個入口（瀏覽器、代理程式）與各自的驗身分方式；主系統反向連代理程式的資料面 :8443 也在這裡。"}
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB'}}}%%
flowchart LR
    U(["👤 使用者<br/>瀏覽器"])
    subgraph AGENTBOX["🏢 客戶機房（每台一套）"]
        direction TB
        AG["evidence-agent"]
        ASW[("agent-seaweedfs<br/>證據暫存 S3 :8333")]
        ENG["檢測引擎<br/>（本機程序）"]
        AG -- "S3 :8333" --> ASW
        AG -- "本機" --> ENG
    end
    CUSTHOST(["🖥 客戶受檢主機"])
    subgraph MAIN["🏠 主系統 stack"]
        direction TB
        FE["guidant-fe<br/>nginx 前門 :443"]
        API["guidant-api :8000"]
        SIO["guidant-socketio :8002"]
        FE -- "/api/1.0" --> API
        FE -- "/socket.io" --> SIO
    end

    U -- "HTTPS :443 · 頁面＋API · JWT" --> FE
    AG -- "HTTPS :443 · 報到／心跳／領工作／回報<br/>mTLS＋簽章通行證，每請求查撤銷" --> FE
    API -- "HTTPS :8443 · 資料面 mTLS＋JWT<br/>探測工具、取消、取證據檔" --> AG
    AG -- "SSH :22／WinRM · 客戶維運帳密" --> CUSTHOST
    ENG -- "網路掃描" --> CUSTHOST

    classDef ext fill:#FBFCFC,stroke:#9AA8AA,stroke-dasharray:3 2
    class U,CUSTHOST ext
```

### 圖 2 — 主系統內部：stack 裡的服務怎麼接

```{.mermaid cap="圖 2 — 主系統 stack 內部（docker 網路 guidant_default，不對外開埠）。api／socketio／worker 三個行程實測都只持有 DB 與 Redis 連線；sandbox 在獨立網路、只有 worker 連得到。"}
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB'}}}%%
flowchart LR
    FE["guidant-fe<br/>:80→301 :443"]
    API["guidant-api<br/>REST :8000"]
    SIO["guidant-socketio<br/>:8002"]
    WK["guidant-worker<br/>背景工作"]
    subgraph ISO["隔離網路 guidant_guidant-sandbox"]
        SB["guidant-sandbox<br/>檔案拆解＋Prompt Guard :8080<br/>無 AI 金鑰、不出網"]
    end
    DB[("guidant-db<br/>PostgreSQL :5432<br/>RLS 隔租戶")]
    RD[("guidant-redis<br/>:6379")]
    SW[("檔案儲存（三選一）<br/>內建 SeaweedFS S3 :8333（出廠）<br/>或客戶 MinIO S3 ／ 本機磁碟")]

    FE -- "HTTP :8000" --> API
    FE -- "HTTP :8002" --> SIO
    API -- ":5432 · 業務資料" --> DB
    SIO -- ":5432" --> DB
    WK -- ":5432 · 撿 background_jobs" --> DB
    API -- ":6379 · session／快取" --> RD
    SIO -- ":6379 · 訊息佇列" --> RD
    WK -- ":6379" --> RD
    API -- "S3 :8333 或本機路徑 · 檔案" --> SW
    WK -- "S3 :8333" --> SW
    WK -- "HTTP :8080 · 送檔拆解、問注入分數" --> SB
    API -. "入列（寫 DB），不直連" .-> WK
```

### 圖 3 — 對外整合（上）：身分、通知、稽核與維運

```{.mermaid cap="圖 3 — 主系統連出去的外部服務（身分／通知／稽核維運）。全部依系統設定才建立；括號內是 STG 現在實際設的值。"}
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB'}}}%%
flowchart LR
    API["guidant-api"]
    LDAP(["🗂 LDAP／AD<br/>LDAPS :636<br/>（192.168.50.160）"])
    SMTP(["✉️ SMTP<br/>STARTTLS :587<br/>（smtp.gmail.com）"])
    CHAT(["💬 Discord／Telegram<br/>HTTPS webhook"])
    SIEM(["📡 客戶 SIEM<br/>UDP :5140 syslog<br/>（192.168.50.150，明文）"])
    ISSUE(["🐛 GitHub／GitLab<br/>HTTPS（gitlab.com）"])
    LC(["🔑 License Center<br/>HTTPS"])

    API -. "帳密驗證<br/>（驗憑證預設不勾）" .-> LDAP
    API -. "通知信、驗證碼<br/>（驗憑證預設不勾）" .-> SMTP
    API -. "通知推播" .-> CHAT
    API -. "操作日誌轉送" .-> SIEM
    API -. "意見回饋轉問題單" .-> ISSUE
    API -. "授權啟用" .-> LC

    classDef ext fill:#FBFCFC,stroke:#9AA8AA,stroke-dasharray:3 2
    class LDAP,SMTP,CHAT,SIEM,ISSUE,LC ext
```

### 圖 4 — 對外整合（下）：AI、檔案、弱點檢測

**八種檢測工具全部由代理程式在客戶機房發動，主系統不直接碰任何工具**（主系統在雲端或 DMZ，連不到客戶內網的工具伺服器）。差別只在工具在哪裡跑：**伺服器型**是 agent 連客戶自架的工具伺服器；**主機型**是 agent 直接連受檢主機、在上面跑；**本機型**是 agent 自己跑掃描程式。「測試連線」按鈕也是主系統經資料面叫 agent 就近去探。

```{.mermaid cap="圖 4 — AI／檔案／檢測。AI 連線由主系統發起（OpenAI 與 Anthropic 兩家可選）；八種檢測工具全部由代理程式發起，主系統只經 :8443 資料面請它探測或取檔。"}
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB'}}}%%
flowchart LR
    API["guidant-api"]
    WK["guidant-worker"]
    AG["evidence-agent<br/>（客戶機房）"]
    AIEXT(["🤖 外部 AI<br/>HTTPS · OpenAI／Anthropic<br/>（經 LiteLLM，STG 設 openai）"])
    GDRIVE(["☁️ Google Drive<br/>HTTPS ⇄ webhook"])
    subgraph SRVTOOLS["伺服器型：agent → 客戶自架的工具伺服器"]
        direction TB
        OPENVAS(["OpenVAS<br/>GMP over TLS :9390"])
        ZAP(["ZAP<br/>HTTP API（當 proxy）:8080"])
        SONAR(["SonarQube Server<br/>HTTPS · 收 sonar-scanner 結果"])
        NESSUS(["Nessus<br/>（即將推出）"])
    end
    subgraph HOSTTOOLS["主機型：agent → 受檢主機，在上面跑"]
        direction TB
        INSPEC(["CINC Auditor／GCB<br/>Linux：SSH :22<br/>Windows：WinRM :5985／5986"])
        OSCAP(["OpenSCAP<br/>SSH :22（Linux 限定）"])
    end
    subgraph LOCALTOOLS["本機型：agent 自己跑"]
        direction TB
        NMAP(["Nmap<br/>本機程序，掃目標網段"])
        SCANNER(["sonar-scanner<br/>本機程序，掃源碼"])
    end
    PROFURL(["🌐 規則包網址<br/>HTTPS（只收 https）"])

    WK -. "證據分類<br/>（經 AI 閘道規則遮罩）" .-> AIEXT
    API -. "儀表板生成" .-> AIEXT
    API -. "同步證據檔" .-> GDRIVE
    GDRIVE -. "檔案變更通知（webhook 進來）" .-> API
    API -- "HTTPS :8443 · 資料面 mTLS＋JWT<br/>測試連線（probe）、取消、取檔" --> AG
    AG -. "GMP／HTTP · 客戶填的位址與金鑰" .-> SRVTOOLS
    AG -- "SSH／WinRM · 客戶維運帳密" --> HOSTTOOLS
    AG -- "本機執行" --> LOCALTOOLS
    SCANNER -. "HTTPS · 上傳結果" .-> SONAR
    API -. "第一次抽取、算指紋" .-> PROFURL
    AG -. "下載規則包（尚未比對指紋，CM-2402）" .-> PROFURL

    classDef ext fill:#FBFCFC,stroke:#9AA8AA,stroke-dasharray:3 2
    class AIEXT,GDRIVE,OPENVAS,ZAP,SONAR,NESSUS,INSPEC,OSCAP,NMAP,SCANNER,PROFURL ext
```

### 圖 5 — 全貌（四張合一）

上面四張是閱讀版；這張把全部 27 條線放在同一張，看整體形狀用，細節請回上面四張。

```{.mermaid cap="圖 5 — Level 0 全貌：所有外部實體、主系統服務、代理程式與資料儲存。"}
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB'}}}%%
flowchart TB
    U(["👤 使用者"])
    subgraph MAIN["🏠 主系統 stack"]
        FE["guidant-fe :443"]
        API["guidant-api :8000"]
        SIO["guidant-socketio :8002"]
        WK["guidant-worker"]
        SB["guidant-sandbox :8080"]
        DB[("PostgreSQL :5432")]
        RD[("Redis :6379")]
        SW[("檔案儲存<br/>SeaweedFS／MinIO／本機")]
    end
    subgraph AGENTBOX["🏢 客戶機房"]
        AG["evidence-agent"]
        ASW[("agent-seaweedfs")]
        ENG["檢測引擎"]
        CUSTHOST(["🖥 受檢主機"])
        TOOLSRV(["工具伺服器<br/>OpenVAS／ZAP／SonarQube"])
    end
    subgraph EXT["依設定的外部服務"]
        LDAP(["LDAP／AD"]); SMTP(["SMTP"]); CHAT(["Discord／Telegram"]); SIEM(["SIEM"]); ISSUE(["GitHub／GitLab"]); LC(["License Center"]); AIEXT(["外部 AI"]); GDRIVE(["Google Drive"]); PROFURL(["規則包網址"])
    end

    U -- "HTTPS" --> FE
    FE --> API
    FE --> SIO
    API --> DB
    SIO --> DB
    WK --> DB
    API --> RD
    SIO --> RD
    WK --> RD
    API --> SW
    WK --> SW
    WK --> SB
    AG -- "HTTPS mTLS＋通行證" --> FE
    API -- "HTTPS :8443 mTLS" --> AG
    AG --> ASW
    AG --> ENG
    AG -- "SSH／WinRM" --> CUSTHOST
    AG -. "GMP／HTTP" .-> TOOLSRV
    ENG --> CUSTHOST
    AG -.-> PROFURL
    API -.-> LDAP
    API -.-> SMTP
    API -.-> CHAT
    API -.-> SIEM
    API -.-> ISSUE
    API -.-> LC
    API -.-> AIEXT
    WK -.-> AIEXT
    API <-.-> GDRIVE
    API -.-> PROFURL

    classDef ext fill:#FBFCFC,stroke:#9AA8AA,stroke-dasharray:3 2
    class U,CUSTHOST,TOOLSRV,LDAP,SMTP,CHAT,SIEM,ISSUE,LC,AIEXT,GDRIVE,PROFURL ext
```

## 二、連線清單（圖的表格版）

每條連線有固定編號 **C01～C25**（C23 再分 a／b），其他頁要指某條連線時用這個編號連過來（例如 `dfd-level0.html#c20`）。**編號一旦給出不再改動**，新增連線只往後加。

只列**系統運作時**會發生的連線；原廠裝機、升級、出包這類維運動作不在本圖範圍。同一張圖、逐條列出，方便對照與之後補「信任邊界」欄。**「依設定」**＝客戶可在系統設定頁開關，沒設就不存在；**「必有」**＝產品一跑起來就有。

### 2.1 使用者與前門

| # | 誰 → 誰 | 協定／埠 | 傳什麼 | 驗身分 | 存在條件 |
|---|---|---|---|---|---|
| <a id="c01"></a>**C01** | 瀏覽器 → guidant-fe | HTTPS :443（:80 一律 301 轉） | 前端頁面；自簽或客戶憑證 | — | 必有 |
| <a id="c02"></a>**C02** | guidant-fe → guidant-api | HTTP :8000，路徑 `/api/1.0` | 所有業務 API | JWT（Bearer） | 必有 |
| <a id="c03"></a>**C03** | guidant-fe → guidant-socketio | HTTP :8002，路徑 `/socket.io` | 即時推播、問卷協作房間 | JWT | 必有 |
| <a id="c04"></a>**C04** | 瀏覽器 → guidant-api | HTTPS（經前門） | Google Drive OAuth 授權回呼 | state 綁瀏覽器 | 依設定（Drive） |

### 2.2 主系統內部（docker 網路 `guidant_default`，不對外開埠）

| # | 誰 → 誰 | 協定／埠 | 傳什麼 | 驗身分 | 存在條件 |
|---|---|---|---|---|---|
| <a id="c05"></a>**C05** | api／socketio／worker → guidant-db | TCP :5432 | 全部業務資料；RLS 以 session 變數隔租戶 | DB 帳密（`cm_app`，受 RLS） | 必有（實測三個行程都持有連線） |
| <a id="c06"></a>**C06** | api／socketio／worker → guidant-redis | TCP :6379 | session、快取、socketio 訊息佇列 | Redis 帳密（ACL 使用者 `guidant`） | 必有（實測） |
| <a id="c07"></a>**C07** | api／worker → 檔案儲存 | 依 `STORAGE_CONFIG.storage_type` 三選一：**SeaweedFS**（出廠預設，stack 內建，S3 :8333）／**MinIO**（客戶自備 S3 端點）／**本機磁碟**（容器內路徑，無網路） | 上傳檔、證據、匯出檔 | S3 存取金鑰；本機無 | 必有。STG 現設 minio 型指向 188:8333、`secure=false` 明文（總表 #124 裁定接受）。詳 2.7 |
| <a id="c08"></a>**C08** | worker／api → guidant-sandbox | HTTP :8080（獨立網路 `guidant_guidant-sandbox`，只有 worker 與 sandbox 在裡面） | 證據檔拆解、Prompt Guard 注入分數 | 無（靠網路隔離；sandbox 無 AI 金鑰、不出網） | 必有（`SANDBOX_MODE=remote`） |
| <a id="c09"></a>**C09** | api → worker | **不直連**；經 DB `background_jobs` 表入列、worker 輪詢撿單 | 證據分類等 AI 工作 | — | 必有 |

### 2.3 主系統對外（依設定）

| # | 誰 → 誰 | 協定／埠 | 傳什麼 | 驗身分 | 存在條件 |
|---|---|---|---|---|---|
| <a id="c10"></a>**C10** | api → 客戶 SMTP | SMTP :587（STARTTLS）或 465 | 通知信、驗證碼、初始密碼信 | SMTP 帳密；**驗憑證預設不勾**（CM-2239） | `SMTP` 設定（STG 設 smtp.gmail.com） |
| <a id="c11"></a>**C11** | api → 客戶 LDAP／AD | LDAPS :636 | 帳號密碼驗證、屬性 | bind 帳密；**驗憑證預設不勾** | `THIRD_PARTY_LOGIN`（STG 設 192.168.50.160:636） |
| <a id="c12"></a>**C12** | api → 客戶 SIEM | **UDP :5140**（或 TCP）syslog RFC5424／GELF | 操作日誌 | 無；UDP 明文（TLS 選項 CM-2369 後有） | `log_forwarding_settings`（STG 設 192.168.50.150:5140 UDP，enabled） |
| <a id="c13"></a>**C13** | worker／api → 外部 AI | HTTPS（經 LiteLLM，明示官方位址） | 證據內容片段（經 AI 閘道規則遮罩）、儀表板提示 | 原廠或客戶 API 金鑰（`AI_PROVIDER_CONFIG`） | `AI_PROVIDER_CONFIG`。畫面可選 **OpenAI、Anthropic** 兩家；後端另認得 Google、Azure OpenAI、Ollama 但模型碼表未補、畫面先不開（STG 設 openai） |
| <a id="c14"></a>**C14** | api ⇄ Google Drive | HTTPS；Drive 推變更通知進來 | 證據檔同步、資料夾建立；webhook 驗通行碼 | OAuth token（`DRIVE_TOKEN_ENCRYPTION_KEY` 加密落庫） | `GOOGLE_DRIVE_APP_CONFIG` |
| <a id="c15"></a>**C15** | api → GitHub／GitLab | HTTPS | 意見回饋轉問題單 | PAT（`ISSUE_INTEGRATE_CONFIG`） | 依設定（STG 設 gitlab.com） |
| <a id="c16"></a>**C16** | api → Discord／Telegram | HTTPS webhook | 通知推播 | webhook URL／bot token（`NOTIFY_CONFIG`） | 依設定 |
| <a id="c17"></a>**C17** | ~~api → 檢測工具~~ **主系統不直連任何檢測工具**；改為 api → agent 資料面（#21），由 agent 就近連工具（#23／#23a）。「測試連線」亦同 | — | — | — | 工具清單見 2.6 |
| <a id="c18"></a>**C18** | api → License Center | HTTPS | 授權啟用、序號兌換 | 簽章授權檔 | 落地版啟用時 |
| <a id="c19"></a>**C19** | api → 規則包網址 | HTTPS（只收 https，CM-2057） | 第一次抽取、算 sha256 | 無 | url 型 profile |

### 2.4 代理程式（客戶機房）

| # | 誰 → 誰 | 協定／埠 | 傳什麼 | 驗身分 | 存在條件 |
|---|---|---|---|---|---|
| <a id="c20"></a>**C20** | agent → 主系統前門 | HTTPS :443（`AGENT_CLOUD_ENDPOINT`） | 報到、心跳／領工作、確認收到、回報結果 | **mTLS 客戶端憑證＋控制面簽章通行證**（CM-2052），每請求查撤銷 | 裝了 agent |
| <a id="c21"></a>**C21** | 主系統 api → agent 資料面 | HTTPS :8443（`AGENT_BASE_URL`） | 測試連線（`/detection/probe`）、取消掃描、取回證據檔、源碼包下載 | mTLS 客戶端憑證＋綁 agent 身分的短效 JWT（`agent_probe_client.py`） | 裝了 agent；**需客戶開 8443 給主系統連入**。STG 的 agent 容器實測只聽 :8000，8443 由 compose 對外映射——那台是舊版探測容器，非正式部署 |
| <a id="c22"></a>**C22** | agent → agent-seaweedfs | S3 HTTP :8333（同機 docker 網路） | 證據暫存、WORM | S3 金鑰（compose 必填，缺了匿名全開） | 裝了 agent |
| <a id="c23"></a>**C23** | agent → 客戶受檢主機 | **Linux：SSH :22**（paramiko）／**Windows：WinRM :5985／5986**（經 cinc-auditor 的 winrm transport） | 在主機上跑主機型工具（CINC Auditor／GCB；OpenSCAP 只支援 Linux）、收結果 | 客戶維運帳密（平台加密下發，agent 用完即丟、密碼不進命令列） | 派掃描時。工具清單見 2.6 |
| <a id="c23a"></a>**C23a** | agent → 客戶自架的工具伺服器 | OpenVAS：**GMP over TLS :9390**（python-gvm）；ZAP：**HTTP API :8080**（ZAPv2，當 proxy 用）；SonarQube：agent 本機跑 sonar-scanner 後 **HTTPS 上傳**到 SonarQube Server | 建掃描、拉報告、送源碼分析結果 | 各工具帳密／API key（`tenant_detection_tool_configs`，平台加密下發） | 依設定；**位址客戶自填**（總表 #4／#79 已擋內網） |
| <a id="c23b"></a>**C23b** | agent 本機程序 | 無網路（Nmap 掃描流量另算） | Nmap 掃目標網段；sonar-scanner 掃源碼（源碼由 #21 自雲端取或 clone 公開 repo） | — | 派掃描時 |
| <a id="c24"></a>**C24** | agent → 規則包網址 | HTTPS | 下載規則包交引擎（**尚未比對指紋**，CM-2402） | 無 | url 型 profile |
| <a id="c25"></a>**C25** | 檢測引擎 → 受檢主機／網段 | 依工具（Nmap 等走原生掃描） | 弱點掃描 | — | 派掃描時 |

### 2.6 產品內建的檢測工具（8 種）

依 `config.detection_tools` 列出。**八種全部由代理程式在客戶機房發動**——主系統從不直接連任何工具（它連不到客戶內網；OpenVAS 甚至不是 HTTP）。差別在工具跑在哪裡：

| 代號 | 工具 | 做什麼 | 怎麼呼叫（agent 發起） | 支援 Windows | 狀態 |
|---|---|---|---|---|---|
| `openvas` | OpenVAS | 網路弱點掃描，比對 CVE／NVT | **GMP over TLS :9390**（python-gvm）→ 客戶自架的 OpenVAS 伺服器 | 掃描目標不限 | 可用 |
| `zap` | ZAP | 網頁應用程式動態檢測（DAST） | **HTTP API :8080**（ZAPv2，ZAP 當 proxy）→ 客戶自架的 ZAP | 掃描目標不限 | 可用 |
| `sonarqube` | SonarQube | 原始碼安全檢測（SAST） | agent **本機跑 sonar-scanner**（源碼從雲端經 #21 取、或 clone 公開 repo）→ **HTTPS 上傳**結果到客戶的 SonarQube Server。Server 沒有觸發掃描的 API | 與主機無關 | 可用 |
| `nessus` | Nessus | 網路弱點掃描 | （connector 未實作） | — | 即將推出 |
| `inspec` | CINC Auditor | 組態合規檢測，Profile 與 InSpec 相容 | agent shell out **cinc-auditor**，transport 依任務參數：**`ssh://` :22** 或 **`winrm://` :5985／5986**；密碼走設定檔不進命令列 | **是**（WinRM） | 可用 |
| `gcb` | 政府組態基準（GCB） | 依 TWGCB 檢測主機組態 | **同 CINC Auditor 引擎**、換一份 content（D7 決策，不另立引擎） | **是**（WinRM；TWGCB 有 Windows Server profile） | 可用 |
| `openscap` | OpenSCAP | Linux 安全組態，CIS／DISA STIG | agent 用 **SSH :22**（paramiko）連主機跑 oscap | **否**（官方已放棄 Windows） | 可用 |
| `nmap` | Nmap | 網路埠與服務探測 | agent **本機跑 nmap**（`[sudo] nmap -oX …`）掃目標；可選經 SSH 跳板 | 掃描目標不限 | 可用 |

STG 目前八種裡設定了七種（Nessus 未設）。主機型工具的規則包（profile）來源有兩種：平台上傳的檔案（走 #7 SeaweedFS、agent 經 #21 取）或客戶填的網址（#19／#24）。

### 2.7 檔案儲存後端（三選一）

產品把檔案存哪裡由系統設定 `STORAGE_CONFIG` 決定，`jedi_file_upload` 的 provider factory 實際只建這三種（S3／Azure／GCS 有型別代號但沒有實作，不算提供）。每個檔案在 `upload_files.storage_type` 記下它躺在哪種後端，讀取時據此借對應設定，所以**切換後端不會搬舊檔**（已知缺口，見 followup）。

| `storage_type` | 後端 | 連線 | 誰來的 | 出貨狀態 |
|---|---|---|---|---|
| `seaweedfs` | SeaweedFS（stack 內建 `guidant-seaweedfs`） | S3 HTTP :8333，docker 內網 | installer 一起裝 | **出廠預設**（`FACTORY_DEFAULT`） |
| `minio` | MinIO 或任何 S3 相容端點 | S3 HTTP／HTTPS，位址客戶填 | 客戶自備 | 可選；FE 與 seaweedfs 共用同一組 S3 欄位 |
| `local` | 容器內本機磁碟 | 無網路，檔案路徑 | — | 可選；單機、無 HA |

SeaweedFS 與 MinIO 走同一套 S3 協定、同一個 SDK，但給不同型別代號——同一套部署若兩種並存，讀取端才不會借錯端點（`storage_type_code.py` 的注意事項）。

## 三、查到但要注意的事

- **188 上有兩套 SeaweedFS**：主系統 stack 的 `guidant-seaweedfs` 與 agent 安裝包的 `guidant-agent-seaweedfs`，互不相通。另外還有一組舊的 `seaweedfs`／`seaweedfs-admin` 對外開 8333／9333／23646，**STG 的 `STORAGE_CONFIG` 指的是 `192.168.50.188:8333`，也就是這組舊的、對外開埠的**，不是 stack 內那台。出貨版 installer 預設指哪一台要確認。
- **主系統 → agent 資料面 :8443 確認存在**：`jedi_detection` 的 `agent_probe_client.py`／`agent_cancel_client.py` 與檔案取回都走這條，mTLS＋短效 JWT。STG 上那台 agent 容器只聽 :8000，是舊版探測容器不是正式部署，不代表產品沒這條。
- **SIEM 轉送是 UDP 明文**：STG 實際設定 udp／192.168.50.150:5140。
- **sandbox 另有一條連到本機 :36029 的連線**，來源未查（可能是模型載入或健康檢查），不影響本圖。
- 老 `postgres`（:25432）、`pgadmin4`（:8086）是基線庫與管理工具，不屬產品。

## 四、下一層

每個核心模組各畫一張 Level 1 DFD，展開該模組內的處理步驟與資料儲存：
檔案上傳下載／證據分類（AI 閘道＋沙箱）／遠端代理程式／弱點檢測整合／登入與權限／雲端硬碟整合／日誌轉送／授權管理。

---

*依據：2026-10-02 對 STG 192.168.50.188 的唯讀盤點（`docker ps`、`docker inspect`、容器內 `/proc/net/tcp`、FE nginx 設定、stack DB `system_configs`／`log_forwarding_settings`／`tenant_detection_tool_configs`、agent 安裝包 compose）。*
