設定訊息加密機制

本文將說明如何為 Pub/Sub 設定客戶自行管理的加密金鑰 (CMEK)。

根據預設,Pub/Sub 會使用Google-owned and Google-managed encryption keys 加密訊息。您不需要額外設定即可使用 Google-owned and Google-managed encryption keys。

關於 CMEK

CMEK 是您擁有的加密金鑰,並在 Cloud Key Management Service (Cloud KMS) 中管理及儲存。如果您需要進一步控管用於保護 Pub/Sub 資料的加密金鑰,可以使用 CMEK。部分機構也會規定使用 CMEK。

CMEK 可讓您完全掌控加密金鑰,管理金鑰的生命週期、輪替和存取政策。使用 CMEK 設定 Pub/Sub 時,服務會自動使用指定的金鑰加密所有資料。視使用模式而定,CMEK 的 Cloud KMS 用量可能會產生額外費用。

每則訊息都會在下列狀態和層級進行加密:

在應用程式層級,Pub/Sub 會在收到訊息後立即對傳入的訊息個別加密。此實作方式會新增下列功能:

Pub/Sub 的 CMEK

Pub/Sub 會使用 CMEK 搭配封套加密模式。在這種做法中,訊息不會由 Cloud KMS 加密。而是使用 Cloud KMS 加密 Pub/Sub 為每個主題建立的資料加密金鑰 (DEK)。這些 DEK 只會以加密或經過包裝的形式儲存在 Pub/Sub 中。在儲存 DEK 之前,服務會將 DEK 傳送至 Cloud KMS,以便使用主題指定的金鑰加密金鑰 (KEK) 加密。系統會大約每六小時為每個主題產生新的 DEK。

Pub/Sub 發布訊息至訂閱項目前,會使用為主題產生的最新 DEK 對訊息進行加密。Pub/Sub 會在將訊息傳送給訂閱者之前,先將訊息解密。

事前準備

您可以使用Google Cloud 控制台或 Google Cloud CLI 為 Pub/Sub 設定 CMEK。

完成下列工作:

  • 啟用 Cloud KMS API。

  • 在 Cloud KMS 中建立金鑰環和金鑰。無法刪除金鑰和金鑰環。

如需完成這些工作的操作說明,請參閱 Cloud KMS 快速入門指南

由於 Pub/Sub 資源是全球性的,因此強烈建議您使用全球 Cloud KMS 金鑰來設定支援 CMEK 的主題。視主題發布者和訂閱者的所在位置而定,使用區域性 Cloud KMS 金鑰可能會導致不必要的跨區域網路連結依附性。

設定 CMEK 所需的角色和權限

Pub/Sub 會使用 Google Cloud 服務代理人存取 Cloud KMS。服務代理程式會由 Pub/Sub 為每個專案進行內部維護,且預設不會顯示在 Google Cloud 主控台的「服務帳戶」頁面中。

Pub/Sub 服務代理的格式為 service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com

Pub/Sub 需要特定權限,才能使用 CMEK 加密及解密資料。

請完成下列步驟,設定必要的存取權:

  • 授予 Pub/Sub 服務代理人 Cloud KMS Crypto Key 加密者/解密者 (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色。

    gcloud kms keys add-iam-policy-binding CLOUD_KMS_KEY_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    更改下列內容:

    • CLOUD_KMS_KEY_NAME:Cloud KMS 金鑰的名稱。

      金鑰的格式為 projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY

      例如 projects/test-project/locations/us-central1/keyRings/test-keyring/cryptoKeys/test-key

    • PROJECT_NUMBER:Pub/Sub 專案的專案編號。

如要進一步瞭解如何授予身分與存取權管理角色,請參閱「授予資源角色」。

使用 CMEK 設定主題

您可以使用 Google Cloud 主控台或 gcloud CLI 為主題設定 CMEK。

控制台

如要使用 CMEK 建立主題,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,前往 Pub/Sub 的「Topics」(主題)頁面。

    前往「主題」

  2. 按一下「建立主題」

  3. 在「主題 ID」欄位中輸入主題 ID。

    如要進一步瞭解主題命名方式,請參閱命名規範

  4. 針對「Encryption」(加密),請按一下「Cloud KMS key」(Cloud KMS 金鑰)

  5. 選取鍵類型。如果您沒有看到「Select a customer-managed key」下拉式選單,請確認您已為專案啟用 Cloud KMS API。

  6. 按一下「建立主題」

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 如要使用 CMEK 建立主題,請執行 gcloud pubsub topics create 指令:

        gcloud pubsub topics create TOPIC_ID --topic-encryption-key=ENCRYPTION_KEY
        

    更改下列內容:

    • TOPIC_ID:主題的 ID 或名稱。

      如要進一步瞭解如何命名主題,請參閱「 命名主題、訂閱、結構定義或快照的規範」。

    • ENCRYPTION_KEY:要用於主題的 CMEK ID。

      格式為 projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY

更新主題的 CMEK

您可以彈性變更連結至 Pub/Sub 主題的 CMEK。您可以使用 gcloud CLI 更新 CMEK。不過,這項異動不會溯及既往。

在金鑰變更前發布至主題的訊息,仍會使用原始金鑰加密。如果您在建立主題時未使用 CMEK,之後仍可新增。現有郵件會繼續使用預設的Google-owned and Google-managed encryption keys進行保護。變更主題的 CMEK 不會重新加密先前發布的訊息。這些訊息會繼續使用原始加密時的金鑰進行保護。

Pub/Sub 提供的快取機制可讓鍵保存約 5 分鐘。Pub/Sub 可能需要最多這個時間才能辨識並開始使用新金鑰版本。

稽核記錄

當金鑰啟用、停用,或由 Pub/Sub 用於加密及解密訊息時,Cloud KMS 會產生稽核記錄。這項功能可用於排解發布或提交可用性的問題。

Cloud KMS 金鑰會附加至 Pub/Sub 主題資源的稽核記錄。Pub/Sub 不會包含任何其他 Cloud KMS 相關資訊。

價格和成本

對於下列 Pub/Sub 要求,使用 CMEK 會產生 Cloud KMS 服務存取費用,費用依據 Pub/Sub 定價計算:

  • 對於使用 CMEK 的每個主題,系統會每六小時加密並儲存新的 DEK。

  • 這個金鑰會用於每六分鐘解密 DEK。解密作業會進行三次,每個 Pub/Sub 服務執行區域都有一次。

舉例來說,假設主題具備以下特性:

  • 至少一個訂閱項目

  • 位於相同區域的發布者和訂閱者用戶端

您可以使用以下公式估算 Cloud KMS 加密編譯作業的數量:

1 key access for ENCRYPT * (30 days / month * 24 hours / day) / 6 hours
 + 3 key accesses for DECRYPT
   * (30 days / month * 24 hours / day * 60 minutes / hour ) / 6 minutes
   = 21,720 Cloud KMS key access events
假設密碼編譯作業的計價結構為每 10,000 次操作 $0.03 美元,上述用量大約會產生 $0.07 美元的費用。如要查看最新的定價資訊,請參閱 Cloud KMS 定價

實際上,取用鍵的頻率可能會因存取模式而有所不同。請僅將這些數字視為預估值。

監控與疑難排解

金鑰存取權問題可能會造成以下影響:

  • 訊息傳送延遲

  • 發布錯誤

使用下列指標 (按 response_classresponse_code 分組) 監控發布和拉取要求錯誤:

  • topic/send_request_count
  • subscription/pull_request_count
  • subscription/streaming_pull_response_count

StreamingPull 回應的錯誤率為 100%。這表示串流已結束,而非要求失敗。如要監控 StreamingPull,請尋找 FAILED_PRECONDITION 回應代碼。

發布和訊息傳送可能會因 FAILED_PRECONDITION 錯誤而失敗,原因有很多種。

對於推播訂閱,您無法直接偵測 CMEK 專屬的提交問題。改為:

  • 使用 subscription/num_unacked_messages 監控推播訂閱項目的積壓量和年齡。

  • 監控 subscription/oldest_unacked_message_age,檢查是否有異常的尖峰值。

  • 使用發布錯誤和 CMEK 稽核記錄來找出問題。

停用及重新啟用金鑰

您可以透過下列兩種方式,防止 Pub/Sub 解密訊息資料:

  • 建議做法:使用 Pub/Sub 與主題建立關聯的 Cloud KMS 金鑰,這種做法只會影響與該特定鍵相關聯的 Pub/Sub 主題和訂閱項目。

  • 使用 IAM 從 Pub/Sub 服務帳戶 (service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com) 撤銷 Pub/Sub CryptoKey 加密者/解密者 角色。這項做法會影響所有專案的 Pub/Sub 主題,以及包含使用 CMEK 加密的訊息的訂閱項目。

雖然這兩種操作都不會確認立即撤銷存取權,但 IAM 變更通常會更快傳播。如需更多資訊,請參閱「Cloud KMS 資源一致性」和「存取權變更傳播」。

如果 Pub/Sub 無法存取 Cloud KMS 金鑰,則使用 StreamingPull 或 pull 的訊息發布和傳送作業會失敗,並顯示 FAILED_PRECONDITION 錯誤。訊息將停止傳送至推送端點。如要恢復提交和發布,請還原 Cloud KMS 金鑰的存取權

一旦 Cloud KMS 金鑰可供 Pub/Sub 存取,發布作業就會在 12 小時內開始,訊息傳送作業也會在 2 小時內恢復。

雖然 Cloud KMS 的間歇性中斷時間少於一分鐘,不太可能大幅中斷發布和提交作業,但 Cloud KMS 無法使用時間過長,會造成與金鑰撤銷相同的效果。