Project

General

Profile

CR #201 » SAD-005_安全架構與個資保護.md

內容更新:內部稱謂去識別化(2026-10-18) - Redmine Admin, 10/18/2026 05:32 AM

 

SAD-005 安全架構與個資保護

項目 內容
文件編號 SAD-005
版本 1.3(BEAM PMO 2026-09-21 17:10 核定採 B:新增 §3.4 身分轉傳原則)
狀態 已核定
撰寫者 Security Architect
審查者 SA / 法遵
對應需求 B.2 Authentication / Authorization / Transaction security / Audit Trail / 資料儲存的安全性 / 資料傳輸

1. 安全原則

編號 原則 說明
SP-01 預設拒絕 未明確允許者一律拒絕
SP-02 最小權限 每個角色、每個服務僅擁有完成職責所需之最小權限
SP-03 縱深防禦 網路、主機、應用、資料多層控制
SP-04 零信任 服務間亦須驗證與授權,不因在內網而信任
SP-05 個資最小化 僅蒐集與處理業務必要之個資
SP-06 全程加密 傳輸中與靜態資料皆加密
SP-07 可稽核 所有敏感操作留下不可竄改之軌跡
SP-08 失敗安全 安全檢查失敗時拒絕服務而非放行
SP-09 密鑰隔離 金鑰由 HSM 或密鑰管理服務持有,不落應用程式碼
SP-10 供應鏈安全 第三方套件須經漏洞掃描與授權審查

2. 威脅建模(STRIDE)

威脅類別 具體威脅 影響 控制措施 對應需求
Spoofing(偽冒) 偽冒持卡人交易、偽冒內部使用者 資金損失 MFA、Token 化、裝置綁定、EMV 驗證 Authentication
Tampering(竄改) 竄改交易金額或帳務紀錄 帳務錯誤 交易紀錄不可變、數位簽章、完整性雜湊、稽核軌跡 Audit Trail
Repudiation(否認) 否認曾執行某筆交易或操作 爭議無法釐清 不可否認性軌跡、時間戳、操作者識別 Audit Trail
Information Disclosure(資訊洩露) 卡號、身分證字號外洩 法遵與商譽 加密、遮罩、最小權限、日誌遮罩 資料儲存的安全性
Denial of Service(阻斷服務) 瞬間大量交易打垮授權 服務中斷 限流、自動擴容、斷路器、佇列削峰 POC-17
Elevation of Privilege(權限提升) 客服取得管理員權限 內部舞弊 RBAC + 資料層級權限、職責分離、雙人覆核 Authorization

2.1 攻擊面分析

flowchart LR
  subgraph EXT["外部攻擊面"]
    U1["使用者登入"]
    U2["合作夥伴 API"]
    U3["卡組織連線"]
  end
  subgraph EDGE["邊緣防護"]
    W1["WAF"]
    W2["API 閘道<br/>認證 / 限流"]
    W3["mTLS"]
  end
  subgraph APP2["應用防護"]
    A1["RBAC + 資料層級權限"]
    A2["輸入驗證"]
    A3["日誌遮罩"]
  end
  subgraph DATA["資料防護"]
    D1["靜態加密"]
    D2["欄位級加密"]
    D3["稽核軌跡"]
  end
  U1 --> W1 --> W2 --> A1
  U2 --> W3 --> W2
  U3 --> W3
  A1 --> A2 --> D1
  A3 --> D3
  D1 --> D2

3. 身分驗證(Authentication)

3.1 使用者認證

項目 設計
認證方式 帳號密碼 + 多因子(MFA)
密碼政策 長度 ≥ 12、含大小寫與數字與符號、不得與前 5 次相同
密碼儲存 Argon2id 雜湊 + 個別 salt
登入失敗 連續 5 次鎖定 15 分鐘,並記錄來源 IP
工作階段 JWT(有效期 15 分鐘)+ Refresh Token(有效期 8 小時)
閒置逾時 15 分鐘無操作自動登出
單一登入 支援 SSO(SAML 2.0 / OIDC)
敏感操作再驗證 調額、沖正、覆核等高風險操作須再次輸入密碼或 OTP

3.2 服務間認證

項目 設計
方式 mTLS(服務憑證)+ 服務權杖(Service Token)
憑證管理 由憑證管理服務簽發與輪替(有效期 90 天)
授權範圍 每個服務僅能呼叫其被允許之服務端點(見 SAD-002 §5)

實作狀態對照(2026-09-20 更新,誠實揭露):

設計項 狀態 說明
服務權杖(Service Token) ✅ 已實作並實測通過 OAuth2 client_credentials,由 Keycloak realm cardcore 之 confidential client cardcore-services 簽發;呼叫端由 ClientCredentialsTokenProvider 取得並快取,攜於 Authorization 標頭。詳見 CR-010 與 SCS-022 §7.9
mTLS(服務憑證) ⚪ 未實作 須基礎設施(憑證簽發/輪替/佈署)先就緒;目前僅完成權杖半邊,縱深防禦尚未完整(違反 SP-03 之完整意圖,但已非「內網即信任」)
授權範圍(服務對服務之端點白名單) ✅ 已實作並實測通過(2026-09-21) 依 CR-011 階段二:以 SAD-002 §5 互動矩陣為單一真實來源,由 tools/gen_service_acl.py 轉置產生 cardcore-service-acl.yml;不符即 403 CC-PLT-4030。⚠️ 原「未實作」之記載已過時,本列更正

⚠️ fail-closed 已就位:入站認證啟用(cardcore.security.enabled=true)但出站憑證未設定完整時,
服務啟動期即失敗(OutboundTokenAutoConfiguration 拋 IllegalStateException),
不會退化為「內網免驗證」——此點確保上述缺口不會被靜默放行,而是顯式暴露。

3.3 認證流程

sequenceDiagram
  participant U as 使用者
  participant GW as API 閘道
  participant IDP as 身分提供者
  participant SVC as 領域服務

  U->>GW: 帳號密碼 + MFA 驗證碼
  GW->>IDP: 驗證憑證
  IDP-->>GW: 驗證通過
  GW->>IDP: 取得權杖(含角色)
  IDP-->>GW: JWT + Refresh Token
  GW-->>U: 回傳權杖
  U->>GW: 業務請求(Bearer Token)
  GW->>GW: 驗證簽章與有效期
  GW->>SVC: 轉發請求(含 trace_id 與角色)
  SVC->>SVC: 資料層級權限檢查
  SVC-->>U: 回應

3.4 身分轉傳原則(Token Relay)——gateway/bff 呼叫領域服務之唯一方式

裁定:BEAM PMO 2026-09-21 17:10 核定採 B(轉傳使用者權杖),不採「為 gateway/bff 開 M2M 白名單」。
依據:CR-011 §11。本節為該裁定之設計層落地;程式設計規格見 SCS-022 §7.11。

項目 設計
適用對象 api-gateway(8100)/bff-web(8101)
呼叫領域服務時之身分 轉傳當前使用者之 JWT,非自身 M2M 身分
組態 cardcore.security.outbound.mode: token-relay(預設 client_credentials)
禁止 ❌ 以 cc-api-gateway/cc-bff-web 之 M2M 權杖呼叫領域服務(將遭 403 CC-PLT-4030 拒絕)
例外 非使用者情境(批次/排程/事件消費)→ 採 M2M client_credentials,且須列於 SAD-002 §5 互動矩陣

為何不得以 M2M 替代(三點):

  1. 失去使用者身分——gateway/BFF 係使用者之代理人(§3.3 認證流程即為「GW 轉發請求(含角色)」,
    轉傳本為原始設計意圖)。改以自身身分呼叫,領域服務將無從得知「誰做的」,
    使用者層級授權(§4.1)與稽核軌跡(§6.1 之 actor)皆無從實作——銀行核心之硬需求。
  2. 違反最小權限(SP-02)——為 gateway/bff 開白名單,等於給予「可呼叫所有服務」之超級身分
    (CR-011 §11 選項 A)。
  3. 現行 ACL 已預留此路徑——使用者權杖之 azp 非 cc- 前綴,本就不受服務間 ACL 管制
    (SCS-022 §7.10 規則 3),故無須修改白名單即成立。

⚠️ 配套(消除誤用誘因):CR-010 §9.5 曾為 gateway/bff 補上出站 M2M 組態。
採本原則後該組態不得用於呼叫領域服務——已於組態層改為 token-relay 模式
(SCS-022 §7.11),從機制上移除誤用之可能,而非僅靠文件告誡。
⚠️ 直接刪除該組態不可行:OutboundTokenAutoConfiguration 之 fail-closed 會使
「入站啟用 + 出站憑證未設定」啟動期失敗——故須以模式切換,不是移除。


4. 授權(Authorization)

4.1 權限模型

採 RBAC + 資料層級權限(Data Scope):

層次 說明
功能權限 角色可否使用某功能(端點層)
資料層級 角色可存取哪些資料範圍(如僅自己分行、僅自己承辦案件)
欄位層級 敏感欄位是否可見(如完整卡號僅特定角色可見)
操作層級 是否需覆核(如超限調額)

4.2 角色權限矩陣(節錄)

功能 \ 角色 CSR CSR_SUP CREDIT CREDIT_MGR OPS RISK FIN AUDIT ADMIN
查詢客戶資料 ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅
查詢完整卡號 ❌ ⚠️ ❌ ❌ ⚠️ ❌ ❌ ⚠️ ❌
掛失/鎖卡 ✅ ✅ ❌ ❌ ❌ ✅ ❌ ❌ ❌
額度調整(限額內) ❌ ✅ ✅ ✅ ❌ ✅ ❌ ❌ ❌
額度調整(超限) ❌ ❌ ❌ ✅ ❌ ❌ ❌ ❌ ❌
沖正交易 ❌ ⚠️ ❌ ❌ ✅ ❌ ⚠️ ❌ ❌
爭議受理 ✅ ✅ ❌ ❌ ❌ ❌ ❌ ❌ ❌
批次執行 ❌ ❌ ❌ ❌ ✅ ❌ ✅ ❌ ❌
清算覆核 ❌ ❌ ❌ ❌ ❌ ❌ ✅ ❌ ❌
參數設定 ❌ ❌ ❌ ⚠️ ❌ ✅ ❌ ❌ ✅
權限管理 ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ✅
稽核軌跡匯出 ❌ ❌ ❌ ❌ ❌ ❌ ❌ ✅ ❌

✅ 允許 ⚠️ 需覆核或另需權限 ❌ 不允許

完整矩陣(含頁面層級)見 SDD-007 §5。

4.3 職責分離(Segregation of Duties)

規則 說明
SoD-01 交易之建立者不得為其覆核者
SoD-02 參數設定者不得為其生效之核准者
SoD-03 沖正申請人不得為沖正覆核人
SoD-04 權限管理者不得為稽核軌跡匯出者
SoD-05 超過門檻之金額操作須雙人覆核

5. 加密與個資保護

5.1 傳輸加密

通道 協定 要求
使用者 ↔ 閘道 TLS 1.3 停用 TLS 1.0/1.1;停用弱加密套件
服務 ↔ 服務 mTLS 1.3 雙向憑證驗證
服務 ↔ 資料庫 TLS 1.3 憑證驗證,不允許明文
服務 ↔ 外部系統 TLS 1.3 / SFTP 依對方能力,至少 TLS 1.2
卡組織 專線 + 加密 依卡組織規範

5.2 靜態加密

資料 加密方式
資料庫檔案 透明資料加密(TDE)
個資欄位(卡號、身分證字號) 欄位級加密(AES-256-GCM)
備份檔 加密後儲存
日誌 個資欄位遮罩後寫入

5.3 個資分類與處理

資料項 分類 儲存 顯示 日誌
卡號(PAN) 最高敏感 加密 4111****1234(前 6 後 4) 禁止
CVV2 最高敏感 不儲存 產生後即回傳 禁止
身分證字號 高敏感 加密 A12345**** 禁止
生日 敏感 明文(需權限) 需權限 遮罩
手機號碼 敏感 加密 0912***567 遮罩
電子郵件 敏感 加密 abc***@mail.com 遮罩
姓名 一般 明文 明文 允許
交易金額 一般 明文 明文 允許
地址 敏感 加密 需權限 遮罩

CVV2 不得儲存(BRD-001 BR-01-03、POC-06 情境 6-8)。

5.4 金鑰管理

項目 設計
金鑰儲存 HSM(主金鑰)/密鑰管理服務(資料金鑰)
金鑰輪替 資料金鑰每 90 天;主金鑰每年
金鑰分級 依敏感度分級,不同用途不同金鑰
存取控制 金鑰操作須經服務身分驗證與授權
稽核 所有金鑰操作留存軌跡
禁止 金鑰不得出現於程式碼、設定檔或日誌

5.4.1 實作機制(W-1,2026-09-19)

金鑰由 common-security 之 KeyProvider 埠介面取得;其實作由環境提供:

環境 KeyProvider 實作 取得方式
SIT/UAT/PROD HSM/KMS 版本(由部署方提供,尚未實作) 服務自行定義 KeyProvider bean;CryptoAutoConfiguration 因 @ConditionalOnMissingBean 自動讓位
本地/測試 StaticKeyProvider(common-security 提供) cardcore.security.crypto.* 組態;由 CryptoAutoConfiguration 建立

啟用方式:cardcore.security.crypto.static-keys-enabled=true(預設 false,
必須顯式開啟)。未開啟時不產生任何 bean——生產環境若忘記設定 HSM 實作,
啟動會因缺少 KeyProvider 而 fail-fast,而非靜默地以組態金鑰運作。

5.4.2 本地開發之豁免條款(與「禁止」項之衝突及處置)

⚠️ 本節 5.4 之「禁止:金鑰不得出現於程式碼、設定檔或日誌」與本地開發實務衝突。

衝突內容:本地開發須解密 ops/local/init/oracle/*-dev-*-seed.sql 之預先產生密文
(如 party-service 之 MOBILE_ENC),否則服務無法啟動驗證。
HSM 於本地不可得,故本地必須有可用的靜態金鑰。

豁免範圍(僅限本地/測試):

項 說明
允許位置 各服務 src/main/resources/application-local.yml 之 cardcore.security.crypto.keys.<keyId>(Base64)
金鑰性質 非機密之測試常數——材質已公開於版控(含種子檔產生時所用者),不得與任何真實金鑰相同
強制防護 CryptoAutoConfiguration 對作用中 profile 屬生產類(prod/production/prd/uat/sit/staging/preprod,含複合名如 prod-tokyo)時拒絕啟動並拋出例外。該清單刻意不可由組態調整——若可調整,誤設即可繞過防護
流向限制 application-local.yml 僅供本地,禁止流入 SIT/UAT/PROD(SAD-006 §2.1)
啟動可見性 啟用時記 WARN,明載「此機制僅供本地/測試;生產環境必須改用 HSM/KMS」

因此:5.4「禁止」項之效力限於 SIT/UAT/PROD;本地開發依本豁免條款為之,
且由自動配置之 fail-fast 而非「人工自律」確保不外流。

歷史(已修正):W-1 之前,party-service 之 DevKeyProvider 將金鑰材質
硬編於 Java 程式碼(PartyCryptoConfig)——該作法連本地豁免之形式要求都不符
(金鑰出現於程式碼,且無任何環境防護)。W-1 已改為組態驅動 + fail-fast 防護。

仍待辦(誠實揭露):HSM/KMS 版本之 KeyProvider 尚未實作。
生產環境之金鑰保管、輪替(資料金鑰 90 天)、操作稽核均未實作亦未驗證。
本節 5.4 其餘各項(輪替週期、存取控制、稽核軌跡)目前皆為設計,非實作。


6. 稽核軌跡(Audit Trail)

6.1 軌跡內容

欄位 說明
trace_id 追蹤識別碼
occurred_at 發生時間(UTC,毫秒精度)
actor_type 操作者類型(USER / SERVICE / SYSTEM)
actor_id 操作者識別碼
actor_role 操作者角色
action 動作(CREATE / UPDATE / DELETE / APPROVE / REJECT / QUERY_SENSITIVE)
resource_type / resource_id 標的資源
before_image 異動前值(JSON)
after_image 異動後值(JSON)
result 成功 / 失敗
source_ip / user_agent 來源資訊

6.2 軌跡保證

保證 機制
不可竄改 僅 INSERT 權限;定期計算雜湊鏈
完整性 每筆軌跡含前一筆雜湊(hash chain)
可查詢 依時間、操作者、資源、動作查詢
保留 依 BRD-001 §7.3;不得任意刪除
匯出 僅 AUDIT 角色可匯出

6.3 必稽核事件

類別 事件
認證 登入成功/失敗、登出、MFA 驗證、密碼變更
授權 權限變更、角色指派、存取被拒
敏感查詢 查詢完整卡號、查詢客戶個資
金額操作 額度調整、沖正、退費、點數調整
參數 參數新增/修改/刪除、規則發布
批次 批次啟動、中止、重跑
匯出 報表匯出、軌跡匯出
系統 服務啟停、設定變更、金鑰操作

7. 交易安全

控制 說明
電文完整性 交易金額、卡號以 MAC 或簽章保護
重放防護 交易序號(STAN)+ 時間窗檢核
EMV 驗證 ARQC / ARPC 驗證
PIN 驗證 由 HSM 執行,PIN Block 不在應用層解密
Token 化 行動支付使用 Token,不以真實卡號傳輸
3D 驗證 3-D Secure 交易依卡組織規範
異常偵測 即時風險評分(MCC、地區、金額、頻率)
交易限額 單筆、日限額、日限次、專用額度

8. 應用安全控制

控制 說明 驗證方式
輸入驗證 依 OpenAPI schema 嚴格驗證 契約測試
輸出編碼 防 XSS DAST
參數化查詢 防 SQL Injection SAST + 人工複核
CSRF 防護 前端使用 Token 安全測試
依賴掃描 第三方套件漏洞掃描 CI 自動
秘密掃描 禁止硬編碼密鑰 CI 自動
錯誤訊息 不對外揭露內部細節 人工複核
檔案上傳 型別與大小限制 安全測試

9. 安全測試

測試類型 時機 工具/方式 通過標準
SAST 每次提交 CI 靜態分析 0 Critical/High
DAST 每週 動態掃描 0 Critical/High
依賴掃描 每次建置 套件漏洞庫 0 Critical
滲透測試 上線前 第三方 高風險項全數修復
權限矩陣測試 每次 release 自動化逐角色測試 100% 符合矩陣
個資遮罩測試 每次 release 自動化 100% 欄位正確遮罩
稽核軌跡測試 每次 release 自動化 必稽核事件 100% 留痕
弱點修補驗證 修補後 複測 原弱點不復現

10. 安全檢核清單

# 檢核項 標準
1 所有端點皆經認證 0 匿名端點(除健康檢查)
2 所有端點皆經授權 100% 掛載授權中介層
3 個資欄位皆加密 資料字典標記 PII 者 100% 加密
4 日誌無個資 掃描日誌輸出 0 筆個資
5 CVV2 不落地 資料庫掃描 0 筆 CVV2
6 金鑰不落程式碼 秘密掃描 0 筆;生產環境另須符合 §5.4「禁止」項(不含設定檔)。本地開發依 §5.4.2 豁免條款(組態驅動 + 生產類 profile 拒絕啟動)
7 職責分離生效 SoD-01~05 自動化測試通過
8 稽核軌跡完整 必稽核事件 100% 留痕
9 傳輸加密 0 明文通道
10 依賴無高風險漏洞 0 Critical

11. 修訂記錄

版本 日期 修訂者 說明
1.0 2026-09-17 Security Architect 初版
1.1 2026-09-19 Security Architect 依 W-1(KeyProvider 推廣) 更新:①新增 §5.4.1 實作機制——載明 KeyProvider 埠介面、各環境之實作對應(SIT/UAT/PROD 為 HSM/KMS,尚未實作;本地為 StaticKeyProvider),及 static-keys-enabled 預設 false 之 fail-fast 設計。②新增 §5.4.2 本地開發豁免條款——處理本節「禁止:金鑰不得出現於程式碼、設定檔或日誌」與本地開發實務之衝突:本地須解密種子密文而 HSM 不可得,故明訂豁免範圍(僅 application-local.yml、材質為非機密測試常數、由自動配置對生產類 profile 拒絕啟動把關、禁止流入 SIT/UAT/PROD)。「禁止」項之效力限於 SIT/UAT/PROD。③**§10 檢核項 6 補註豁免條款之依據。④新增本修訂記錄區**(原文件欠缺)。⑤誠實揭露:HSM/KMS 版本之 KeyProvider 尚未實作;金鑰輪替(90 天)、存取控制、操作稽核皆為設計、未實作亦未驗證
1.2 2026-09-20 Security Architect 依 CR-010(服務間呼叫缺授權標頭) 更新:①**§3.2 新增「實作狀態對照」表**——服務權杖(Service Token)已實作並實測通過(OAuth2 client_credentials + Keycloak cardcore-services);mTLS 半邊仍未實作(待基礎設施);服務對服務之端點白名單(授權範圍)未實作,目前為「持有有效服務權杖即可呼叫」,與 SAD-002 §5 之限縮意圖仍有落差——三者皆誠實揭露、未以「已設計」冒充「已實作」。②明載 fail-closed 已就位:入站認證啟用而出站憑證缺漏時,服務於啟動期即失敗,確保上述缺口顯式暴露而非靜默退化為「內網即信任」。③修正既有文件結構缺陷:§10 檢核清單之第 7–10 項(職責分離/稽核軌跡/傳輸加密/依賴漏洞)原先誤置於 §11 修訂記錄表內(且欄數不合),已移回 §10
1.3 2026-09-21 WorkBuddy AI ①新增 §3.4「身分轉傳原則(Token Relay)」(BEAM PMO 2026-09-21 17:10 核定採 B:gateway/bff 呼叫領域服務轉傳使用者權杖,不以自身 M2M 身分替代;依據 CR-011 §11,程式規格見 SCS-022 §7.11)。②更正 §3.2 之過時記載——「授權範圍(服務對服務端點白名單)⚪ 未實作」已過時:CR-011 階段二(2026-09-21)已依 SAD-002 §5 實作並實測通過(不符即 403 CC-PLT-4030)。③明訂配套:CR-010 §9.5 為 gateway/bff 補之出站 M2M 組態改以 token-relay 模式取代,不得直接刪除(fail-closed 會導致啟動失敗)
(30-30/67)