---
title: SR-08 紀錄與稽核
eyebrow: Guidant AI 資安檢視總報告 · 安全需求（SR）
h1: SR-08 紀錄與稽核
subtitle: 紀錄是旁路、目標由人填就記誰按的、刪除有順序
lede: 稽核紀錄要「真的留下、不拖垮業務、事後查得到誰做的」。這一章 **6 條**：紀錄寫入是旁路、目標由人填的動作要留痕、刪除順序、日誌轉送、安全狀態當場算、規則包內容漂移可見。5 條有掃描實例、1 條是標準做法。
chips:
  - { text: "6 條", kind: accent }
  - { text: "掃描驗證 5", kind: ok }
  - { text: "標準做法 1", kind: plain }
---

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

## 這一章管什麼

稽核紀錄有兩種失敗：**該留的沒留**（寫入失敗被吞、超長整筆丟、署名是別人、刪完就沒痕跡）與**留了反成負擔**（寫不進去把使用者已完成的請求一起弄失敗、過期的從不刪）。另有一類是「事後說不清」：授權狀態只靠排程更新、網址型規則包內容被換掉而畫面沒變。本章要求的共同點是：紀錄是旁路，不得拖垮主流程，也不得被主流程的失敗連累而缺漏。

| # | 要求 | 來源 |
|---|---|---|
| SR-08.1 | 紀錄是旁路：寫失敗不拖垮請求，超長先截斷，過期要真的刪 | 掃描驗證 |
| SR-08.2 | 目標由呼叫者填的動作要限量、收斂回應、稽核記操作者與目標 | 掃描驗證 |
| SR-08.3 | 刪除順序：先刪紀錄，紀錄真的刪掉才刪實體 | 掃描驗證 |
| SR-08.4 | 日誌轉送有送達確認或斷線告警，加密設定變更觸發重掛 | 掃描驗證 |
| SR-08.5 | 安全狀態當場算，排程只寫副本，兩者取較嚴 | 掃描驗證 |
| SR-08.6 | 網址型規則包內容漂移可見，抽取失敗的版本不得派工 | 標準做法 |

---

## SR-08.1 紀錄是旁路：寫失敗不拖垮請求，超長先截斷，過期要真的刪 {#sr-08-1}

| 欄位 | 內容 |
|---|---|
| **要求** | 操作日誌寫入**必須**是旁路：寫入失敗**不得**使已完成的請求失敗（錯誤走標準出口記錄，不往上拋）；欄位寫入前**必須**截到上限，截斷後仍失敗**必須**補一筆最小替代紀錄（至少含操作者、動作、時間），**不得**整筆丟失；過期的紀錄**必須**真的被刪（保存期限生效）；分區表的維護**必須**有排程並以擁有者身分執行 |
| **為什麼** | 網址後加一段無意義參數撐過欄位上限，操作照做但寫日誌整筆失敗，事後查不到誰刪了資料；反過來資料庫那一刻寫不進去，使用者已做完的請求被一併弄成失敗；保存期限從沒生效，含密碼原文的舊日誌一直留著 |
| **適用連線** | [C05](../connections/C05-api-to-database.html) api → 資料庫；推及：[C02](../connections/C02-frontdoor-to-api.html) 前門 → api（所有寫操作日誌的端點）、[C03](../connections/C03-frontdoor-to-socketio.html) 前門 → socketio（即時連線事件的紀錄） |
| **對應威脅** | C05 [T5 紀錄表本身：寫不進去拖垮請求、寫太長就不留痕、該刪的不刪**（5 條）](../connections/C05-api-to-database.html) 🟡 |
| **驗證方式** | 對寫操作端點在網址後加超過欄位上限的參數，操作成功且日誌必須有一筆含操作者與動作的紀錄；暫時讓日誌表不可寫，業務請求必須仍成功；查日誌表，早於保存期限的資料必須不存在，且下個月的分區必須已建好 |
| **來源** | 掃描驗證：C05 D5（實例 [M09-6](../STRIDE/R-repudiation.html#m09-6)、[M09-5](../STRIDE/I-information-disclosure.html#m09-5)、[M04-4](../STRIDE/I-information-disclosure.html#m04-4)、[M04-5](../STRIDE/I-information-disclosure.html#m04-5)） |

## SR-08.2 目標由呼叫者填的動作要限量、收斂回應、稽核記操作者與目標 {#sr-08-2}

| 欄位 | 內容 |
|---|---|
| **要求** | 目標由呼叫者填的動作（測試連線、掃描、分享）**必須**：單次目標數有上限；回應**只回**成功／失敗，逐台診斷只進日誌；稽核日誌**必須**記操作者、客戶、設定、工具、代理程式與完整目標清單；目標變更**必須**留紀錄；誰能設定目標**必須**限定在被指派人與專案管理者 |
| **為什麼** | 目標由人填時，代理程式變成內網探測器：從「連得上／被拒／逾時」的差異畫出內網拓撲；若動作沒留下是誰按的、填了什麼目標，事後無從追查，也無法向客戶說明一次異常掃描的來源 |
| **適用連線** | [C21](../connections/C21-api-to-agent-dataplane.html) api → agent 資料面（:8443）、[C23](../connections/C23-agent-to-target-host.html) agent → 受檢主機、[C23a](../connections/C23a-agent-to-tool-servers.html) agent → 工具伺服器、[C25](../connections/C25-engine-to-targets.html) 掃描引擎 → 目標；推及：[C16](../connections/C16-api-to-chat-webhook.html) api → 聊天 webhook（Discord／Telegram）（測試按鈕的目標位址）、[C10](../connections/C10-api-to-smtp.html) api → 客戶 SMTP（寄測試信） |
| **對應威脅** | C21 [T3 測試連線連到哪，由按的人自己填——代理程式變成內網探測器](../connections/C21-api-to-agent-dataplane.html) 🟡、C23 [T1 連到哪由呼叫者填——代理程式替人敲遍內網](../connections/C23-agent-to-target-host.html) 🟡、C23a [T3 把 agent 當跳板，叫工具去打不該打的地方](../connections/C23a-agent-to-tool-servers.html)（無掃描實例）、C25 [T1 拿客戶的掃描器當武器打第三方](../connections/C25-engine-to-targets.html)（無掃描實例）、C25 [T2 掃描流量打掛內網脆弱設備](../connections/C25-engine-to-targets.html)（無掃描實例） |
| **驗證方式** | 送一個超過單次上限的目標清單，必須被拒；送一份含存活與不存活主機的清單，回應內容必須只有成功／失敗而不含逐台診斷；執行後查稽核日誌，必須有操作者、客戶、設定、工具、代理程式與完整目標清單；修改掃描任務的目標後，必須有一筆變更紀錄 |
| **來源** | 掃描驗證：C21 D3（實例 [M03-6](../STRIDE/I-information-disclosure.html#m03-6)）、C23 D1（實例 [M03-6](../STRIDE/I-information-disclosure.html#m03-6)）；標準做法：C23a D4◇、C25 D1◇、C25 D2◇ |

## SR-08.3 刪除順序：先刪紀錄，紀錄真的刪掉才刪實體 {#sr-08-3}

| 欄位 | 內容 |
|---|---|
| **要求** | 刪除時**必須**先刪資料庫紀錄，**確認紀錄真的被刪掉**（不得忽略刪除結果）才刪實體檔；原廠共用檔對寫入（含刪除）**必須**一律拒絕；紀錄刪除被租戶隔離或其他規則擋下時，**必須**回失敗而非「刪除成功」 |
| **為什麼** | 先刪實體再刪紀錄時，一般員工對原廠公版檔按刪除，實體檔已沒了、紀錄刪除被隔離擋下卻回「成功」，之後所有客戶打開這份公版都是壞檔——一個帳號讓原廠給所有客戶的共用範本全部打不開 |
| **適用連線** | [C07](../connections/C07-api-to-file-storage.html) api → 檔案儲存；推及：[C02](../connections/C02-frontdoor-to-api.html) 前門 → api（所有含附件的刪除端點） |
| **對應威脅** | C07 [T4 先刪實體、再刪紀錄——紀錄被擋下但實體已經沒了](../connections/C07-api-to-file-storage.html) 🟡 |
| **驗證方式** | 以一般租戶帳號對原廠公版檔的編號送刪除，必須回失敗，且檔案實體與資料庫紀錄都必須仍在；刪自己租戶的檔，紀錄與實體都必須消失；人為讓紀錄刪除失敗，實體檔必須仍在 |
| **來源** | 掃描驗證：C07 D4（實例 [M02-12](../STRIDE/D-denial-of-service.html#m02-12)） |

## SR-08.4 日誌轉送有送達確認或斷線告警，加密設定變更觸發重掛 {#sr-08-4}

| 欄位 | 內容 |
|---|---|
| **要求** | 日誌轉送（SIEM）**必須**有送達確認，或至少在連線斷掉時告警；轉送的加密設定被變更時，**必須**觸發重新掛載轉送處理器，使線上行為與畫面所示一致；加密時憑證驗證**必須**恆開（自簽憑證改貼信任憑證，不提供「不驗」開關） |
| **為什麼** | UDP 送出去就算，設定錯、SIEM 掛了、路徑被截三種情況全都靜默——客戶以為稽核事件都進了監控，實際已斷線；加密設定改了沒重掛，畫面說加密、線上仍明文 |
| **適用連線** | [C12](../connections/C12-api-to-siem.html) api → 客戶 SIEM（日誌轉送） |
| **對應威脅** | C12 [T1 在路上側錄全部日誌](../connections/C12-api-to-siem.html) 🟡 |
| **驗證方式** | 把 SIEM 端關掉，必須在設定的時間內產生斷線告警；在設定頁把轉送改為加密並存檔，不重啟服務，抓封包必須看到加密連線；用自簽憑證的 SIEM 而不貼信任憑證，加密連線必須被拒 |
| **來源** | 掃描驗證：C12 D1（實例 [M09-3](../STRIDE/I-information-disclosure.html#m09-3)）；標準做法：C12 D5◇ |

## SR-08.5 安全狀態當場算，排程只寫副本，兩者取較嚴 {#sr-08-5}

| 欄位 | 內容 |
|---|---|
| **要求** | 授權到期、唯讀這類安全狀態的判斷**必須**在每次寫入時按當下時間重算；排程**只負責**寫副本；若重算值與存的狀態不同，**必須**取較嚴的那個；排程沒在跑時**不得**使系統停留在較寬鬆的狀態 |
| **為什麼** | 授權在午夜過期，排程每天早上 10 點才跑，資料庫裡的狀態仍是「正常」，客戶照常新增修改最長將近一天；排程沒在跑就一直可寫，商務授權形同虛設 |
| **適用連線** | [C09](../connections/C09-api-to-worker.html) api → worker（背景工作）；推及：[C18](../connections/C18-api-to-license-center.html) api → 授權簽發站（授權到期與停權） |
| **對應威脅** | C09 [T6 安全狀態只靠排程更新，週期就是空窗](../connections/C09-api-to-worker.html) ⚪ |
| **驗證方式** | 把一份授權的到期時間設為一分鐘前、不執行排程，立刻對任一寫入端點送請求，必須被唯讀規則擋下；停掉排程服務，過期的授權仍必須擋下寫入 |
| **來源** | 掃描驗證：C09 D6（實例 [M18-11](../STRIDE/E-elevation-of-privilege.html#m18-11)） |

## SR-08.6 網址型規則包內容漂移可見，抽取失敗的版本不得派工 {#sr-08-6}

| 欄位 | 內容 |
|---|---|
| **要求** | 網址型規則包**必須**定期（或每次派工前）重抓並比對 sha256，與落庫值不符時**必須**警告管理員「網址內容已變更，請重新審核」，派工時不符**必須**拒派；清單頁**必須**說得出「這是哪一刻的快照」；抽取失敗（網址抓不到、不是合法規則包）的版本**不得**進入可派工狀態 |
| **為什麼** | 網址的主人事後換成惡意版本，雲端畫面上顯示的控制項清單還是舊的，每次派掃描 agent 都去抓最新的——使用者看到的與 agent 實際跑的不一致；抽取失敗仍可建立時，未經審的內容照樣被派下去 |
| **適用連線** | [C24](../connections/C24-agent-to-profile-url.html) agent → 規則包網址、[C19](../connections/C19-api-to-profile-url.html) api → 規則包網址 |
| **對應威脅** | C24 [T2 網址的主人事後換內容——雲端看到的是 A、agent 跑的是 B](../connections/C24-agent-to-profile-url.html)（無掃描實例）、C24 [T3 用規則包網址讓 agent 替人探內網、或抓巨檔撐爆](../connections/C24-agent-to-profile-url.html)（無掃描實例） |
| **驗證方式** | 建一個網址型規則包並審過，之後換掉網址上的內容，下一次重抓必須產生告警，派工必須被拒；清單頁必須顯示快照時間；建一個網址指向非規則包的內容，該版本必須不能被選去派工 |
| **來源** | 標準做法：C24 D3◇、C19 D6◇、C24 D5◇ |

---

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