關於輪替時間表

密鑰輪替是指定期更新或替換機密資訊 (密鑰) 的程序,例如密碼、API 金鑰或加密金鑰。輪替密鑰有助於盡量降低未經授權存取或濫用密鑰的風險,尤其是密鑰遭到入侵或外洩時。

定期輪替有以下好處:

  • 如果密鑰外洩,可將影響降至最低。

  • 確保不再需要存取密鑰的使用者無法使用舊的密鑰值。

  • 如果需要緊急輪替密鑰,可將服務中斷的風險降到最低。

Secret Manager 具有密鑰密鑰版本輪替時間表的概念,可做為建構支援輪替密鑰工作負載的基礎。

本頁提供輪替儲存在 Secret Manager 中的密鑰建議。您將瞭解如何執行下列操作:

開始之前,建議您先閱讀平台總覽,瞭解整體 Google Cloud 概況。此外,我們也建議您閱讀 Secret Manager 產品總覽

將密鑰版本繫結至應用程式

Secret Manager 中的密鑰可以有多個密鑰版本。密鑰版本包含不可變更的酬載 (實際的密鑰位元組字串),並依序編號。如要輪替密鑰,請在現有密鑰中新增密鑰版本。

您可以使用 latest 別名,參照密鑰中最近新增的密鑰版本。latest 別名雖然方便開發,但對於某些正式環境工作負載來說可能會有問題,因為錯誤的值可能會立即推出,導致全服務中斷。下列情境說明如何以替代方法繫結密鑰版本。

逐步推出

在下列情況中,逐步推出是指導原則。選擇較慢的密鑰發布速度可降低中斷風險,但復原時間也會較長。部分密鑰可能會在外部系統 (例如追蹤有效密鑰值的 API 或資料庫) 中失效,而您可能無法控制這些系統,因此在這種情況下,您需要推出新版本才能復原。

手動或自動輪替期間,可能會推出無效的密鑰。健全的輪替工作流程應能自動偵測中斷情形 (例如 HTTP 錯誤率),並回溯至較舊的密鑰版本 (透過先前的設定部署作業)。

新密鑰版本的推出方式,取決於密鑰與應用程式的繫結方式。

方法 1:在現有發布程序中解決問題

解決並將密鑰版本與應用程式發布版本繫結。對於大多數部署作業,這項程序會將最新密鑰版本解析為完整密鑰版本資源名稱,並以應用程式的形式發布為旗標或設定檔。建議您在輪替時解析密鑰版本名稱,將資源名稱儲存在某個耐久位置 (例如提交至 Git),並在推送期間將版本名稱提取至部署設定,以免部署作業遭到封鎖。

在應用程式啟動時,使用特定密鑰版本名稱呼叫 Secret Manager,即可存取密鑰值。

這種做法有以下優點:

  • 應用程式會在重新啟動時使用相同的密鑰版本,提高可預測性並降低作業複雜度。

  • 現有的推出和回溯變更管理程序,可重複用於密鑰輪替和密鑰版本部署作業。

  • 您可以逐步推出值,減少部署錯誤值造成的影響。

方法 2:在應用程式啟動時解決問題

在應用程式啟動時擷取最新的密鑰酬載,並在應用程式的整個生命週期內繼續使用該密鑰。

這種做法的優點是不需要修改 CI/CD 管道來解析密碼版本,但如果推出錯誤的密碼,應用程式會在執行個體重新啟動或服務擴充時無法啟動,並可能導致服務中斷。

方法 3:持續解決問題

在應用程式中持續輪詢最新密鑰版本,並立即使用新密鑰值。

這種做法會立即導致全服務中斷,因為新密鑰值不會逐步採用。

輪替密鑰

如果您的密鑰可以動態更新 (例如,驗證密鑰的外部系統提供 Admin API),建議您設定定期執行的輪替作業。下節將以 Cloud Run 做為範例運算環境,說明一般步驟。

在密鑰上設定輪替時間表

為密鑰設定輪替時間表。您必須在密鑰上設定 Pub/Sub 主題,才能在密鑰輪替時收到通知。如要設定密鑰的主題,請參閱「事件通知」指南。

啟動 Cloud Run 來建立新的密鑰版本

建立及設定 Cloud Run 服務,接收輪替通知並執行輪替步驟:

  1. 在外部系統 (例如資料庫、API 供應商) 中取得或建立新密鑰。

    請確保這不會使現有密鑰失效,以免影響現有工作負載。

  2. 使用新密鑰更新 Secret Manager。

    在 Secret Manager 中建立新的密鑰版本。這項操作也會更新 latest 別名,指向新建立的密鑰。

重試和並行

由於輪替程序隨時可能終止,Cloud Run 服務必須能夠從中斷處重新啟動程序 (必須是可重入的程序)。

建議您設定重試,以便重新執行失敗或中斷的輪替作業。此外,請在 Cloud Run 服務中設定並行數上限執行個體數上限,盡量避免並行輪替作業相互干擾。

如要建構可重入的旋轉函式,您可能會發現儲存狀態很有用,可讓旋轉程序繼續執行。Secret Manager 提供兩項功能,可協助您完成這項作業:

  • 在密鑰上使用標籤,即可在輪替期間儲存狀態。在輪替工作流程中,為密鑰新增標籤,追蹤上次成功新增的版本數量 (例如 ROTATING_TO_NEW_VERSION_NUMBER=3)。輪替完成後,請移除輪替追蹤標籤。

  • 使用 ETag 驗證其他程序是否未在輪替工作流程期間同時修改密鑰。進一步瞭解密鑰和密鑰版本 ETag

身分與存取權管理權限

輪替程序需要 secretmanager.versions.add 權限才能新增密鑰版本,可能也需要 secretmanager.versions.access 權限才能讀取先前的密鑰版本。

輪替程序需要 secretmanager.versions.add 權限才能新增密鑰版本,可能也需要 secretmanager.versions.access 權限才能讀取先前的密鑰版本。

預設 Cloud Run 服務帳戶具有編輯者角色,因此有權新增密鑰版本,但無法存取。為遵循最低權限原則,建議您不要使用預設服務帳戶。請為 Cloud Run 服務設定專用服務帳戶,並視需要授予Secret Manager 角色 (可能是一個或多個):

  • roles/secretmanager.secretVersionAdder

  • roles/secretmanager.secretVersionManager

  • roles/secretmanager.secretAdmin

  • roles/secretmanager.secretAccessor

將新密鑰版本推出至工作負載

新的有效密鑰版本已向外部系統註冊,並儲存在 Secret Manager 中,現在請將該版本推出至應用程式。這項推出作業會因密鑰繫結方式而異,一般來說不需要手動介入。

清除舊密鑰版本

所有應用程式都改用新版密鑰後,即可安全地清除舊版密鑰。清除程序取決於密鑰類型,但一般來說:

  1. 確認新版密鑰已全面部署至所有應用程式。

  2. 在 Secret Manager 中停用舊密鑰版本,並確認應用程式不會中斷 (請等待一段合理的時間,讓使用者在停用密鑰導致服務中斷時介入處理)。

  3. 從外部系統移除或取消註冊舊版密鑰。

  4. 在 Secret Manager 中刪除舊密鑰版本

後續步驟