設定訊息加密機制

根據預設,Pub/Sub 會加密靜態儲存的客戶內容。Pub/Sub 會為您處理加密作業,您不必採取任何其他動作。這項做法稱為「Google 預設加密」

如要控管加密金鑰,您可以在 Cloud KMS 中使用客戶自行管理的加密金鑰 (CMEK),搭配整合 CMEK 的服務 (包括 Pub/Sub)。使用 Cloud KMS 金鑰可讓您控管保護等級、位置、輪換時間表、使用權限和存取權,以及加密範圍。 使用 Cloud KMS 還能追蹤金鑰用量、查看稽核記錄,以及控管金鑰生命週期。 您可以在 Cloud KMS 中控制及管理用來保護資料的對稱金鑰加密金鑰 (KEK),而不是由 Google 擁有及管理這些金鑰。

使用 CMEK 設定資源後,存取 Pub/Sub 資源的體驗與使用 Google 預設加密機制類似。如要進一步瞭解加密選項,請參閱「客戶管理的加密金鑰 (CMEK)」。

使用 Cloud KMS Autokey 的 CMEK

您可以手動建立 CMEK 來保護 Pub/Sub 資源,也可以使用 Cloud KMS Autokey。使用 Autokey 時,系統會在 Pub/Sub 中建立資源時,視需要產生金鑰環和金鑰。如果服務代理尚未建立,系統會建立服務代理,並授予必要的 Identity and Access Management (IAM) 角色,供服務代理使用金鑰進行加密和解密作業。詳情請參閱「Autokey 總覽」。

CMEK 與 Pub/Sub 的運作方式

使用 CMEK 設定 Pub/Sub 時,服務會自動使用指定的金鑰加密所有資料。視用量模式而定,使用 Cloud KMS 進行 CMEK 可能會產生額外費用。

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

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

信封式加密模式

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

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

透過 Pub/Sub 設定 CMEK

您可以手動設定 CMEK,也可以使用 Autokey。

事前準備

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

完成下列工作:

  • 啟用 Cloud KMS API。

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

如需完成這些工作的操作說明,請參閱「建立金鑰環」和「建立金鑰」。

由於 Pub/Sub 資源是全域資源,我們強烈建議您使用 global Cloud KMS 金鑰,設定啟用 CMEK 的主題。視主題發布者和訂閱者的位置而定,使用區域 Cloud KMS 金鑰可能會對跨區域網路連結造成不必要的依附元件。

必要角色和權限

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

Pub/Sub 服務代理的格式為 service-${PROJECT_NUMBER}@gcp-sa-pubsub.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.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. 選取金鑰類型。如果沒有看到「選取客戶管理的金鑰」下拉式選單,請確認您已為專案啟用 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
        

    更改下列內容:

手動更新 CMEK 主題

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

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

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

使用 Cloud KMS Autokey 設定主題

如要進一步瞭解如何搭配 Pub/Sub 使用 Cloud KMS Autokey,請參閱「使用 Autokey 的 Cloud KMS」一文。

稽核記錄

當金鑰啟用、停用,或由 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 解密訊息資料:

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

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

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

雖然 Cloud KMS 不太可能發生不到一分鐘的間歇性服務中斷,但如果 Cloud KMS 長時間無法使用,就會像金鑰遭撤銷一樣,嚴重影響發布和傳送作業。