設定訊息加密機制

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

根據預設,Pub/Sub 會使用Google Cloud-powered encryption keys 加密訊息。使用 Google Cloud-powered encryption keys不需要額外設定。

關於 CMEK

CMEK 是您擁有的加密金鑰,由 Cloud Key Management Service (Cloud KMS) 管理及儲存。如要進一步控管用來保護 Pub/Sub 資料的加密金鑰,可以使用 CMEK。部分機構也會強制使用 CMEK。

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

所有訊息都會在下列狀態和層級加密:

  • 靜止

    • 硬體層
    • 基礎架構層
    • 應用程式層
  • 正在搭乘大眾運輸工具

在應用程式層,Pub/Sub 會在收到訊息後立即個別加密。這項實作作業會新增下列功能:

Pub/Sub 的 CMEK

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

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

事前準備

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

完成下列工作:

  • 啟用 Cloud KMS API。

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

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

設定 CMEK 時所需的角色和權限

Pub/Sub 會使用 Trusted Cloud 服務代理程式存取 Cloud KMS。Pub/Sub 會在每個專案中維護服務代理程式,且預設不會顯示在 Trusted Cloud 控制台的「服務帳戶」頁面。

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

Pub/Sub 必須具備特定權限,才能使用 CMEK 加密及解密資料。

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

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

    gcloud kms keys add-iam-policy-binding CLOUD_KMS_KEY_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.s3ns-system.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 專案的專案編號。

如要進一步瞭解如何授予 IAM 角色,請參閱授予資源角色

設定啟用 CMEK 的主題

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

控制台

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

  1. 前往 Trusted Cloud 控制台的 Pub/Sub「主題」頁面。

    前往「主題」

  2. 按一下「建立主題」

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

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

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

  5. 選取金鑰類型。如果沒有看到「選取客戶管理的金鑰」下拉式選單,請確認您已為專案啟用 Cloud KMS API。

  6. 按一下「建立主題」

gcloud

如要建立啟用 CMEK 的主題,請執行 gcloud pubsub topics create 指令:

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

更改下列內容:

更新主題的 CMEK

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

金鑰變更前發布至主題的訊息,仍會以原始金鑰加密。如果主題是在沒有 CMEK 的情況下建立,您之後可以新增 CMEK。 現有郵件仍會受到預設的Google Cloud-powered encryption keys保護。變更主題的 CMEK 不會重新加密先前發布的訊息。這些郵件會繼續使用原始加密金鑰保護。

Pub/Sub 的金鑰快取機制約可維持 5 分鐘。Pub/Sub 最多可能需要這段時間,才能辨識並開始使用新版金鑰。

稽核記錄

當金鑰啟用、停用,或由 Pub/Sub 用於加密及解密訊息時,Cloud KMS 會產生稽核記錄。這項功能有助於偵錯發布或放送供應情形的問題。

Cloud KMS 金鑰會附加至 Pub/Sub 主題資源的稽核記錄。Pub/Sub 不會提供任何其他 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 解密訊息資料:

雖然這兩項作業都不會立即撤銷存取權,但 IAM 變更通常會更快傳播。詳情請參閱「Cloud KMS 資源一致性」和「存取權變更傳播」。

如果 Pub/Sub 無法存取 Cloud KMS 金鑰,使用 StreamingPull 或提取功能發布及傳送訊息時,就會失敗並顯示 FAILED_PRECONDITION 錯誤。系統會停止將訊息傳送至推送端點。如要恢復放送和發布,請還原 Cloud KMS 金鑰的存取權

Pub/Sub 能夠存取 Cloud KMS 金鑰後,您就能在 12 小時內發布訊息,訊息傳送也會在 2 小時內恢復。

雖然 Cloud KMS 發生間歇性中斷 (少於一分鐘) 的情況不太可能大幅中斷發布和傳送作業,但如果 Cloud KMS 長時間無法使用,效果就等同於金鑰撤銷。