docs/features/FR-057-2607-openscap-ssh-connector/design.md(本手冊只講最終行為)檢測工具整合平台讓 Guidant AI 直接調度外部資安檢測工具,目前已上線兩款: OpenVAS(弱點掃描,API 連線)與 OpenSCAP(CIS / STIG 組態合規稽核,SSH 遠端連線)。 稽核任務中的「檢測工具執行」任務按下開始執行後,系統會派工給部署於內網的 Agent 執行掃描, 掃描完成的報告會自動拉回雲端並登錄為該任務的證據,同時附上發現項目統計並寄送通知信給任務負責人; 若任務設定為「自動」完成模式,系統會在證據入庫後自動將任務標記完成, 「人工」模式則保留任務為執行中,等負責人檢視報告後手動按完成。
openscap-scanner、建稽核帳號、佈 SSH 公鑰),詳見 第 5 章。
Agent 本身維持 Docker 形態不變,只是「掃描發起端」——OpenSCAP 的實際掃描引擎在各目標主機上執行,不在 Agent 容器內。
平台維護一份「檢測工具目錄」(目前收錄 OpenVAS、OpenSCAP 兩款)。目錄是 DB 驅動而非程式寫死: 每個工具在目錄中定義工具代碼、顯示名稱、說明、連線類型(API / CLI / SSH)、設定欄位結構(動態表單 schema)、部署前提說明 與平台層總開關。未來新增其他工具(如 Nessus、SonarQube)時,於目錄新增資料並搭配對應 Agent connector 即可, 租戶設定頁與任務參數表單的欄位都會依目錄中定義的欄位結構自動渲染(FE 對工具型別零硬編)。
進入「檢測工具管理」頁面,對要使用的工具點「設定」, 填寫連線資訊後儲存。頁面主要操作:
| 介面元素 | 說明 |
|---|---|
| 啟用檢測工具 | 將該工具在本租戶啟用(未開放的工具顯示「敬請期待」)。 |
| 設定 | 開啟該工具的連線設定表單。表單欄位依工具目錄的欄位結構動態產生,必填欄位未填會提示「{欄位名} 為必填」。 |
| 測試連線 | 工具卡片上的按鈕。以已儲存的設定透過內網 Agent 實際連線工具端驗證(詳見 2.5),回報成功或具體失敗原因。系統會記錄最近一次測試時間與結果。 注意:測的是已存檔的設定值——表單中修改但尚未儲存的內容不會被測到,請先儲存再測試。 |
| 卡片右下角「⋮」選單 | 次要/危險動作收在這裡:部署前提說明(見 2.3)、啟用/停用、重置金鑰。 |
| 停用 | 停用該租戶設定。停用前系統會查詢仍引用此工具的任務數量供確認(軟提醒,不擋)。 |
| 重置金鑰 | 清除已儲存的加密憑證,重新輸入。 |
選 OpenSCAP 按「設定」,表單欄位如下:
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
| 稽核帳號 | 文字 | 必填 | 登入目標主機用的帳號名稱。所有目標主機須用同一個帳號名稱(業界慣例做法,非每台各自帳密)。 |
| 認證方式 | 下拉(密碼 / SSH 私鑰) | 必填 | 二擇一,選擇後會切換顯示對應的密碼或私鑰欄位;建議優先使用 SSH 私鑰(比密碼更安全)。 |
| SSH 密碼 | 密碼 | 條件必填 | 認證方式選「密碼」時才顯示、才必填。 |
| SSH 私鑰 | 多行文字 | 條件必填 | 認證方式選「SSH 私鑰」時才顯示、才必填。貼入完整 OpenSSH PEM 格式私鑰(含 -----BEGIN ... PRIVATE KEY----- 到 -----END ... PRIVATE KEY----- 整段),格式細節見 第 9 章常見問題。 |
| SSH 連接埠 | 數字 | 選填 | 預設 22,目標主機若改了 SSH port 才需調整。 |
| 使用 sudo 提權 | 開關 | 選填 | 預設開啟。完整組態稽核需要 root 級讀取權限,企業普遍禁止 root 遠端登入,故標準做法是「一般帳號 + sudo 提權」而非直接用 root 登入。 |
DETECTION_TOOL_ENCRYPTION_KEY(負責上述加解密,保存在 BE 部署環境、不進版控),它不是掃描工具的帳密。
非機敏欄位(如主機位址、稽核帳號名稱)另存為一般設定值。UI 不會回顯憑證明文——已設定過的機敏欄位會顯示
「••••(已設定,留空不變更)」,留空儲存即代表沿用原值,只有要更換時才需重新輸入。
api_log 對本模組的請求 body 一律遮罩憑證欄位,不落明文(D9)。
儲存設定後建議立即按工具卡片上的「測試連線」確認整條連線鏈路可用。 測試結果(成功 / 失敗)與時間會記錄在該筆設定上,方便日後追查連線狀況。 若測試失敗,請參考 第 9 章常見問題 的排查步驟。
POST /detection/probe)→
Agent 以與真實掃描完全相同的連線方式(OpenVAS 為 GMP over TLS,python-gvm;OpenSCAP 為 SSH 連線)
連上工具端並驗證帳密 → 結果同步回傳。
因此「測試連線成功」代表整條 雲端 → Agent → 檢測工具 鏈路都通,
之後的真實掃描走的就是同一條路(重新執行的取消請求也走同一 mTLS 通道,見 第 7 章)。反過來說,本租戶必須已部署並啟用具備掃描能力
(capabilities 含 detection_scan)的 Agent,測試連線才可能成功;
沒有可用 Agent 時會直接提示,而不是等待逾時。
oscap 指令是否存在 ④ SCAP content 是否齊備——任一段失敗會停在該段並回報明確原因(見第 9 章)。
有部署前提的工具(目前為 OpenSCAP),卡片「⋮」選單會出現「部署前提說明」項,點開後顯示:
視窗內有「複製腳本」按鈕,一鍵把腳本部分(不含說明文字)複製到剪貼簿,可直接貼到目標主機終端機執行。 完整的準備步驟與腳本內容見 第 5 章。
任務類型下拉選擇「檢測工具執行」後,任務卡片會出現 「檢測工具」下拉,列出本租戶已啟用的工具。 未選擇工具無法儲存,系統會擋下存檔。
選定工具後,依工具的參數 schema 填寫掃描參數。OpenVAS 目前的參數如下(表單完全依 BE 回傳的 schema 動態渲染,新增欄位不需要改 FE):
| 參數 | 欄位標籤 | 型別 | 必填 | 說明 |
|---|---|---|---|---|
hosts |
掃描目標(IP/主機,逗號分隔) | text | 必填 | 要掃描的目標主機清單,多個以逗號分隔。未填寫掃描一定失敗。 |
timeout_sec |
逾時秒數 | number | 選填 | 掃描等待逾時秒數,留空使用系統預設(3600 秒)。 |
scan_config_id |
Scan Config UUID(進階,留空用預設) | text | 選填 | 指定 OpenVAS 掃描設定檔 UUID,一般留空使用預設即可。 |
scanner_id |
Scanner UUID(進階,留空用預設) | text | 選填 | 指定 OpenVAS 掃描器 UUID,一般留空使用預設即可。 |
port_list_id |
Port List UUID(進階,留空用預設 All IANA assigned TCP) | text | 選填 | 指定 OpenVAS Port List UUID(v2 schema 新增欄位);留空 Agent 使用預設值。 |
選定 OpenSCAP 後,任務卡片出現以下參數。有預設值的欄位選定工具當下會自動帶入,不會看到空白表單:
| 參數 | 欄位標籤 | 型別 | 必填 | 說明 |
|---|---|---|---|---|
hosts |
掃描目標(IP/主機,逗號分隔) | text | 必填 | 要掃描的目標主機清單,多個以逗號分隔。這些主機都必須已完成第 5 章的部署準備。 |
content_path |
SCAP content 路徑 | text | 選填 預設帶入 |
預設值 /usr/share/xml/scap/ssg/content/(目標主機上 SSG 套件的慣例安裝目錄)。
填目錄路徑(以斜線結尾)時,系統會自動偵測目標主機的作業系統與版本,推斷實際檔名(如 ssg-ubuntu2204-ds.xml);
若無法辨識該主機的作業系統,掃描會給出明確錯誤,此時請改填完整檔案路徑直接指定要用哪份 content。
|
profile |
掃描 Profile | select_or_text(下拉 + 可自由輸入) | 必填 |
下拉列出常用選項(CIS Level 1 Server、CIS Level 2 Server、STIG),也可直接輸入清單外的
xccdf profile id(不同 SSG 版本、不同 OS 支援的 profile 集合不同,實際可用值以目標主機的 content 為準)。
範例值:xccdf_org.ssgproject.content_profile_cis_level1_server。
|
timeout_sec |
逾時秒數 | number | 選填 預設帶入 | 預設 3600 秒,逐台各自計時(多台掃描不是加總共用一個逾時)。 |
oscap info <content 檔案路徑> 查看該份 content 實際支援哪些 profile id,再改用自由輸入填入正確值。
任務卡片的「完成模式」決定掃描結束後任務怎麼收尾:
| 模式 | 介面文案 | 行為 |
|---|---|---|
manual 預設 |
人工(掃描完成後需手動按完成) | 掃描完成、證據入庫後,任務維持執行中(PROCESSING),由負責人檢視報告判斷後再手動按完成。 |
auto |
自動(掃描完成後自動標記完成) | 掃描完成、證據入庫後,系統自動替任務按完成,走既有的任務完成流程。 |
檢測掃描由部署在客戶內網的 evidence-agent(出貨名 guidant-ai-agent)執行,目前部署版本為 0.2.8(已部署 192.168.50.123)。
evidence-agent 以 Docker image 形式出貨,升級方式是在開發機重新 build image 後 docker save / docker load 出貨,
不是在 Agent 主機上 git pull 源碼直跑。
openssh-client 套件(用於 SSH 連線),並確認容器內建有 OpenSCAP connector 程式碼——實際要升級到哪個版號、以哪種方式出貨,請依部署當下的實際版本規劃確認,不要假設沿用舊版號直接覆蓋。
pyproject.toml 的 versionconfig/config.py 的 agent_version 預設值deploy/.env.example 的 AGENT_IMAGEdeploy/docker-compose.yml 的 image: 預設 tagdeploy/docker-compose.yml 的 AGENT_VERSION 環境變數docker builddocker save |ssh … docker loaddeploy/.envdocker compose up -ddetection_scan# 於開發機 evidence-agent repo 根目錄
# 0) 確認在最新 feature/scan-plugin-integration 程式碼上
# 1) Nexus 認證 secret(.secrets/nexus.env 已存在可跳過;帳密查部署文件)
# 內容兩行:export POETRY_HTTP_BASIC_NEXUS_USERNAME=... / export POETRY_HTTP_BASIC_NEXUS_PASSWORD=...
# 2) build 新版 image —— 用 repo 根目錄的 rebuild.sh,IMAGE 版號需與五處版號同步清單一致
IMAGE=guidant-ai-agent:0.2.8 ./rebuild.sh
# 加 --no-cache 可強制全新重建:IMAGE=guidant-ai-agent:0.2.8 ./rebuild.sh --no-cache
# 3) 出貨到 agent 主機 192.168.50.123
docker save guidant-ai-agent:0.2.8 | ssh <user>@192.168.50.123 docker load
# 4) 在 123 上:deploy/.env 改 AGENT_IMAGE=guidant-ai-agent:0.2.8
# (compose 的 AGENT_VERSION 亦已在 repo 內同步更新為 0.2.8)
# 5) 在 123 的 deploy/ 目錄重建 agent 容器
# ⚠️ up -d 必須指定 service 名(guidant-ai-agent)——不帶名會對 compose 內
# 「所有」服務比對重建,同檔的 postgres 資料庫容器會被一併 recreate(無預警重啟)。
# ⚠️ nginx(mTLS 入口)掛在 compose profile "full" 底下,指令仍需帶 --profile full
docker compose --profile full up -d guidant-ai-agent
# 6) 確認容器健康 + 心跳(應見 guidant-ai-agent / agent-db / nginx 三個容器)
docker compose --profile full ps
docker compose logs --tail 20 guidant-ai-agent
remote_agents.capabilities 欄位,
JSON 清單,例如 ["file_storage","detection_scan"]),不是 Agent 心跳自動上報。
掃描工單只會派給 capabilities 含 "detection_scan" 的 Agent。
因此升級重啟後,需請系統管理員在雲端將該 Agent 的 capabilities 設定為包含
detection_scan,該 Agent 才會被派掃描任務。
certs/agent.json 的快取——**改環境變數 AGENT_HEARTBEAT_INTERVAL_SEC 不會立即生效**,需清快取或重新註冊才會套用新值,排查「心跳間隔改了沒反應」時先查這個檔案。
全新安裝(非升級)請參考 evidence-agent 專案內 deploy/README.md 的既有部署流程。
OpenSCAP(oscap)是純 CLI 工具,沒有 server API、沒有常駐服務(daemon)。
組態合規稽核要檢查的是目標主機系統內部的實際狀態(設定檔內容、已裝套件版本、核心參數等),
這類檢查必須以登入身分在目標作業系統上直接執行才能讀到——這是所有組態稽核工具的共同物理限制,不是本平台的取捨或妥協。
業界的官方標準做法是「發起端 SSH 登入目標主機 → 在目標上執行目標自己的 oscap → 把報告拉回」(Red Hat Satellite / Foreman 大規模環境採用同一模式)。
因此使用 OpenSCAP 之前,每一台要掃描的目標主機都需要一次性完成準備:安裝 openscap-scanner 與 SCAP content(SSG)、建立稽核帳號並佈署 SSH 公鑰、視需要開放 sudo 免密執行。
Agent 本身維持既有的 Docker 部署形態不變,只是「掃描發起端」——它透過 SSH 連到目標主機,實際的掃描動作在目標主機上跑,不在 Agent 容器內執行。
openscap-scanner(`oscap` 指令本體)與 SCAP content 套件(Ubuntu/Debian 為 ssg-base + ssg-debderived;RHEL 系為 scap-security-guide)audit-scan,所有目標主機統一使用同一帳號名稱)~/.ssh/authorized_keys/usr/bin/oscap(**不是**開放整台機器 sudo,見 5.4 常見問題)ssg-ubuntu2204-ds.xml 對應 Ubuntu 22.04)。content 版本與目標 OS 不相符時,規則會因平台判定不匹配而全數 notapplicable——掃描看似成功、實際零實質檢查,系統會將該次掃描標示為「無實質檢查」避免誤讀。
目標 OS 較新、官方尚未發布對應 content 時(例:Ubuntu 26.04 目前尚無 ssg-ubuntu2604),該主機暫時無法有效掃描——待官方發布後在目標主機更新 SSG 套件即可,平台與 Agent 皆不需升級。跨 OS 家族借用 content(如以 RHEL content 掃 CentOS / Rocky)為業界合法用法,不在此限。
以下腳本可在檢測工具設定頁的「部署前提說明」視窗(見 2.6)直接複製,貼到目標主機終端機以有 sudo 權限的帳號執行一次即可。兩份腳本邏輯相同,僅套件管理指令不同。
sudo apt update
sudo apt install -y openscap-scanner ssg-base ssg-debderived openssh-server
sudo useradd -m -s /bin/bash audit-scan
sudo mkdir -p /home/audit-scan/.ssh
echo '<貼上本設定使用的 SSH 公鑰>' | sudo tee /home/audit-scan/.ssh/authorized_keys
sudo chown -R audit-scan:audit-scan /home/audit-scan/.ssh
sudo chmod 700 /home/audit-scan/.ssh
sudo chmod 600 /home/audit-scan/.ssh/authorized_keys
echo 'audit-scan ALL=(root) NOPASSWD: /usr/bin/oscap' | sudo tee /etc/sudoers.d/audit-scan
sudo dnf install -y openscap-scanner scap-security-guide openssh-server
sudo useradd -m -s /bin/bash audit-scan
sudo mkdir -p /home/audit-scan/.ssh
echo '<貼上本設定使用的 SSH 公鑰>' | sudo tee /home/audit-scan/.ssh/authorized_keys
sudo chown -R audit-scan:audit-scan /home/audit-scan/.ssh
sudo chmod 700 /home/audit-scan/.ssh
sudo chmod 600 /home/audit-scan/.ssh/authorized_keys
echo 'audit-scan ALL=(root) NOPASSWD: /usr/bin/oscap' | sudo tee /etc/sudoers.d/audit-scan
<貼上本設定使用的 SSH 公鑰> 是佔位文字,請換成 Guidant AI 設定頁對應的公鑰(與設定頁填入的私鑰成對)。若採密碼認證則不需要這一步,改確認該帳號密碼已知並在設定頁填入即可(仍建議優先使用金鑰)。
/usr/bin/oscap 這一個指令(NOPASSWD: /usr/bin/oscap),不是給予該帳號整台主機的 sudo 權限——即使帳號密碼外洩,攻擊者也只能免密跑這一個掃描指令,無法用它任意提權執行其他指令。AutoAddPolicy),不會因為未知 host key 而擋下連線,也不會人工介入核對指紋。這是第一版的已知取捨,未來若有更高安全要求可考慮改為預先核對指紋的嚴格模式。在任務的執行抽屜中可進行以下操作:
| 介面元素 | 說明 |
|---|---|
| 開始執行 / 重新執行 | 尚無執行紀錄時顯示「開始執行」;已有紀錄時顯示「重新執行」。行為細節見 第 7 章。 |
| 執行紀錄({count}) | 執行歷史區塊,最新在上(BE 依 started_at DESC 排序);區塊本身可收合,標題列可點擊切換,chevron 圖示反映開合狀態。 |
| 區塊預設展開 / 收合 | 有執行中的紀錄、或最新一筆是失敗時預設展開(使用者正在等結果 / 需要看錯誤);其餘情況預設收合,避免佔版面。 |
| 執行狀態 | 每筆紀錄有四種狀態:執行中、成功、失敗、已取消(見 第 7 章)。失敗紀錄會保留錯誤訊息,任務仍為 PROCESSING 可重試。 |
| 發現 {count} 項 | 成功紀錄顯示本次掃描的發現項目統計(讀取自 summary.findings,該欄位同時含 critical / high / medium / low / log 細項)。 |
| 下載報告 |
下載該次執行的掃描報告。OpenVAS 為 PDF 格式(Greenbone 排版的完整弱點掃描報告),一次執行一份;
OpenSCAP 為 HTML 格式(oscap 官方人讀報告),逐台目標主機各一份——多台掃描時「下載報告」會列出該次執行所有目標主機各自的報告,逐份下載,不會只給一份。
多次執行的報告各自獨立、各自可下載。
|
OpenVAS掃描報告_192.168.50.151_20260727.pdf、OpenSCAP 的 OpenSCAP掃描報告_192.168.50.151_20260729.html,方便直接辨識內容,不需點開才知道是什麼。「重新執行」的行為依上一次執行是否還在進行中分岔,目的是避免同一個目標被疊出兩個並行掃描(互相干擾、拖慢,甚至產生兩份重複報告)。
按「重新執行」(或首次「開始執行」)時,若目前沒有任何執行中的紀錄,系統直接派出新工單,跟以往行為一致,不會額外跳出確認視窗。
確認後,系統不是只在畫面上假裝取消——會透過既有的雲端 → Agent mTLS 通道發出取消指令,把該掃描真正停下來(OpenVAS 呼叫官方的 stop_task;OpenSCAP 終止當下正在跑的 SSH 子行程),確認停止成功後,才標記舊執行紀錄為「已取消」並派出新的工單。
按「取消」則什麼都不會發生,維持原狀。
nc -zv <openvas-host> 9390 應回報連線成功。docker ps 檢查容器 port 對映是否有 9390,沒有就要調整 compose 設定把 GVMd TLS port 對外。AGENT_IMAGE → docker compose up -d),且雲端該 Agent 的 capabilities 已含 detection_scan。http:// 前綴)→ 顯示「連線成功」。Target exists already。openscap-scanner 時測試連線(probe)應明確回報「未安裝 openscap-scanner」,而非籠統的連線失敗或逾時。content_path 推斷失敗)時測試連線應明確回報「缺少 SCAP content」,並提示改填完整檔案路徑。NOPASSWD: /usr/bin/oscap → 掃描該台應失敗並回報可辨識的權限錯誤,不影響其他台的掃描結果。測試連線走 雲端 → Agent → 檢測工具 兩段鏈路(見 2.5),依失敗訊息分段排查:
detection_scan 的 Agent——先完成第 4 章的 Agent 部署與雲端 capabilities 設定。/detection/probe、/detection/cancel 等端點),需照第 4 章重 build 升級。authorized_keys。nc -zv <openvas-host> 9390 確認可達;OpenSCAP 確認目標主機的 SSH port(預設 22)對 Agent 主機可達、防火牆未擋。content_path 指向的路徑 / 推斷出的檔名不存在——確認套件已裝,或改在任務參數改填完整檔案路徑。certs/agent.json 快取(見第 4 章)。detection_scan,否則工單永遠派不出去。oscap 程序是否卡住(大範圍組態掃描本來就耗時,可視情況調大 timeout_sec,預設 3600 秒)。Target exists already?-----BEGIN OPENSSH PRIVATE KEY-----(或 RSA PRIVATE KEY 等變體)到結尾的 -----END ... PRIVATE KEY----- 整段,中間不可缺行、不可只複製部分內容。.pub 檔內容,通常以 ssh-rsa/ssh-ed25519 開頭且是單行)、或私鑰本身有密碼保護(connector 目前不支援輸入私鑰密碼,需使用未加密的私鑰)。ssh -i <私鑰檔> audit-scan@<目標主機> 在本機測試該私鑰是否能正常登入,確認無誤後再貼進設定頁。ssg-base/ssg-debderived;RHEL 系為 scap-security-guide)。ls /usr/share/xml/scap/ssg/content/ 確認 content 檔案是否存在;若目標主機的作業系統不在系統支援的自動推斷清單內(少見的發行版或版本),任務參數的 content_path 需改填該主機上實際的完整檔案路徑。ssg-ubuntu2604),安裝 SSG 套件也不會有對應檔案——該主機暫時無法有效掃描,待官方發布後更新套件即可,平台不需任何升級。請勿硬指定舊版 content 掃新版 OS:規則會全數 notapplicable,系統會標示「無實質檢查」。