本文說明如何為 Google Cloud Managed Service for Apache Kafka 叢集設定客戶自行管理的加密金鑰 (CMEK)。
Managed Service for Apache Kafka 預設會使用 Google-owned and Google-managed encryption keys 加密靜態訊息。使用 Google-owned and Google-managed encryption keys不需要額外設定。
關於 CMEK
CMEK 是您擁有的加密金鑰,由 Cloud Key Management Service (Cloud KMS) 管理及儲存。如要進一步控管用於保護 Managed Service for Apache Kafka 靜態資料的加密金鑰,可以使用 CMEK。
使用 CMEK 設定 Managed Service for Apache Kafka 叢集時,服務會自動使用指定的金鑰,加密所有叢集靜態資料。視使用模式而定,使用 Cloud KMS 進行 CMEK 可能會產生額外費用。
與 Managed Service for Apache Kafka 叢集相關聯的 CMEK 是金鑰加密金鑰 (KEK)。KEK 用於加密資料加密金鑰 (DEK)。然後,系統會使用 DEK 讀取和寫入永久磁碟上靜態的資料,這些磁碟會附加至代理程式,以及 Cloud Storage 中分層儲存空間的資料。
如要進一步瞭解磁碟加密,請參閱「關於磁碟加密」。如要進一步瞭解 Cloud Storage 中的加密功能,請參閱 Cloud Storage 說明文件中的客戶管理加密金鑰。
輪替金鑰
輪替方法是建立新的金鑰版本,並將其設為金鑰的主要版本。
如果是連結至代理人的磁碟,新的 KEK 必須在代理人重新啟動後才會生效。您可以更新叢集的容量設定,強制執行代理程式的滾動重新啟動。例如,您可以變更叢集 RAM 大小。
所有新的分區區隔檔案都會使用新的主要金鑰版本,寫入分層儲存空間。選取新的主要金鑰版本後,可能會有幾分鐘的延遲。
為 CMEK 設定 Managed Service for Apache Kafka 叢集
您可以使用Google Cloud 控制台或 Google Cloud CLI,為 Managed Service for Apache Kafka 叢集設定 CMEK。
事前準備
需負責完成下列任務:
啟用 Cloud KMS API。
在 Cloud KMS 中建立金鑰環和金鑰。金鑰和金鑰環無法刪除。由於 Managed Service for Apache Kafka 資源是區域資源,建議您在 Kafka 叢集所在的區域中建立 CMEK。
如需完成這些工作的操作說明,請參閱 Cloud KMS 快速入門指南。
設定 CMEK 的必要角色和權限
Managed Service for Apache Kafka 會使用 Google Cloud 服務代理存取 Cloud KMS。建立第一個 Managed Service for Apache Kafka 叢集後,系統會自動為專案建立服務代理。 Google Cloud
Managed Service for Apache Kafka 會在內部為每個專案維護服務代理,且預設不會顯示在 Google Cloud 控制台的「服務帳戶」頁面。
Managed Service for Apache Kafka 服務代理程式的格式為
service-PROJECT_NUMBER@gcp-sa-managedkafka.iam.gserviceaccount.com。
Managed Service for Apache Kafka 必須具備特定權限,才能使用 CMEK 加密及解密資料。
如要設定必要存取權,請完成下列步驟:
選用:使用 gcloud beta services identity create 指令,手動建立 Managed Service for Apache Kafka 服務代理程式。
如果您先前已在專案中建立叢集,專案中就會有 Managed Service for Apache Kafka 服務代理,您可以略過這個步驟。
gcloud beta services identity create \ --service=managedkafka.googleapis.com \ --project=PROJECT_ID將 PROJECT_ID 替換為專案 ID。
將 Cloud KMS CryptoKey Encrypter/Decrypter (
roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色授予 Managed Service for Apache Kafka 服務代理人。gcloud kms keys add-iam-policy-binding CLOUD_KMS_KEY_NAME \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-managedkafka.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:Managed Service for Apache Kafka 專案的專案編號。
如要進一步瞭解如何授予身分與存取權管理角色,請參閱「授予資源角色」。
使用 CMEK 建立叢集
您可以使用 Google Cloud 控制台或 gcloud CLI,在建立 Kafka 叢集時新增加密金鑰。
Enable the Apache Kafka for BigQuery, Compute Engine, Cloud DNS, and Cloud KMS APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM
role (roles/serviceusage.serviceUsageAdmin), which
contains the serviceusage.services.enable permission. Learn how to grant
roles.
建立叢集前,請先參閱叢集屬性說明文件。
如要使用 CMEK 建立叢集,請按照下列步驟操作:
控制台
-
前往 Google Cloud 控制台的「Clusters」(叢集) 頁面。
- 選取 [Create] (建立)。
「建立 Kafka 叢集」頁面隨即開啟。
- 在「叢集名稱」中輸入字串。
如要進一步瞭解如何命名叢集,請參閱「 Managed Service for Apache Kafka 資源命名指南」。
- 在「Location」部分,輸入支援的地點。
如要進一步瞭解支援的位置,請參閱「 支援的 Managed Service for Apache Kafka 位置」。
- 在「運算資源設定」專區,輸入「記憶體」和「vCPU」的值。
vCPU 與記憶體比率必須介於 1:1 至 1:8 之間。
如要進一步瞭解如何調整 Managed Service for Apache Kafka 叢集的大小,請參閱「 規劃 Kafka 叢集大小」。
- 在「網路設定」中輸入下列詳細資料:
- 專案:子網路所在的專案。子網路必須與叢集位於相同區域,但專案可能不同。
- 網路:子網路連線的網路。
- 子網路:子網路的名稱。
- 子網路 URI 路徑:這個欄位會自動填入資料。或者,您可以在這裡輸入子網路路徑。子網路名稱的格式必須為
projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_ID。 - 按一下 [完成]。
- (選用) 按一下「新增已連線的子網路」,新增其他子網路。
您最多可以新增 10 個子網路。
- 在「Encryption」(加密) 欄位中,選取「Cloud KMS key」(Cloud KMS 金鑰)。
- 在「金鑰類型」中選取「Cloud KMS」,然後在「選取客戶自行管理的金鑰」中輸入您建立的 CMEK。
- 點按「Create」(建立)。
gcloud
執行
gcloud managed-kafka clusters create指令:gcloud managed-kafka clusters create CLUSTER_ID \ --location=LOCATION \ --cpu=CPU \ --memory=MEMORY \ --subnets=SUBNETS \ --encryption-key=CLOUD_KMS_KEY \
更改下列內容:
-
CLUSTER_ID:叢集的 ID 或名稱。
如要進一步瞭解如何命名叢集,請參閱「 Managed Service for Apache Kafka 資源命名指南」。
-
LOCATION:叢集位置。
如要進一步瞭解支援的位置,請參閱「 支援的 Managed Service for Apache Kafka 位置」。
-
CPU:叢集的虛擬 CPU 數量。vCPU 與記憶體比率必須介於 1:1 至 1:8 之間。
如要進一步瞭解如何調整 Managed Service for Apache Kafka 叢集大小,請參閱「 規劃 Kafka 叢集大小」。
-
MEMORY:叢集的記憶體量。請使用「MB」、「MiB」、「GB」、「GiB」、「TB」或「TiB」單位。例如「10GiB」。
-
SUBNETS:要連線的子網路清單。 如有多個子網路值,請使用半形逗號分隔。
子網路的格式為
projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_ID。 -
ENCRYPTION_KEY:叢集使用的 CMEK ID。
格式為
projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY。
-
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.
確認建立叢集
執行 gcloud managed-kafka clusters describe 指令,確認叢集已設定 CMEK。
gcloud managed-kafka clusters describe CLUSTER_ID \
--location=LOCATION
輸出內容會包含已設定的 CMEK。
稽核記錄
當金鑰啟用、停用,或由 Managed Service for Apache Kafka 用於加密及解密訊息時,Cloud KMS 會產生稽核記錄。這有助於偵錯發布或放送資格問題。
Cloud KMS 金鑰 ID 會附加至 Managed Service for Apache Kafka 叢集資源的稽核記錄。Managed Service for Apache Kafka 不會在稽核記錄中納入任何其他 Cloud KMS 相關資訊。
停用並重新啟用 CMEK
停用 CMEK 的方法有兩種。選擇下列其中一種做法:
停用與叢集相關聯的 Cloud KMS 金鑰。這個方法會影響與該金鑰相關聯的所有 Cloud 資源。
使用 Identity and Access Management (IAM),從 Managed Service for Apache Kafka 服務代理人 (
service-${PROJECT_NUMBER}@gcp-sa-managedkafka.iam.gserviceaccount.com) 撤銷 CryptoKey Encrypter/Decrypter 角色。這個方法會影響專案中的所有 Managed Service for Apache Kafka 叢集,以及使用 CMEK 加密的訊息。
雖然這兩項作業都不會立即撤銷存取權,但 IAM 變更通常會更快傳播。
詳情請參閱「Cloud KMS 資源一致性」和「存取權變更傳播」。
如果 Managed Service for Apache Kafka 無法存取 Cloud KMS 金鑰,訊息發布和傳送作業就會失敗並顯示錯誤。如要恢復傳送及發布作業,請還原 Cloud KMS 金鑰的存取權。
Managed Service for Apache Kafka 能夠存取 Cloud KMS 金鑰後,您就能在 12 小時內發布訊息,訊息傳送也會在 2 小時內恢復。
雖然 Cloud KMS 服務中斷不到一分鐘,不太可能大幅中斷發布和傳送作業,但如果 Cloud KMS 服務長時間無法使用,效果就等同於撤銷金鑰。
限制
Cloud KMS 金鑰與 Managed Service for Apache Kafka 叢集之間的關聯無法變更。您無法變更與叢集相關聯的鍵。 不過,您可以建立新版本來輪替金鑰。
如果停用非主要金鑰版本,本機磁碟仍會繼續運作,不會有任何變更。每個代理人在重新啟動時,都會下載新的 KEK。不過,Cloud Storage 無法存取使用原始版本加密的主題區隔檔案,因此可能無法從這些區隔檔案取用訊息。這表示您可能無法使用舊資料。
如果停用主要金鑰版本,中介服務就無法將新的區隔檔案寫入分層儲存空間,這會增加本機磁碟使用率。此外,代理程式也無法重新啟動。您可以主動觸發重新啟動,也可以隨時由服務啟動叢集更新。
如果從 Managed Service for Apache Kafka 服務代理移除金鑰存取權,行為與停用主要金鑰和非主要金鑰版本時類似。
如果刪除金鑰,系統會排定叢集關機時間,且無法復原。
您無法要求重新加密儲存的靜態資料。CMEK 會做為 KEK 使用,但重新加密需要變更資料加密金鑰。