本卡屬 FR-162(母卡見「母卡」欄),批 2,等 1a。把套件的對照服務接進主專案,並把 NIST 官方公布的三份對照資料清洗後灌進 DEV。只改 BE repo。
1a 做好了對照庫的表與服務,這張卡做兩件事:①把套件服務註冊進主專案的依賴注入,讓後面的工作台與證據帶入能呼叫;②寫一支一次性腳本,把 NIST 官方公布的對照表(800-53↔ISO 27001:2022、800-171↔800-53)清洗後灌進資料庫,再跑規則產生 CMMC↔800-171。做完後 DEV 裡就有從 CMMC 一路對到 ISO 的完整鏈。
~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-162-2610-cross-framework-control-mapping/design.md(決策表 D1~D11、詳細設計含 DDL、拆分表);盤點與官方資料分析:~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/analysis/2026-10-24-cross-framework-control-mapping.md。本卡已帶足開工所需細節,不必先讀完。/Users/chouraymond/Desktop/00_Compliance Manager/07_稽核法規文件/Mapping/sp800-53r5-to-iso-27001-mapping-2022-OLIR-2023-10-12-UPDATED.xlsx
20 個 sheet(Relationships-AC、AT、AU…SR)+ Definitions;第 1 列表頭;
A 欄 800-53 控制項(AC-01、AC-02(01) 形式,含 enhancement)、D 欄 ISO 元素;
1,614 列、643 列有 D 欄;D 欄 121 個不同值=91 個 Annex A(A.5.1 格式,全部命中 DEV ISO catalog control_id)
+ 30 個 Clause 條文(5.2、7.5.1 格式,我們 ISO catalog 沒有 Clauses,先存著標 remarks='clause');
Comments/Strength of Relationship 兩欄全空 → relationship 一律 intersects-with、confidence NULL
~/Projects/Billows/Audit-Manager/compliance-manager-be/common/util/input/NIST_800-53_to_800-171.xlsx
單 sheet,A 欄 800-53(AC-02)、B 欄 800-171 逗號多值(3.1.1,3.1.2)→ 拆列;127 列
~/Projects/Billows/Audit-Manager/compliance-manager-be/common/util/input/sp800-53_control_mapping.xlsx
⚠️ 不要用:是 OLIR 前版加髒資料(IR sheet 整欄 Low/High、代號混寫)。本卡可順手 git rm 它與
CMMC_NIST_800_171_Control_No_Mapping.xlsx(CMMC↔171 改規則生成),commit message 說明。
800-53 代號正規化:OLIR 寫 AC-01/AC-02(01),catalog 慣例 AC-1/AC-2.1 或 ac-2.1;800-53 沒有 catalog,
本案統一存 OLIR 原寫法去前導零(AC-1、AC-2(1)),寫進 provenance 說明;兩份檔要用同一套正規化函式。
① DI:di_containers/oscal/oscal_containers.py 加 control_mapping_resolution_service = providers.Factory(ControlMappingResolutionService)、mapping_io_service、mapping_excel_service、cmmc_171_rule_generator(照 profile_resolution_service 那幾行)。
② 轉接腳本 scripts/import_official_control_mappings.py(一次性,走 BE app context 取 DI;--dry-run 印統計不寫):步驟 (a) 確認 022 的兩個參考框架版本存在;(b) 讀 OLIR xlsx → 建 mapping「NIST SP 800-53 Rev. 5 ↔ ISO/IEC 27001:2022」(source=800-53 fv、target=ISO fv id 331)、entries 控制項層 origin='official'、relationship='intersects-with'、method='manual'、provenance={{"source":"NIST OLIR #155","file":檔名,"published":"2023-10-12","imported_at":...}},Clause 列 remarks='clause';(c) 讀 NIST_800-53_to_800-171.xlsx → mapping「800-171 Rev. 2 ↔ 800-53 Rev. 5」同上;(d) 呼叫 1a 的規則生成器對 CMMC L1(fv 195)與 L2(fv 266)各建一個 mapping 到 800-171 r2。全部走 1a 的匯入服務(更新語意),所以重跑筆數不變。
③ 驗證解析整條鏈:腳本末尾印一筆 resolve(ISO fv 331, 'A.5.15', 'A.5.15_obj.4', [CMMC L2 fv 266]) 的結果,應回 CMMC AC.L2-3.1.1 控制項層(hops=3、relationship intersects-with、confidence 退路折扣)。回寫貼這段輸出。
--dry-run 印三份統計(OLIR 643 對、171↔53 拆列後筆數、CMMC L1/L2 控制項與 AO 筆數)。select m.title, count(e.*) from oscal.control_mappings m join oscal.control_mapping_entries e on e.mapping_id=m.id group by 1 四個 mapping 都有數;再跑一次筆數不變。select count(*) from oscal.control_mapping_entries where remarks='clause' 約 204。python main.py 起得來)。scripts/,不放 scripts/sql/。pyproject.toml 第 139 行取消註解、第 85 行 pin jedi-oscal-v2==2.8.0 先註解,poetry update jedi-oscal-v2。path 改動不 commit(commit 前 git diff pyproject.toml poetry.lock 要空或還原)。