FR-158 SEMI E187 半導體設備資安查核框架 — 設計

FR-158 SEMI E187 半導體設備資安查核框架

1. 這是什麼(白話)

把數位發展部數位產業署 2026-03-10 公布的「以 SEMI E187 為基礎之半導體設備資安查核規範」v1.0 做成系統內建的合規框架,和 CMMC、CRA、ISO 27001 一樣可以建資源庫、起專案、逐條收證據、出結案報告。

跟 ISO 不同的是,這份走匯入解析器(parser):顧問拿到新版 PDF 可以自己從「合規框架匯入」頁匯進來,不用等我們發版。出貨內建那份也是用同一支 parser 從 PDF 產出來的,再疊一層我們寫的摘要與建議證據。

2. 來源文件

檔 內容 用途
docs/reference/SEMI-E187/SEMI-E187-Validation-Criteria-v1.0-2026-03-10-CN.pdf 查核規範 v1.0,23 頁繁中。第 4 章型號一致性(3 條)、第 5 章技術查核(12 條,各帶官方代號 E187.00-RQ-000NN-00 與對應 SEMI E187 標準條款) parser 唯一輸入、測試 fixture、seed 來源
docs/reference/SEMI-E187/半導體設備資安查核檢核表_範本_PUB.xlsx 檢核表範本三分頁:查核文件準備清單、合規檢核表(15 條短標題+一句摘要)、系統強化說明範本 補充內容(短標題、摘要)與建庫文件範本的來源;不當匯入標的

為什麼匯 PDF 不匯 Excel:Excel 每條只剩一句摘要,沒有查核步驟(AO 本體)、沒有 Note;匯入頁與 route 現在只收 .pdf;規範改版公布的是 PDF,Excel 是衍生物。

PDF 排版實測(pdfplumber):本文 DFKaiShu 14pt、Note 10pt、頁碼 TimesNewRoman 10pt,字級可乾淨切開;無疊字、無上標污染(比 CMMC 單純)。

3. 框架結構

3.1 群組(5)

依規範第 1 章末段點名的 E187 四大基礎要求,加一群型號一致性:

group_id 標題 控制項 對應 E187 條款
E187-G1 設備型號一致性與出場品管 4.1、4.2、4.3 無(台灣驗證制度加的)
E187-G2 作業系統支援 5.1、5.2 7.2
E187-G3 網路安全 5.3、5.4 8.2、8.3
E187-G4 端點保護 5.5、5.6、5.7、5.8、5.9、5.10 9.2、9.3、9.4、9.5
E187-G5 安全監控 5.11、5.12 10.2

群組不是從 PDF 解析出來的(PDF 沒有這層),是 parser 內的固定對照表(控制項號 → 群組)。PDF 改版多了 5.13 這類新號,對照表查無就落到依條款號推斷的群組;推不出來落「其他」群,parser 不中止。

3.2 控制項(15)

control_id 標題(Excel 短標題) 官方代號 source_identifier AO 數
4.1 設備適用性確認 — 1
4.2 設備型號 — 2
4.3 出場品管作業 — 2
5.1 對作業系統的支持 E187.00-RQ-00001-00 4
5.2 作業系統安全性更新 E187.00-RQ-00002-00 1
5.3 網路傳輸安全 E187.00-RQ-00003-00 2
5.4 網路設定管理 E187.00-RQ-00004-00 2
5.5 弱點緩解 E187.00-RQ-00005-00 2
5.6 惡意軟體掃描 E187.00-RQ-00006-00 2
5.7 反惡意軟體保護 E187.00-RQ-00007-00 2
5.8 系統強化 (Hardening) E187.00-RQ-00008-00 2
5.9 存取控制機制-帳號識別 E187.00-RQ-00009-00 2
5.10 存取控制機制-權限管理 E187.00-RQ-00010-00 3
5.11 日誌要求-事件紀錄 E187.00-RQ-00011-00 2
5.12 日誌要求-紀錄類別 E187.00-RQ-00012-00 2

合計 31 個 AO。PDF 裡 5.7/5.8、5.9/5.10、5.11/5.12 標題相同(都只寫條款名),parser 照 PDF 產標題,seed 用 Excel 短標題覆蓋;使用者自己匯時可在 Step 2 預覽改名。

3.3 AO(31)=查核步驟

每條底下 5.x.1、5.x.2… 各成一個 AO,prose 用步驟原文(含「若是續查/若否不符合」判定句與 a./b./c. 子項)。最後一步「記錄以下內容之一」不是查核,不成 AO,收成控制項 props verdict_options(符合/不符合/不適用)。

AO part_id = <control_id>_obj.<N>(與 CRA/ISO 同),例 5.1_obj.1。props 帶 {"name":"step","value":"5.1.1"} 保留原步驟號。

3.4 Note 與文件清單去哪

來源 落點 誰產
各步驟的 Note1~Note9 該 AO 底下的子 guidance part(parent_id 指 AO) parser
3.2.3 查核文件準備清單(13 種文件 → 相關查核條款) 控制項層 guidance part,寫成「查核依據文件:…(●必須/○如需)」 parser
一句話摘要(這條在查什麼) 控制項 statement part 補充層(parser 留空)
每個 AO 的建議證據(交付物、須呈現) 疊在該 AO 子 guidance 的 Note 前面 補充層
英文 _trans 表(主語繁中、英文為譯文,與 CRA/ISO 相反) 補充層

4. 決策(2026-10-22 決策者裁,照首腦預設)

# 決策 選擇 被排除的與原因
D1 控制項代號 4.1~5.12(Excel 條文編號,顧問填表認的號);官方 RQ 碼放 source_identifier 與 props 直接用 RQ 碼:4.x 三條沒有 RQ 碼,會混兩套
D2 AO 顆粒度 一步驟一 AO,31 個 一條一 AO:5.1 四步擠成一條,證據分不開、不適用記不了
D3 PDF 隨包 不進包;版本頁 reference_url 指 SEMI 官方頁 https://www.semi.org/zh/SEMI_E187-Specification_for_Cybersecurity_of_Fab_Equipment(決策者 2026-10-22 指定);確認散布權後開新 seed 補 直接進包:封面載明與 SEMI 共同擁有,FR-153 ISO 教訓
D4 建庫預設客戶視角 設備商自評、送驗前準備 檢測實驗室/晶圓廠視角:等 PM 確認情境再調
D5 PDF_PARSER 下拉死選項 ISO_27002/NIST 兩支共三個順手停用(enable=0) 不動:選了 400
D6 匯入 PDF 還是 Excel PDF(§2) —
D7 補充層放哪 BE scripts/semi_e187/content.py,只隨 seed 出貨;匯入頁匯進來的是純 parser 結果 把補充塞進套件 parser:手寫內容進套件與 CMMC/ISO 不一致
D8 主語 繁中為主、英文譯文 —
D9 框架代號 SEMI_E187,版本 1.0,release_date 2026-03-10 —

5. 系統現況與要補的缺口

5.1 既有可直接用

  • parser 工廠 jedi_oscal_v2/infra/adapter/oscal_parser_factory.py:TYPE dict 加一列即接上匯入頁。
  • BaseParserAdapter:_resolve_pages/clean_text/_assert_page_count 共用。
  • 匯入頁 parse → Step 2 預覽(可改名、刪、改 description/guidance)→ confirm → CatalogService.add_catalog。
  • 判定狀態:met/not_met/not_applicable 系統既有,E187 的三選一直接吃。
  • framework_versions.reference_url(jedi-oscal-v2 019 加的欄位)。
  • framework_library_defaults REGISTRY:加 semi_e187.py 一檔即接上建庫。

5.2 要補的缺口(匯入管線丟資料)

首腦核對(2026-10-22):

  • app/oscal/service/framework_parse_job_service.py:433 _tree_to_dict:assessments 只帶 name,description 永遠 None;controls 不帶 source_identifier/props。
  • 同檔 :500 _persist_catalog:source_identifier=c.get("control_id") 寫死等於代號;AO 只寫 _obj.N 一層,沒有子 guidance;不寫 props。
  • 套件 jedi_oscal_v2/app/service/catalog/catalog_service.py:110 add_catalog:parts 平走一層 self._part_repo.add(part),不處理 parent_id(子 part 無從接線)。
  • CRA/ISO 是 seed 直寫 DB 所以沒踩到;CMMC 沒有 AO 子層所以沒踩到。

E187 的 Note 要掛在 AO 底下、RQ 碼要留住,這三處都要補(見 §7 卡 B)。FE Step 2 預覽的 AO 段已有 FrameworkArticleAoGuidance.vue(讀 AO 的 guidance),資料接上即顯示;要確認 Step 2 用的是同一元件。

5.3 語言

匯入頁 Step 1 已有語言選擇(language_code),E187 選 zh_Hant_TW。主語繁中是新情況(CRA/ISO 主語 en):卡 C 要驗 en 使用者看框架時 _trans 有英文就顯示英文、沒有就 fallback 主表繁中。

6. Parser 規格(卡 A)

檔:jedi_oscal_v2/infra/adapter/semi_e187/semi_e187_parser_adapter.py,類 SemiE187Adapter(BaseParserAdapter)。ParserAdapterType.SEMI_E187 = "SEMI_E187",factory TYPE 加一列。

6.1 pdf_parser → list[dict]

  1. pdfplumber 逐頁 extract_words(extra_attrs=["fontname","size"]),按 top 組行;size < 12 的字歸 Note 流(本文 14、Note 10;門檻用實測值,寫成有註解的常數),頁碼行(^\d+/\d+$)丟掉。
  2. 只處理第 4、5 章:從第一個 ^4\s+設備型號一致性 標題起,到 ^6\s+參考資料 止。第 3.2.3 文件清單表另用 page.extract_tables() 抓(實測第 6~7 頁可抓到 4 欄:項目/文件名稱/必要性/相關查核條款)。
  3. 控制項標題:^(\d\.\d{1,2})\s*(?:\[(E187\.\d{2}-RQ-\d{5}-\d{2})\])?\s*(?:\((條款\s*[\d.]+)\s*([^)]*)\))?\s*(.*)$。4.x 沒有中括號與小括號,標題在尾段;5.x 標題取小括號內條款名。
  4. 步驟:^(\d\.\d{1,2}\.\d)\s*(.*)。步驟內文含子項 ^[a-z]\.\s、判定句「若是…若否…」,全部併進 prose,換行保留為空格。遇「記錄以下內容之一」→ 收 a. 符合 等成 verdict_options,該步不成 AO。
  5. Note:Note 流中 ^Note\s*(\d+)\s*[::]\s*(.*) 起一條,續行併入;歸屬「最近一個步驟」。表格型 Note(5.8 Note1 強化領域表)照行文字收,不求還原表格。
  6. 群組:固定對照 {4.x: G1, 5.1/5.2: G2, 5.3/5.4: G3, 5.5~5.10: G4, 5.11/5.12: G5};查無則依條款號首位(7→G2、8→G3、9→G4、10→G5),再查無落 E187-G9 其他。

raw record:

{
  "group_code": "E187-G2", "group_name": "作業系統支援",
  "control_id": "5.1", "rq_code": "E187.00-RQ-00001-00",
  "clause": "7.2", "title": "對作業系統的支持",
  "steps": [{"step_id": "5.1.1", "text": "詢問申請者或檢視設備規格文件,…若否,則依 2.1.5 原則…", "notes": ["Note1:…"]}, ...],
  "verdict_options": ["符合", "不符合", "不適用"],
  "documents": [{"name": "設備規格文件", "required": True}, {"name": "…LTS 證明文件", "required": False}],
}

6.2 convert_to_oscal_catalog_entity

  • group:group_id=group_code、title=group_name、class_="semi-e187"。
  • control:control_id、title、source_identifier=rq_code or control_id、class_="semi-e187"、props=[{"name":"rq-code",...},{"name":"e187-clause",...},{"name":"verdict-options","value":"符合|不符合|不適用"}]。
  • parts:statement 不產(parser 無摘要可寫);每步一個 assessment-objective part(part_id=<cid>_obj.<N>、props=[{"name":"step","value":"5.1.1"}]),其 Note 合成一個子 guidance part 掛 part.children(transient,parent_id 由 persistence 接);文件清單非空時產控制項層 guidance part(part_id=<cid>_gdn)。

6.3 excel_parser/gen_excel_file

沿用 CMMC 的 practices_raw 平表形狀(item_type 加 note/document),round-trip 測試即可,不另設計。

6.4 測試(套件 tests/catalog/)

fixture 用 docs/reference/SEMI-E187/…CN.pdf 複製進套件 tests/fixtures/。斷言:15 條、31 AO、5 群、代號與 RQ 碼逐條對 §3.2 表、5.1 有 4 步且 5.1.4 prose 含「LTS」、5.5 的 Note 共 9 條、文件清單 13 筆且 5.5 掛到「設備弱點掃描報告」與「弱點管理機制說明文件」、verdict_options 4.1 為 2 項 5.1 為 3 項。突變:把字級門檻拿掉要紅(Note 混進 AO prose)。

7. 拆卡

批 卡 改哪 做什麼 Model/Effort
1 A SEMI_E187 parser adapter jedi-oscal-v2 infra/adapter/semi_e187/、common/code/parser_adapter_type.py、infra/adapter/oscal_parser_factory.py、tests/catalog/、tests/fixtures/ §6 opus/high
1 B 匯入管線補 AO 子層與來源代號 jedi-oscal-v2 app/service/catalog/catalog_service.py;BE app/oscal/service/framework_parse_job_service.py;FE Step 2 預覽確認 §5.2 三處:add_catalog 接 part.children 的 parent_id;_tree_to_dict 帶 AO description(子 guidance)、control source_identifier/props;_persist_catalog 寫回;confirm 的 overrides 讓 assessments[].description 可編 opus/medium
2 C 補充內容+seed 020+選單+reference_url BE scripts/semi_e187/content.py、scripts/gen_semi_e187_seed.py;jedi-oscal-v2 migrations/020-semi-e187-catalog-seed.sql;BE 主線 phase=seed migration(PDF_PARSER 加 SEMI_E187、停用 ISO/NIST) 跑 parser 吃 PDF → 疊 content(短標題、摘要 statement、AO 建議證據、英文譯文)→ 產 020;DEV 套兩次計數不變 opus/high
2 D 建庫預設 BE app/oscal/service/framework_library_defaults/semi_e187.py、__init__.py REGISTRY、app/oscal/templates/semi_e187/ 表單設定(設備型號、申請者、OS 與版本、OS 終止支援日、查核基準日、是否型號一體驗證、聯網功能有無)、參與方空殼(申請者/檢測實驗室)、系統強化說明文件範本(Excel 第 3 分頁轉 docx) opus/medium
3 E 收尾 BE pyproject.toml pin、spec-site、docs/features/README.md、FR-158 SUMMARY 還原 pin(發版步驟列出,執行前回寫問決策者)、SPEC 頁、README 列、收尾紀錄 sonnet/medium

第 1 批 A/B 同在 jedi-oscal-v2 但不同檔(A 在 infra/adapter/,B 在 app/service/catalog/),可平行。第 2 批 C/D 不同檔可平行;D 的手測在 C 未完成前,用匯入頁匯 PDF 建一個 SEMI_E187 框架頂替(第 1 批已完成即可)。

8. 驗收(首腦收口時親自做)

  • 套件 tests 全綠;BE 守衛測試全綠。
  • DEV 匯入頁選 SEMI_E187+PDF+繁中 → Step 2 預覽 5 群/15 條/31 AO,AO 下看得到 Note;confirm 後 DB catalog_control_parts 有 parent_id 非空的 guidance 列、controls 的 source_identifier 是 RQ 碼。
  • seed 020 套兩次計數不變;en 使用者看框架顯示英文、缺的 fallback 繁中。
  • 建 SEMI_E187 資源庫:表單設定、兩個參與方空殼、強化說明範本到位。
  • PDF_PARSER 下拉只剩 CMMC 2.0、SEMI E187 兩項。

9. 範圍外

  • 查核報告格式(規範 1.1.2 說查核申請、計畫、報告由實驗室自建)。
  • SEMI E187 標準本體(SEMI 付費文件)與 Reference Practice/Check List 內容。
  • 匯入頁帶補充層(D7)。
  • ISO 補 parser(決策者裁不補)。