跳到內容
繁體中文

金鑰管理

落庫的敏感資料採分層信封加密:資料以資料金鑰加密,資料金鑰再由主金鑰包裹。 這一頁說明主金鑰放在哪、清冊怎麼看、要換鑰時走哪一條程序。 全部輪替都是手動操作,系統不會自己換鑰。

主金鑰與資料金鑰怎麼保護1 / 5

密碼由資料金鑰(DEK)封成密文。磁碟上看不到明文。
  1. 密碼由資料金鑰(DEK)封成密文。磁碟上看不到明文。
  2. 資料金鑰自己再被主金鑰(KEK)包住。這是兩層信封。
  3. 主金鑰不寫進資料庫。它在解封頁、環境檔、或雲端金鑰服務。
  4. 要用密碼時,後端先用主金鑰解開外層,才拿得到資料金鑰。
  5. 換主金鑰只重包外層。裡面的密文不用重寫。

連線時密碼怎麼走,見 SSH 終端

委託憑證,在解封時交付4 / 4

服務完成解封後提供業務功能。委託憑證不寫入部署檔案或磁碟,封存時清理,重啟後重新供給。
  1. 委託模式的服務啟動時處於封存狀態,等待管理員完成解封流程。
  2. 管理員先驗證帳密,再核對保管者目的地。
  3. 管理員在解封步驟輸入保管者憑證;系統在本次解封世代的記憶體中持有它。
  4. 服務完成解封後提供業務功能。委託憑證不寫入部署檔案或磁碟,封存時清理,重啟後重新供給。

金鑰管理頁:金鑰清冊與換鑰入口

模式由 .env 的 KEK_PROVIDER 決定。

ENCRYPTION_KEY 填一把 32 位元組的金鑰,三種寫法都收:32 個英數字元、64 個十六進位字元, 或解碼後恰為 32 位元組的 base64。生成方式擇一:

Terminal window
openssl rand -hex 32
openssl rand -base64 32

ui:材料只在記憶體(出貨預設)

Section titled “ui:材料只在記憶體(出貨預設)”

啟動後系統處於封印狀態,除健康檢查與封印端點外的路由都回 503, 要在解封頁交齊材料才開始服務。材料在瀏覽器本地生成,不落磁碟。 解封頁任何模式都先驗證本地管理員帳密,通過後才出現材料欄或保管者憑證欄。 連續失敗會指數退避,冷卻期滿再讓下一次嘗試,不必重啟。 初始化逾時的時候,用第一次輸入的那把金鑰重試,不要換一把新的。

建議設 SEAL_UNSEAL_BIND_ADDR 讓解封端點走獨立監聽, 並以 SEAL_UNSEAL_ALLOWED_CIDRS 限定可以解封的來源網段。

.env 只留 KEK_PROVIDER=kms 與 KEK_KMS_PROVIDER(aws、vault 或 gcp)。 保管處位址、Transit 鍵名、角色識別、區域與金鑰引用在金鑰管理頁與重包精靈寫入資料庫, 不再生效的舊環境變數鍵名會在首次啟動寫進庫一次並記到日誌(不記值)。 委託憑證(雲端金鑰服務的存取密、服務帳號金鑰內容、Vault secret 或 token)只在解封頁輸入, 只活在該次解封,封印即清,不進部署檔與磁碟。 委託模式重啟或封存後停在解封頁,由管理員核對拓撲再當場交保管者憑證。

資料金鑰的包裹與解包由保管處處理,資料與資產密碼不送出。Vault 用 AppRole 或 token (未封印期間續約)。金鑰版本在保管處轉;換鑰與本地↔委託走重包精靈。 多區域金鑰的主副本視為兩把金鑰,切到副本屬於換鑰,要先重包。

全新安裝可在開始服務前走委託初始化,在解封頁四步交齊管理員、拓撲與保管者憑證,再包裹存鍵。

管理端「金鑰管理」頁列出全部金鑰及其指紋。指紋的計算方式統一,可以自己核對:

Terminal window
echo -n <JWT_SECRET> | sha256sum # 取前 16 個十六進位字元

環境變數側的金鑰只呈現指紋與管理方。委託模式以正規化後的外部金鑰引用取代材料指紋。 ui 模式另外呈現封印狀態。政策鍵「金鑰使用期限提醒天數」設為大於 0 時, 超齡的金鑰會在清冊上顯示提醒。

管理員可從金鑰管理把執行中的系統封存:停止新的金鑰使用、讓持有者做完、清快取。 封存會中止仍在使用金鑰的連線。回來路徑依模式:ui 再輸入材料、env 讀部署環境、 委託模式在解封頁核對拓撲並交保管者憑證。

政策鍵「資料金鑰快取存活秒數」在金鑰管理政策。空值是所有模式的出廠值,表示保留到封存或重啟; 0 表示每次向保管處取、不留;正整數是自解封成功起的固定秒數,不因再用延長。 稽核蓋章鑰與簽署私鑰不受此項。封存立即清快取。量測見 保留、清除與觀測。

在金鑰管理頁開重包精靈,把資料金鑰改由新的主金鑰包裹。退役是軟退役, 舊材料保留到顯式清理為止,清理是唯一的材料銷毀點。

完成切換的方式依模式而定:

  • env:把新值寫進 .env 的 ENCRYPTION_KEY 後重啟。
  • ui:重啟後在解封頁輸入新的主金鑰,不要寫進 .env。
  • kms:在重包精靈選保管者(AWS KMS、Vault Transit 或 Google Cloud KMS)並寫拓撲, 清冊的管理方為 kms、金鑰引用為該保管處的正規名稱(ARN、Transit 鍵名或 CryptoKey 資源名)。 保管者密只在解封頁提供。

從本地材料遷移到委託保管處:在重包精靈選目標保管者並寫拓撲,改 KEK_PROVIDER=kms, 移除本地材料後重啟。重啟後停在解封頁核對拓撲、交保管者憑證,再確認清冊。遠端同鑰版本輪替由保管處管理員操作。

在金鑰管理頁選對象輪替,生效即時,不需要重啟,也不中斷既有連線。 舊密文由對應版本的金鑰解開,版本鏈保留。 有金鑰操作在進行、有未切換的重包在途、或行程內金鑰快取過期時,系統會擋下這次操作。

改 .env 的 JWT_SECRET 後重啟,長度至少 32 位元組。換完之後全員需要重新登入。

匯出簽章鑰用於證據包的整包簽章,檢查點簽章鑰用於稽核鏈,兩者刻意分立。 公鑰可以在金鑰管理頁複製或下載,也有各自的端點供外部驗證者取用。 換過匯出簽章鑰之後,記得主動把新公鑰發給外部驗證者。

在告警頁的通知通道編輯該通道、填新密鑰、儲存,同步更新接收端的驗證密鑰, 再按一次「測試發送」確認接收端收得到而且驗章通過。生效即時,不需要重啟。

  1. 指紋如預期變化,並更新自己的紀錄。
  2. 每個啟用中的通知通道各按一次測試發送,確認接收端真的收到。
  3. 稽核裡查得到這次輪替。
  4. 環境變數側的金鑰,重啟後啟動日誌沒有拒絕啟動的訊息。
  • 金鑰的建立、輪替、重包與退役材料清理都留紀錄,清理另記清理筆數與各版本指紋。
  • 清冊本身就是控制證據:哪些金鑰存在、由誰管理、指紋是什麼、上次輪替在何時。
  • 主金鑰模式為 ui 時,清冊呈現封印狀態,可以佐證服務不是以未受保護的材料在跑。
  • 保管處拓撲變更記前後值並發安全告警;解封頁的管理員驗證與委託憑證輸入留痕。