Compliance Manager 稽核生命週期架構設計

本文件定義 compliance-manager 系統的四階段稽核流程,對齊 OSCAL 標準。 適用於 CLAUDE.md 或作為 Claude Code session 的上下文輸入。


§1

架構總覽

系統遵循 OSCAL 三層架構(Control → Implementation → Assessment), 實作為四階段專案生命週期,支援多輪稽核(audit round)的持續合規管理。

角色定義

角色 職責
PM 專案主持人 建立專案、編輯 SSP、定義任務、指派人員、啟動稽核、管理 POA&M
執行人員 依指派完成 job(上傳文件、填問卷、截圖等)
內部稽核人員 Phase 2 審閱證據、Phase 4 驗證矯正
外部稽核人員 Phase 3 獨立審查、判定 satisfied/not-satisfied

§2

四階段流程

Phase 1: 規劃(project.status = PENDING)

操作者:PM

  1. PM 呼叫 start_oscal_project,系統執行:

    • 驗證專案名稱不重複
    • 取得 Profile(by profile_uid)
    • 建立空白 SSP(或取得既有 SSP)
    • 建立 Assessment Plan(AP)
    • 從 Profile snapshot:ap_groups → ap_controls → ap_tasks
    • 為每個 AP Task 建立定版 workflow + workflow_execution
    • 建立 audit_round(round_number=1, status=preparing)
    • 建立 Project + ProjectExtension
    • 建立 audit_systems、參與者、設備 mapping
    • 不建立 AR(AR 在 Phase 3 才建)
  2. PM 編輯 SSP:

    • system_characteristics(系統名稱、邊界、FIPS 199 分類、部署架構)
    • 每個控制項的實作描述(描述公司目前如何符合該控制項)
  3. PM 定義每個 ap_task 的 job:

    • 依據 SSP 描述,決定需要哪些佐證
    • 透過 workflow template 產生 job_executions
    • 例如 AC-2 可能需要:上傳 SOP、填帳號盤點問卷、上傳 AD 截圖、上傳停用記錄
  4. PM 指派人員:

    • task_assignees:指定各 job 的執行人員
    • job_execution_org_units:對應部門
    • job_execution_devices:對應設備
  5. PM 確認所有設定完成後,點擊「啟動專案」:

    • project.status → IN_PROGRESS
    • audit_round.status → in_progress
    • 所有被指派人員收到通知

Phase 2: 證據收集 + 內部審查(project.status = IN_PROGRESS)

操作者:執行人員 + 內部稽核人員

  1. 執行人員收到通知,登入看到被指派的 job 清單
  2. 逐一完成 job:
    • 上傳文件 → compliance.job_evidences
    • 填寫問卷 → compliance.job_execution_surveys
    • 留言討論 → compliance.job_execution_comments
  3. Job 完成後 workflow 自動流轉至「待審查」節點
  4. 內部稽核人員在 AO / Control 層級審閱:
    • 瀏覽每個 task 的 SSP 描述 + 所有證據
    • 通過 → 標記「內部通過」
    • 不通過 → 在 job_execution_comments 說明原因,將 job 退回執行人員
  5. 退回的 job 由執行人員補件後重新提交
  6. PM 在 dashboard 監控所有控制項的準備進度
  7. PM 確認就緒後,點擊「啟動外部稽核」→ 觸發 launch_audit

Phase 3: 外部稽核(audit_round.status = auditing)

操作者:外部稽核人員

launch_audit 系統動作:

  • 建立 assessment_results(此時才建 AR)
  • 建立 assessment_result_controls(從 ap_controls 對應)
  • 對 SSP 做 snapshot(凍結當前版本作為稽核基準)
  • audit_round.status → auditing
  • 外部稽核員帳號啟用
  1. 外部稽核員看到快速瀏覽介面,每個控制項顯示:

    • SSP 實作描述(snapshot 版本)
    • 所有 job_evidences(準備期上傳的佐證)
    • 內部稽核的審查意見(job_execution_comments)
    • 關聯的設備和部門
  2. 外部稽核員逐項審查,寫入 ar_findings:

    • satisfied:控制項實作符合要求
    • not-satisfied:記錄缺失原因
  3. ar_evidences 引用 job_evidences(FK: job_evidence_id),不複製

    • 記錄「此 finding 基於哪些證據做出判定」
    • 同一份證據可被多個 finding 引用
  4. 稽核員如需補充資料 → 系統產生新 job(evidence source=audit)

  5. 完成所有審查後,PM 確認 AR → 進入矯正

Phase 4: 矯正與結案(audit_round.status = remediation)

操作者:PM + 執行人員 + 內部稽核人員

系統自動動作:

  • 從每個 not-satisfied finding 建立 poams(status=open)
  • audit_round.status → remediation
  1. PM 填寫 POA&M 矯正計畫:

    • remediation_plan、assigned_to、due_date
    • 可設定 poam_milestones
    • 系統產生矯正 job → poam_job_mappings 關聯
    • poam.status → planned
  2. 執行人員執行矯正:

    • 上傳矯正後的證據 → job_evidences(source=remediation)
    • poam.status → in_progress → verification
  3. 內部稽核驗證矯正到位:

    • 通過 → poam.status → closed,更新 SSP 實作描述
    • 不通過 → 退回 in_progress,在 comments 說明
  4. PM 確認所有 POA&M 都 closed 後結案:

    • audit_round.status → closed
    • project.status → COMPLETED

§3

開啟新週期(Round 2+)

PM 點擊「開啟新一輪稽核」→ launch_new_round

  1. 建立新 audit_round(round_number++, status=preparing)
  2. 基於最新 SSP(含上一輪矯正)重新 snapshot AP 結構
  3. 為新 AP tasks 產生新的 workflow + job
  4. 上一輪未 closed 的 POA&M 自動標記「本輪需複查」
  5. project.status → PENDING 或直接 IN_PROGRESS
  6. 每一輪的證據都是新的(時效性證據重新收集,制度性文件可引用上輪)
  7. Round 1 所有歷史資料完整保留

§4

資料模型異動

新增 Table

oscal.audit_rounds

id                UUID PK
project_id        FK → projects
round_number      INTEGER (1, 2, 3...)
name              VARCHAR(例如「2025 年度稽核」)
status            VARCHAR: preparing / in_progress / auditing / remediation / closed
ssp_snapshot_id   FK → ssp (optional)
started_at        TIMESTAMPTZ
completed_at      TIMESTAMPTZ
created_at        TIMESTAMPTZ

oscal.poams

id                UUID PK
audit_round_id    FK → audit_rounds
finding_id        FK → assessment_result_findings
ap_task_id        FK → assessment_plan_tasks (冗餘但實用)
title             VARCHAR(500)
description       TEXT(從 finding 帶入)
remediation_plan  TEXT
risk_level        VARCHAR: high / medium / low
status            VARCHAR: open / planned / in_progress / verification / closed
assigned_to       FK → users
due_date          DATE
closed_at         TIMESTAMPTZ
closed_by         FK → users
created_at        TIMESTAMPTZ
updated_at        TIMESTAMPTZ
created_by        FK → users

oscal.poam_milestones

id              UUID PK
poam_id         FK → poams (CASCADE)
title           VARCHAR(500)
description     TEXT
sequence_order  INTEGER
due_date        DATE
status          VARCHAR: open / completed
completed_at    TIMESTAMPTZ
created_at      TIMESTAMPTZ

oscal.poam_job_mappings

id                UUID PK
poam_id           FK → poams (CASCADE)
job_execution_id  FK → compliance.job_executions
milestone_id      FK → poam_milestones (nullable)
created_at        TIMESTAMPTZ

修改既有 Table

oscal.assessment_plans — 加欄位

  • audit_round_id FK → audit_rounds

oscal.assessment_results — 加欄位

  • audit_round_id FK → audit_rounds

oscal.assessment_result_evidences — 改為引用

  • job_evidence_id FK → compliance.job_evidences(引用而非複製)
  • relevance_note TEXT(稽核員註記)

compliance.job_evidences — 加欄位

  • source VARCHAR: preparation / audit / remediation

start_oscal_project 異動

修改步驟 4:原本「建立 AP + 空白 AR」→ 改為「只建 AP,不建 AR」 新增步驟:建立 audit_round(round_number=1, status=preparing) 其餘步驟不變

新增 Endpoint

launch_audit

  • 前提:PM 確認 Phase 2 就緒
  • 動作:建立 AR + ar_controls、SSP snapshot、audit_round.status → auditing

launch_new_round

  • 前提:上一輪 audit_round.status = closed
  • 動作:新 audit_round、重新 snapshot AP 結構、產生新 workflow + job

§5

OSCAL Model 對應

系統概念 OSCAL Model 說明
compliant_frameworks Catalog 控制項定義來源
module_frames(合規資源庫) Profile 選取/裁剪的 baseline
SSP / system_characteristics SSP 系統安全計畫
元件定義(未來) Component Definition 預填控制項實作範本
assessment_plan + ap_tasks Assessment Plan 檢查項目與任務
assessment_results + ar_findings Assessment Results 稽核判定結果
poams POA&M 矯正計畫與追蹤
§6

ProjectStatus 對應

class ProjectStatus(StrEnum):
    PENDING = "pending"          # Phase 1: 規劃
    IN_PROGRESS = "in_progress"  # Phase 2-4: 執行中(細部用 audit_round.status 區分)
    COMPLETED = "completed"      # 本輪稽核結案
    SUSPENDED = "suspended"      # 暫停/延期
    ARCHIVED = "archived"        # 封存

Phase 2/3/4 的區分靠 audit_round.status,不靠 ProjectStatus。