Guidant AI 資安檢視總報告 · 系統資料流(DFD)
把整套產品當一個系統,畫出運作時所有會發生連線的地方——誰發起、連到誰、什麼協定與埠、傳的是什麼資料、怎麼驗身分。這是後續各模組細部 DFD 與威脅建模(STRIDE)的底圖;程式架構本身見架構手冊。依 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 裡的服務怎麼接)→ 對外整合圖兩張(依設定才存在的那些);最後一張是全貌版,只看形狀用。
%%{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
%%{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
%%{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
八種檢測工具全部由代理程式在客戶機房發動,主系統不直接碰任何工具(主系統在雲端或 DMZ,連不到客戶內網的工具伺服器)。差別只在工具在哪裡跑:伺服器型是 agent 連客戶自架的工具伺服器;主機型是 agent 直接連受檢主機、在上面跑;本機型是 agent 自己跑掃描程式。「測試連線」按鈕也是主系統經資料面叫 agent 就近去探。
%%{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
上面四張是閱讀版;這張把全部 27 條線放在同一張,看整體形狀用,細節請回上面四張。
%%{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)。編號一旦給出不再改動,新增連線只往後加。
只列系統運作時會發生的連線;原廠裝機、升級、出包這類維運動作不在本圖範圍。同一張圖、逐條列出,方便對照與之後補「信任邊界」欄。「依設定」=客戶可在系統設定頁開關,沒設就不存在;「必有」=產品一跑起來就有。
guidant_default,不對外開埠)依 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)。
產品把檔案存哪裡由系統設定 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 的注意事項)。
guidant-seaweedfs 與 agent 安裝包的 guidant-agent-seaweedfs,互不相通。另外還有一組舊的 seaweedfs/seaweedfs-admin 對外開 8333/9333/23646,STG 的 STORAGE_CONFIG 指的是 192.168.50.188:8333,也就是這組舊的、對外開埠的,不是 stack 內那台。出貨版 installer 預設指哪一台要確認。jedi_detection 的 agent_probe_client.py/agent_cancel_client.py 與檔案取回都走這條,mTLS+短效 JWT。STG 上那台 agent 容器只聽 :8000,是舊版探測容器不是正式部署,不代表產品沒這條。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)。