跳轉到

Guidant AI v1.16.0 Release Note

項目 內容
版本 1.16.0(功能版號;主軸=檢測能力往「多網段、多工作」擴張——檢測 Agent 出貨形態落地+一次執行派多台 agent)
發布日期 2026-08-26
上一版本 1.15.0(2026-08-19)
涵蓋區間 2026-08-19 ~ 2026-08-26(c8498d50..feature/FR-067 HEAD)
涵蓋需求 FR-066 檢測 Agent 安裝包(Nuitka 編譯 agent/compose 一顆包通吃/互動安裝程式/儲存三型+恢復出廠/兩本客戶手冊;Windows 評估與凍結)+ FR-067 檢測多 Agent 分派(一次執行派多台 agent、每列自足的工作設定、群組化彙總與收口、per-assignment 排程、單組重跑/取消)+ 期間驗收修正
規模 BE 88 commits(feat 18/fix 13/docs 57);FE 24 commits(feat 14/fix 10);evidence-agent 0.2.27 → 0.2.30;DB migration 7 支
適用部署 dev(已驗)+ 188 落地版 stack(安裝包形態,已跑最新 code);STG 未上版POC 為全新安裝走安裝包(見 §5)
部署性質 含 7 支 DB migration(安裝包形態的 stack 已全套、老 25432 DEV 庫已套;POC 全新安裝由安裝包依 manifest 套用,不需手動補)。檢測 Agent 出貨形態改為 compose 一顆包(原生 tarball 開發完成但暫不出貨)。Windows agent 全線凍結

0. 發版前回歸 gate

本版未執行 site-regression 自動 Core gate(決策者明示豁免)。放行依據為 188 落地版驗收 stack 的多輪端到端實測——FR-067 於 2026-08-24 完成雙 agent 雙網段端到端驗收第一輪(六張回饋卡全清),其後續輪修正與 FR-067.8 每列自足模型皆在同一 stack 上重布複驗(CM-1384/CM-1394 兩次重布);FR-066 則在 188(build)/123(真機)/190(agent 驗收)/191(落地版 PRD 驗收)四台上分階段實測。自動化 gate 待落地版 E2E 套件補齊後於後續版本恢復。


1. 概述

v1.15.0 解決的是「產品怎麼交到客戶手上」;v1.16.0 解決的是「客戶裝好之後,檢測能力怎麼覆蓋整個環境」

兩個需求構成一條線:

  1. FR-066:檢測 Agent 自己也變成一顆客戶裝得起來的包——編譯出貨、一鍵安裝、內建儲存、可恢復出廠。每個網段擺一台 agent 這件事,從此不需要原廠工程師到場。
  2. FR-067:平台端能一次把工作派給多台 agent——一個檢測任務裡設好「哪台掃哪些目標、用什麼參數、幾點開跑」,按一次執行同時派出,全部回報完才算完成,失敗的那台可單獨重跑。多網段隔離環境(辦公網/機房網/DMZ)從此一個任務就掃得完。

在此之前,一次執行只派一台、而且是系統隨手挑的(不看在線狀態,挑到離線機就永遠掛在待領取);要掃三個網段只能開三個任務人工湊。


2. 重點新功能

2.1 FR-067 檢測多 Agent 分派(本版主軸)

每列自足的工作設定。任務設置的檢測工具區改成一份「Agent 工作指派」清單,每列=一台 agent + 該工具的完整參數表單(掃描目標/Profile/連線方式/認證資訊等)。任務層只保留「完成模式」。這個形狀取代了原本「任務層共用參數+分派列逐鍵覆寫」的模型——覆寫模型每開一個欄位就多一條「留空沿用什麼」的說明,使用者看一列要心算兩層合併;而且 SonarQube 的多模式(pull/scan/upload)在單一任務層 scan_mode 之下根本表達不了「一列 pull、一列 upload」。業界主流(Nessus/Qualys/AWX/防火牆規則表)的形狀正是「每條工作規格自足、重用靠引用庫」,我們的 Profile 庫(FR-059)就是那個可重用參數包。

配套:每列「複製此列」鈕、新增列預設帶第一列的值(密碼類欄位刻意不抄,避免誤顯示「已設定」而存進空密碼);密碼類參數跟著列走(DB 密文、API 剝除、畫面顯示「已設定」)。

掃描目標支援 CIDR 與範圍寫法10.1.0.0/2410.1.0.5-20 這類寫法會依工具分流展開——逐台登入型工具(OpenSCAP/CINC)展開成逐台,原生支援網段的工具(Nmap/OpenVAS)原樣傳下去。畫面同時顯示台數與原始寫法,讓使用者知道「這一列實際會掃幾台、真正被掃的是什麼」。

執行群組(group)與彙總收口。按一次「開始執行」展開成 N 筆執行紀錄(維持既有「一筆執行=一張工單」1:1 不變),外面包一層群組做彙總:

  • 群組內全部回報完才算這次執行完成——自動完成任務、通知信、彙總狀態三件事都上移到收口時做。
  • 彙總語意:全成功→成功;有失敗但無執行中→部分失敗(沿用既有黃色語彙,一眼看出「有掃到但不完整」);全失敗→失敗;取消比照失敗。
  • 自動完成只認全部成功——部分網段沒掃到,任務不該自動關。
  • 順帶修掉現況「多筆各自觸發完成撞任務狀態 409、agent 收 5xx」的地雷(收口改列鎖)。

執行前逐台驗證。派工前逐列檢查 agent 存在/啟用/未撤銷/有掃描能力/在線,任一不過整次擋下並一次列出所有不合格機與原因(甲機(offline); 乙機(no_capability))。理由是部分派出=部分網段被跳過、結果殘缺卻顯示「完成」,比不派更糟。

單組重跑與取消。失敗那一組可單獨重跑(同群組追加一筆、彙總以每組最新一筆計算),不必整組重掃。重跑前置在本版收窄到該組自己的最新一筆是失敗/已取消即可——原本要求整個群組都不在執行中,會讓 30 秒就失敗的組乾等一小時的慢組。另有單組取消與整組取消(整組取消為 best-effort,打不到的 agent 不會讓整次操作報錯)。

per-assignment 排程執行。每組可設「幾點才開跑」(不同網段常有不同維護窗,半夜才能掃機房網)。實作形狀是「群組照常立即建,延後的是 agent 領得到單的時間」——心跳領單查詢加時間條件,沒到時間的單 agent 看不到;不需背景排程器。排程中的組可「立即開始」催跑,也可直接取消(單還沒被領走,不打 agent)。⚠️ 前端送值須帶時區位移(2026-08-25T02:00:00+08:00),不帶會被當 UTC。

執行紀錄與通知的呈現。執行紀錄改群組卡片:彙總徽章 + 每台一列(agent 名稱/掃描目標/狀態/報告),重跑歷史收合;舊資料單筆自成一組,形狀一致不需分叉。通知改成收口發一封彙總,內含每台一列(agent/目標/狀態/發現數/時間),取代原本 N 台 N 封的轟炸。

連帶地基修補:Agent 清單 API 補上能力與在線狀態並可依能力過濾(下拉才列得出「能掃描的」);自動挑機改為只挑在線的;「測試連線」可指定 agent,確保測通的那台就是實際執行的那台。

2.2 FR-066 檢測 Agent 安裝包

出貨形態=compose 一顆包通吃。Agent 改 Nuitka 編譯(原始碼不可見),外部檢測工具全部包進同一顆 tarball 離線自足,配互動安裝程式(照主產品模式問答引導,客戶不需自己下 docker 指令)。原生 systemd 版本已完整開發並在真機驗過,但決策裁定現階段一律出 compose 版,原生成果保留待封閉網路/無 docker 客戶出現時解凍。

三容器縮成單一服務:agent-db(postgres)退役換 SQLite;nginx mTLS sidecar 退役,agent 自行以 gunicorn/ssl 起 8443 雙向認證。註冊流程全自動、首次連線信任雲端自簽憑證。

機器指紋二源化:改為 sha256(product_uuid|machine-id),MAC 退場(容器內讀不到或會漂移);撞號防護搬到平台註冊端。

內建儲存與恢復出廠:安裝包內含 SeaweedFS,可切換為自有 S3 或本地目錄;出廠設定快照可一鍵恢復。升級一條指令(install.sh --upgrade),資料與憑證不動。

兩本客戶手冊:落地版安裝手冊(docs/user-manual/onprem/,11 章)與檢測 Agent 安裝手冊(docs/user-manual/agent/,11 章),全書白話化改寫,隨包出貨。

Windows 支援凍結:三條路線(Docker Desktop/原生服務版/WSL 常駐)經真機實測後全線凍結——Docker Desktop 的 engine 綁登入 session,使用者登出就全滅,無人值守出貨不可行;WSL 路線的虛擬機閒置 60 秒即凍結使用者空間。評估與實測資產留檔待客戶訊號。現行掃 Windows 的解答是:Linux agent 透過 WinRM 遠端掃(既有功能)。

2.3 主產品側的連帶修補(FR-065/FR-066 期間)

  • 系統設定四頁守門:非超級管理員一律 403,route 守門改按分頁式能力點分流。
  • 儲存設定「恢復系統內建儲存」:安裝器出廠快照 + 後端一鍵恢復端點 + 前端按鈕。
  • 心跳自報能力:agent 心跳帶回自己的能力清單(原本只在註冊時寫一次,手動開通的能力會永久消失)。
  • DB 初始化基線補漏stage_objects 全缺、水位哨兵、時區釘死;檢測 Profile 庫改「裝好就有」。

3. 重要修補

  • 執行紀錄整批從畫面消失:舊資料筆的卡片分組鍵與「最新一筆」判定鍵不同步,導致同一任務下所有舊筆被視為同一條分組線、只有最新那筆被標為當前;每張卡又各自成卡,於是除最新那張外每張卡都是「零當前列+一列歷史」,前端預設收合歷史之下整包稽核紀錄從畫面消失(實測 10 筆只顯示得出 1 筆)。修法為抽出共用的卡片鍵函式,並補回歸測試鎖住「每張卡至少一列當前」的不變量。
  • 時區基準分流:agent 心跳統一寫 UTC、公告日期用營運時區;既有 last_seen_at 以 migration 換算(原本存的是容器本地牆鐘,修正後會被判成「未來時戳」而誤判離線)。
  • 落地版 Office 檔 PDF 預覽 500:唯讀 rootfs 撞上相對路徑的 static folder。
  • 指紋撞號守門對複製機失效:豁免條件改看「是否憑 uid 認出」而非「是否 resolve 到同一列」。
  • 文件站死連結歸零:站內 .md 互連在渲染層改寫為 .html;使用手冊分組補兩頁。
  • 前端零星修補:重跑歷史收不起來(v-show 被 PrimeFlex 的 !important 壓過)、排程小日曆時間調不上去、Agent 分派空列改為儲存擋下+必填紅框(原本靜默丟棄)、單一目標型工具不再顯示多餘的掃描目標欄。

4. Breaking Changes

  • 檢測工具任務設置的參數形狀改變(FR-067.8):任務層共用掃描參數區收掉,參數改落在每個分派列上。存量綁定的讀取端會合成一列顯示(把原本隱含的單組 fallback 顯性化),使用者第一次存檔時真正落庫;不做資料庫層 backfill。前端讀任務層參數的四處(上傳模式判定、檢測設定顯示、執行主機與掃描目標清單)已改讀各分派列。
  • 執行 API 回傳形狀改變POST /detection-tools/jobs/{job_uid}/execute{group_uid, status, total_count, executions:[...]},不再是單筆的 {agent_task_uid, execution_uid}
  • 執行紀錄 API 改兩層形狀GET /detection-tools/jobs/{job_uid}/executionsdata 為群組陣列(群組 → 各台執行紀錄);舊資料以 is_legacy: true 單筆自成一組,形狀一致。
  • 同一綁定下不再限制一台 agent 只能出現一列(拿掉唯一約束,重複判準改為後端驗證層看「agent+掃描目標」整組)。
  • 檢測 Agent 出貨形態變更:新客戶一律 compose 版安裝包;原生 systemd 形態暫不出貨。既有部署不受影響。

5. DB Migration(7 支)

檔名 內容
2026-08-18-cm1283-smtp-ldap-capability-delegation.sql SMTP/LDAP 能力點下放給業務租戶(is_platform 翻轉)
2026-08-20-cm1317-remote-agents-last-seen-at-utc-backfill.sql remote_agents.last_seen_at 既有值由容器本地牆鐘換算成 UTC(冪等)
2026-08-23-fr067-2-detection-multi-agent-tables.sql 檢測多 Agent 分派資料層:assignment 子表+執行群組表+執行紀錄擴欄補索引
2026-08-24-fr067-7-per-assignment-scheduling.sql per-assignment 排程:子表與工單加 scheduled_at、執行紀錄新增 scheduled 語意、領單部分索引
2026-08-24-fr067-5-profile-field-select-only.sql openscap/inspec/gcb 的 Profile 欄位由可手填改為純下拉
2026-08-24-fr067-5-drop-jedta-agent-unique.sql 拿掉「同綁定同 agent 只能一列」的唯一約束
2026-08-25-fr067-5-scan-target-syntax-hint.sql 掃描目標欄補 CIDR/範圍寫法說明(依工具展開方式分流措辭)

前兩支(cm1283cm1317)產生於 v1.15.0 之後、本版之前,實際已套用但先前漏登記於 scripts/sql/manifest.tsv,本版補登。安裝包依 manifest 套增量,漏登會讓全新安裝默默少套。

套用狀態:188 落地版 stack(安裝包形態)已全套;老 25432 DEV 庫已全套。STG 未上版POC 為全新安裝——走安裝包由 manifest 依序套用,不需手動補。


6. 相依套件版本

套件 版本 變更
evidence-agent 0.2.30 重新註冊(re-enroll)支援+錯誤輸出改走 stderr;累計自 0.2.27(SQLite 化/自起 mTLS/指紋二源/compose 一顆包)
jedi-common 0.0.31 session_scope() 依方言判斷 SET LOCAL(SQLite 化前置;PostgreSQL 路徑行為恆等)
jedi-file-upload 0.0.22 未變
jedi-project 0.0.8 未變
jedi-oscal-v2 2.2.3 未變
jedi-auth 0.1.34 未變

主專案 pyproject.toml 未變更 jedi-* pin(jedi-common 0.0.31 供 evidence-agent 使用)。


7. 部署順序(既有環境)

  1. 套用 §5 migration(安裝包形態由 install.sh --upgrade 依 manifest 自動套;手動環境依 sql-migration skill 流程)
  2. 部署 BE
  3. 部署 FE(版號同步 1.16.0)
  4. 檢測 Agent 升級至 0.2.30(install.sh --upgrade,資料與憑證不動)
  5. 驗證:任務設置的 Agent 工作指派清單、執行紀錄群組卡片、Agent 清單的在線狀態

8. 已知 follow-up

項目 卡號 說明
FR-067 收尾棒(.6) CM-1356 系 e2e 測試(test repo)+ SPEC 三頁 html build 與查漏
Windows 無域環境掃描憑證 待開卡 無網域(workgroup)機器的同名本機帳號需逐台建、且有 UAC token filter 限制;現行憑證為租戶層單組,多網段無域場景不成立。方向:手冊寫明前置 + 憑證組別擴成可多組並支援 per-列指定
OpenSCAP content 平台派發 待開卡 content 檔目前逐台手放,50 台客戶無法維運;方向為沿 FR-059 的 file 型 profile 派發機制擴到 openscap
註冊 token 端點路徑重複 待開卡 回傳值已含 /api/1.0,agent 端再自補一次導致 404
掃描設定下放指派人員 等 PM 治理面(工具/基準/完成模式)由 PM 設定,操作面(目標機器/憑證)由指派人員在任務頁補
Windows agent 全線 CM-1336~1345(暫緩) D19 凍結,資產保留待客戶訊號
PROD 簽章鑰 現有安裝包皆為內部測試包(--skip-prod-key-check),正式交付前必辦
儲存後端遷移工具 CM-1279 切換 storage 時搬移既有檔案(沿自 v1.15.0)

9. 相關文件索引

  • FR-066:docs/features/FR-066-2608-agent-native-installer/(design.md D1~D19 決策鏈;handoff/ STATE+LOG+全案 SUMMARY;Windows 三份實測報告)
  • FR-067:docs/features/FR-067-2608-detection-multi-agent-dispatch/(design.md §3 決策定案 D1~D10、§5.10 每列自足模型、§6 拆分;handoff/ STATE+LOG)
  • 客戶安裝手冊:docs/user-manual/onprem/(落地版主產品)/docs/user-manual/agent/(檢測 Agent)
  • 檢測工具使用指南:docs/user-manual/detection-tools-guide.md
  • 頁面 SPEC:docs/specs/v1.16.0/(本版凍結快照)/docs/specs/current/(持續更新)