---
title: SR-09 代理程式專章
eyebrow: Guidant AI 資安檢視總報告 · 安全需求（SR）
h1: SR-09 代理程式專章
subtitle: 裝在客戶機房的那台機器
lede: 代理程式（agent）裝在客戶機房，手上有客戶主機的維運帳密、能對內網發掃描流量。這一章 **7 條**是它特有的要求：誰能派工、資料面只對雲端開、證據的可信副本在雲端、規則包的信任根、容器隔離、受檢主機帳號、掃描前確認目標。2 條有掃描實例、5 條是標準做法。
chips:
  - { text: "7 條", kind: accent }
  - { text: "掃描驗證 2", kind: ok }
  - { text: "標準做法 5", kind: plain }
---

> 讀法見[總表](SR-00-overview.html)。每條六欄：要求／為什麼／適用連線／對應威脅／驗證方式／來源。現況不在這裡，看[符合性矩陣](SR-matrix.html)。

## 這一章管什麼

代理程式與一般 web 後端不同：它**在客戶的內網裡**，所以被冒充的後果不是資料外洩而是「替攻擊者打內網」；它**手上有明文維運帳密**，所以它的環境（容器、暫存、主機帳號）要一併守；它產出的**證據要進稽核**，所以可信副本不能只留在它自己的磁碟。身分驗證、傳輸安全這類通用要求（如機器身分、憑證驗證）仍歸通用章，本章只放代理程式特有的。

| # | 要求 | 來源 |
|---|---|---|
| SR-09.1 | 誰能派工、取消、重派、刪紀錄在畫面那頭就守住 | 掃描驗證 |
| SR-09.2 | 資料面 :8443 只對雲端開，demo 模式不得進正式部署 | 標準做法 |
| SR-09.3 | 證據的可信副本在雲端；agent 側 S3 不誇稱不可竄改 | 標準做法 |
| SR-09.4 | 規則包完整性有信任根，url 型與 file 型走同一條路 | 掃描驗證 |
| SR-09.5 | agent 容器非 root、能力全拿掉、有資源上限；沙箱 image 有版本有簽章 | 標準做法 |
| SR-09.6 | 受檢主機用 agent 專用最小權限帳號，sudoers 只白名單 | 標準做法 |
| SR-09.7 | 掃描前明示目標，外部位址額外確認，文件說清掃描就是攻擊流量 | 標準做法 |

---

## SR-09.1 誰能派工、取消、重派、刪紀錄在畫面那頭就守住 {#sr-09-1}

| 欄位 | 內容 |
|---|---|
| **要求** | 發動掃描、取消、重派、刪執行紀錄、測試連線這類會讓 agent 動手的操作，**必須**在 api 層就只放行「任務被指派人」與「專案管理者」；**不得**只確認呼叫者是專案成員就放行；守門**必須**在派工單寫進資料庫之前 |
| **為什麼** | 唯讀角色按「開始掃描」，派工單寫進資料庫，agent 下次心跳就領走並帶著客戶主機帳密連進正式機器；反覆取消再重派則讓正常檢測永遠跑不完、執行紀錄被改 |
| **適用連線** | [C20](../connections/C20-agent-to-frontdoor.html) agent → 主系統前門、[C21](../connections/C21-api-to-agent-dataplane.html) api → agent 資料面（:8443） |
| **對應威脅** | C20 [T3 從畫面那頭發動——不該動手的人派出帶帳密的掃描](../connections/C20-agent-to-frontdoor.html) 🟡、C21 [T4 不該動手的人取消或干擾正在跑的掃描](../connections/C21-api-to-agent-dataplane.html) 🟡 |
| **驗證方式** | 以專案唯讀成員身分對發動、取消、重派、刪紀錄各端點送請求，必須全被拒且資料庫不得出現新派工單；以非被指派人的一般成員取消他人的掃描必須被拒；被指派人與專案管理者同樣操作必須成功 |
| **來源** | 掃描驗證：C21 D4（實例 [M03-14](../STRIDE/E-elevation-of-privilege.html#m03-14)）；標準做法：C20 D5◇ |

## SR-09.2 資料面 :8443 只對雲端開，demo 模式不得進正式部署 {#sr-09-2}

| 欄位 | 內容 |
|---|---|
| **要求** | agent 資料面 :8443**必須**只對雲端開：客戶防火牆只放行雲端來源 IP，安裝文件**必須**明寫；demo 模式（`AGENT_AUTH_MODE=none`，裸 http、不驗任何東西）**不得**出現在正式部署，**必須**由啟動期檢查擋下（正式設定下偵測到 none 即拒絕啟動） |
| **為什麼** | 同一內網的人（或客戶不慎把 8443 開到公網）連得到 :8443 時，若再配上 demo 模式，就能直接叫 agent 替他敲內網任何主機、取走暫存的掃描報告 |
| **適用連線** | [C21](../connections/C21-api-to-agent-dataplane.html) api → agent 資料面（:8443） |
| **對應威脅** | C21 [T1 冒充雲端打進客戶機房](../connections/C21-api-to-agent-dataplane.html) 🔴 |
| **驗證方式** | 從非雲端來源 IP 連 :8443 必須被防火牆擋下；在正式設定下設 `AGENT_AUTH_MODE=none` 啟動 agent，必須拒絕啟動並輸出明確錯誤；檢查安裝文件必須有「只放行雲端來源 IP」的明文步驟 |
| **來源** | 標準做法：C21 D6◇、C21 D7◇ |

## SR-09.3 證據的可信副本在雲端；agent 側 S3 不誇稱不可竄改 {#sr-09-3}

| 欄位 | 內容 |
|---|---|
| **要求** | 掃描完成的回報一到，雲端**必須**立即經資料面取回證據檔、計算 sha256 並落庫，之後 agent 側的檔只是備份；取回失敗**必須**告警；agent 側 S3 若要對客戶宣稱證據不可竄改，**必須**開 Object Lock（COMPLIANCE 模式）加版本控制並在寫入時設 retention，桶本身的刪除也要擋；未開時文件**必須**誠實，**不得**宣稱 WORM 或不可刪，要說清楚「可信副本在雲端、agent 側是暫存」 |
| **為什麼** | 在 agent 主機上拿到 root 的人（客戶自己的維運或入侵者）可以覆寫報告把「3 個高風險」改成「0 個」，沒有版本與鎖時覆寫不留舊版、刪除不留紀錄；若雲端還沒取回，取回時算的 sha256 錨的就是假檔；稽核場景裡期望落差比技術漏洞更傷 |
| **適用連線** | [C22](../connections/C22-agent-to-seaweedfs.html) agent → SeaweedFS |
| **對應威脅** | C22 [T1 主機擁有者或拿到主機 root 的人，改掉或刪掉證據，不留痕](../connections/C22-agent-to-seaweedfs.html)（無掃描實例） |
| **驗證方式** | 觸發一次掃描完成，在 agent 回報後的短時間內，雲端資料庫必須已有該檔的 sha256 且檔案可由雲端下載；模擬取回失敗必須產生告警；若宣稱 WORM，對已寫入的物件執行覆寫與刪除必須被拒；若未開 Object Lock，全部對外文件不得出現「不可竄改」「WORM」字樣 |
| **來源** | 標準做法：C22 D3◇、C22 D2◇、C22 D5◇ |

## SR-09.4 規則包完整性有信任根，url 型與 file 型走同一條路 {#sr-09-4}

| 欄位 | 內容 |
|---|---|
| **要求** | 規則包完整性**必須**有信任根：file 型**必須**帶 sha256、對帳不符即失敗；url 型**必須**由 agent 端比對雲端下發的指紋，且 url 型也走 agent 自己的下載器（**不得**交給 cinc-auditor 自己去抓），流程與 file 型同一條：下載 → sha256 對帳 → 安全解壓 → 餵目錄給引擎 |
| **為什麼** | 規則包是 InSpec 的 Ruby DSL，載入即執行。攻擊者在 agent 下載路徑上換掉規則包（或網址主人事後換內容），agent 就在客戶內網以容器身分執行任意程式碼，並用客戶主機帳密跑假檢查、報告一起造假；雲端下發了指紋而 agent 不比，等於沒有 |
| **適用連線** | [C23b](../connections/C23b-agent-local-processes.html) agent 本機程序、[C24](../connections/C24-agent-to-profile-url.html) agent → 規則包網址；推及：[C19](../connections/C19-api-to-profile-url.html) api → 規則包網址（雲端側下發指紋） |
| **對應威脅** | C23b [T1 規則包裡藏程式，在 agent 容器裡以 root 執行](../connections/C23b-agent-local-processes.html)（無掃描實例）、C24 [T1 在下載路徑上換掉規則包——不加密連線不用破解，加密連線也沒人比指紋](../connections/C24-agent-to-profile-url.html) 🟡、C24 [T2 網址的主人事後換內容——雲端看到的是 A、agent 跑的是 B](../connections/C24-agent-to-profile-url.html)（無掃描實例） |
| **驗證方式** | 對 file 型規則包改一個位元組後派工，agent 必須在對帳階段失敗且不執行；對 url 型規則包在雲端抽取後換掉網址上的內容，派工後 agent 必須因指紋不符而中止；以抓包確認 url 型規則包是由 agent 下載器取得而非 cinc-auditor 直接連網址 |
| **來源** | 掃描驗證：C24 D2（實例 [M03-5](../STRIDE/E-elevation-of-privilege.html#m03-5)）；標準做法：C23b D1◇ |

## SR-09.5 agent 容器非 root、能力全拿掉、有資源上限；沙箱 image 有版本有簽章 {#sr-09-5}

| 欄位 | 內容 |
|---|---|
| **要求** | agent 容器**必須**以非特權帳號執行（`USER` 非 root）、`cap_drop: ALL`、`no-new-privileges`、設記憶體與 pids 上限；沙箱 image 是出貨包的一部分，**必須**有版本與簽章，啟動前**必須**驗簽 |
| **為什麼** | 容器是 root 時，規則包裡的程式碼拿到的是整個容器（含所有憑證與 S3 金鑰），再拿憑證冒充這台 agent；沒有記憶體上限時，超大源碼或炸彈讓其他掃描與心跳一起死；image 沒有簽章則供應鏈被換掉無從察覺 |
| **適用連線** | [C23b](../connections/C23b-agent-local-processes.html) agent 本機程序、[C08](../connections/C08-worker-to-sandbox.html) worker → 沙箱（拆檔） |
| **對應威脅** | C23b [T1 規則包裡藏程式，在 agent 容器裡以 root 執行](../connections/C23b-agent-local-processes.html)（無掃描實例）、C23b [T3 特製壓縮包或巨型 repo 把 agent 主機撐爆](../connections/C23b-agent-local-processes.html)（無掃描實例） |
| **驗證方式** | 在 agent 容器內執行 `id` 必須非 root；檢查容器設定必須有 `cap_drop: ALL`、`no-new-privileges` 與記憶體、pids 上限；以未簽章或被改過的沙箱 image 啟動必須被拒 |
| **來源** | 標準做法：C23b D2◇、C08 D6◇ |

## SR-09.6 受檢主機用 agent 專用最小權限帳號，sudoers 只白名單 {#sr-09-6}

| 欄位 | 內容 |
|---|---|
| **要求** | 受檢主機上**必須**使用 agent 專用帳號，**不得**用一般維運帳號；該帳號的 sudoers **只能**白名單必要的二進位（如 oscap、nmap 等實際用到的）；安裝與客戶部署文件**必須**指引客戶這樣建立帳號 |
| **為什麼** | 帳號權限過大時，目標主機一被入侵或 agent 一被冒充，攻擊者拿到的是客戶能 sudo 的維運帳密，可登進真正的主機做任何事；最小權限讓後果縮小到那幾支二進位 |
| **適用連線** | [C23](../connections/C23-agent-to-target-host.html) agent → 受檢主機 |
| **對應威脅** | C23 [T1 連到哪由呼叫者填——代理程式替人敲遍內網](../connections/C23-agent-to-target-host.html) 🟡、C23 [T3 受檢主機被入侵後，反過來打代理程式](../connections/C23-agent-to-target-host.html)（無掃描實例） |
| **驗證方式** | 以 agent 帳號登入受檢主機，執行白名單外的特權指令（例如 `sudo bash`）必須被拒；檢查 sudoers 內容只含必要二進位；檢查部署文件必須有建立專用帳號與 sudoers 範例 |
| **來源** | 標準做法：C23 D6◇ |

## SR-09.7 掃描前明示目標，外部位址額外確認，文件說清掃描就是攻擊流量 {#sr-09-7}

| 欄位 | 內容 |
|---|---|
| **要求** | 掃描前畫面**必須**明示「將對以下 N 台／網址發送掃描流量」並列出完整目標；目標含外部位址（非 RFC1918）時**必須**額外確認；文件與畫面**必須**說清楚「掃描就是攻擊流量」，客戶要先與自己的資安團隊與網管協調（IDS 白名單、掃描窗口），掃外部目標要有書面授權 |
| **為什麼** | ZAP 或 Nmap 的目標填成競爭對手或第三方網站時，客戶變成攻擊來源，法律與聲譽後果落在客戶頭上；掃描流量也可能被客戶自己的 IDS／EDR 判成橫向移動而封鎖執行主機，檢測自我停擺 |
| **適用連線** | [C25](../connections/C25-engine-to-targets.html) 掃描引擎 → 目標 |
| **對應威脅** | C25 [T1 拿客戶的掃描器當武器打第三方](../connections/C25-engine-to-targets.html)（無掃描實例）、C25 [T2 掃描流量打掛內網脆弱設備](../connections/C25-engine-to-targets.html)（無掃描實例）、C25 [T3 掃描流量觸發客戶自己的防禦，agent 被封](../connections/C25-engine-to-targets.html)（無掃描實例） |
| **驗證方式** | 送出含外部位址的掃描任務，畫面必須顯示完整目標清單與二次確認，未確認不得派工；目標全為內網時必須仍顯示目標清單；檢查使用手冊必須有「掃描就是攻擊流量、須與資安團隊協調」的明文段落 |
| **來源** | 標準做法：C25 D2◇、C25 D4◇ |

---

*來源：[連線頁](../connections/C01-browser-to-frontdoor.html)的防線（D）；去重對照在 `requirements/_drafts/D-to-SR.md`。*
