本文將說明如何為 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 會在收到訊息後立即對傳入的訊息個別加密。此實作方式會新增下列功能:
- 將郵件加密,並在資料中心內部連結中保留
- 啟用客戶自行管理的加密金鑰 (CMEK)
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 建立主題,請按照下列步驟操作:
gcloud
-
In the Google Cloud console, 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.
-
如要使用 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
實際上,取用鍵的頻率可能會因存取模式而有所不同。請僅將這些數字視為預估值。
監控與疑難排解
金鑰存取權問題可能會造成以下影響:
訊息傳送延遲
發布錯誤
使用下列指標 (按 response_class
和 response_code
分組) 監控發布和拉取要求錯誤:
topic/send_request_count
subscription/pull_request_count
subscription/streaming_pull_response_count
StreamingPull 回應的錯誤率為 100%。這表示串流已結束,而非要求失敗。如要監控 StreamingPull,請尋找 FAILED_PRECONDITION
回應代碼。
發布和訊息傳送可能會因 FAILED_PRECONDITION
錯誤而失敗,原因有很多種。
Cloud KMS 金鑰可能會遭到停用。詳情請參閱本頁的「停用及重新啟用金鑰」一節。
如果您是透過 Cloud EKM 使用外部代管的金鑰,請參閱 Cloud EKM 錯誤參考資料。
對於推播訂閱,您無法直接偵測 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 無法使用時間過長,會造成與金鑰撤銷相同的效果。