使用客戶自行管理的加密金鑰 (CMEK)
本頁面說明如何執行與 Bigtable 客戶自行管理的加密金鑰 (CMEK) 相關的工作。如要進一步瞭解 CMEK,包括啟用時機和原因,請參閱 Cloud KMS 說明文件。
建議您使用 Google Cloud 控制台執行所有金鑰管理工作。如果您打算使用 Google Cloud CLI,請安裝 Bigtable 適用的 gcloud CLI。
準備 CMEK 金鑰
如要建立受 CMEK 保護的 Bigtable 資源,您必須先完成下列步驟,為執行個體叢集所在的每個區域建立 CMEK 金鑰:
建立 Bigtable 服務代理
建立 CMEK 金鑰前,您必須先擁有 Bigtable 服務代理程式,Bigtable 會使用這個代理程式存取金鑰。
主控台
您無法在 Google Cloud 控制台中建立服務代理。不過,如果您在Google Cloud 控制台中建立金鑰,系統會提示您授予 Cloud KMS 加密者/解密者角色,且如果服務代理人尚未建立,系統會在當時建立。
gcloud
執行 gcloud services identity create 指令,查看 Bigtable 用來代表您存取 CMEK 金鑰的服務代理程式。如果服務帳戶尚不存在,這項指令會加以建立,然後顯示該帳戶。
gcloud beta services identity create \ --service=bigtableadmin.googleapis.com \ --project CBT_PROJECT
將
CBT_PROJECT
替換為包含 Bigtable 資源的專案。該指令會顯示服務代理 ID,格式類似電子郵件地址。請記下輸出內容中的電子郵件字串,因為後續步驟會用到。
Service identity created: service-xxx@gcp-sa-bigtable.iam.gserviceaccount.com
建立金鑰
您可以直接在 Cloud KMS 中建立金鑰,也可以使用透過 Cloud External Key Manager 提供的外部代管金鑰。
在要管理金鑰的 Google Cloud 專案中:
使用下列其中一種方式建立金鑰環和金鑰:
- 直接在 Cloud KMS 中建立金鑰環和金鑰。
- 使用外部代管金鑰。建立外部金鑰,然後建立 Cloud EKM 金鑰,透過 Cloud KMS 提供金鑰。
Cloud KMS 金鑰位置必須與要搭配使用的 Bigtable 叢集相同。舉例來說,如果您在
us-central1
(愛荷華州) 建立金鑰環和金鑰,則us-central1-a
、us-central1-b
和us-central1-c
中的叢集可以受到該金鑰環中的金鑰保護。
設定金鑰的 IAM 設定
主控台
如要將 Cloud KMS 角色授予服務代理,請按照下列步驟操作。如要降低精細度,您也可以在金鑰或金鑰環層級授予權限。
前往 Google Cloud 控制台的「IAM」頁面。
按一下「新增」。
輸入 Bigtable 服務代理程式的電子郵件格式 ID。
選取「Cloud KMS CryptoKey Encrypter/Decrypter」(Cloud KMS 加密編譯金鑰加密者/解密者) 角色。
按一下 [儲存]。
gcloud
將
cloudkms.cryptoKeyEncrypterDecrypter
角色授予服務代理:gcloud kms keys add-iam-policy-binding KMS_KEY \ --keyring KMS_KEYRING\ --location KMS_LOCATION \ --member serviceAccount:SERVICE_ACCOUNT_EMAIL \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter \ --project KMS_PROJECT
請提供下列資訊:
KMS_KEY
:您為金鑰指派的名稱KMS_KEYRING
:包含金鑰的 KMS 金鑰環KMS_LOCATION
:包含金鑰環的區域SERVICE_ACCOUNT_EMAIL
:您要授予存取權的服務代理程式電子郵件格式 IDKMS_PROJECT
:包含金鑰的專案
建立啟用 CMEK 的執行個體
建立及設定 CMEK 金鑰後,即可建立受 CMEK 保護的執行個體。受 Google 預設加密保護的現有 Bigtable 執行個體無法轉換為使用 CMEK,您只能在建立時選擇加密類型和金鑰。
按照「建立執行個體」頁面的步驟,建立受 CMEK 保護的執行個體。
查看使用的金鑰
金鑰版本的相關資訊來自 encryption_info
欄位。
如要查看資料表的 CMEK 金鑰版本資訊,請完成下列步驟:
主控台
前往Google Cloud console 的 Bigtable 執行個體頁面。
按一下包含資料表的執行個體名稱,開啟「執行個體詳細資料」頁面,並查看執行個體中的叢集清單。
在叢集 ID 旁邊,按一下「加密金鑰」下方的金鑰名稱,即可查看叢集金鑰的「版本」頁面。
gcloud
您可以按照下列步驟,確認每個叢集的 CMEK 設定:
gcloud bigtable clusters describe CLUSTER_ID \
--instance INSTANCE_ID --project CBT_PROJECT
請提供下列資訊:
CLUSTER_ID
:叢集的永久 IDINSTANCE_ID
:執行個體的永久 IDCBT_PROJECT
:包含 Bigtable 資源的專案
此指令會顯示類似下面內容的輸出:
defaultStorageType: SSD
encryptionConfig:
kmsKeyName: projects/cloud-kms-project/locations/us-central1/keyRings/cloud-bigtable-keys/cryptoKeys/my-cmek-key
location: projects/cloud-bigtable-project/locations/us-central1-a
name: projects/cloud-bigtable-project/instances/cmek-test-instance/clusters/my-cluster
serveNodes: 1
state: READY
停用金鑰
停用 CMEK 金鑰版本後,您將無法存取受該金鑰版本保護的所有資料。銷毀金鑰版本是這項操作的永久 (24 小時後) 對應作業。請務必為執行個體停用所有金鑰,而非只停用一個或部分叢集的金鑰。
主控台
這是建議做法。使用 Google Cloud 控制台可一次停用所有金鑰版本。
請按照這些說明操作,為每個金鑰版本執行這項操作。
gcloud
建議使用 Google Cloud 控制台停用金鑰。 如要改用 Google Cloud CLI,請執行下列指令。
列出所有 CMEK 金鑰版本:
gcloud kms keys versions list --key KMS_KEY \ --keyring KMS_KEYRING --location KMS_LOCATION \ --project KMS_PROJECT
請提供下列資訊:
KMS_KEY
:CMEK 金鑰名稱KMS_KEYRING
:包含金鑰的 KMS 金鑰環KMS_LOCATION
:包含金鑰環的區域KMS_PROJECT
:包含金鑰的專案
輸出結果會與下列內容相似:
NAME STATE KMS_KEY_NAME/cryptoKeyVersions/1 ENABLED KMS_KEY_NAME/cryptoKeyVersions/2 ENABLED KMS_KEY_NAME/cryptoKeyVersions/3 ENABLED KMS_KEY_NAME/cryptoKeyVersions/4 ENABLED
停用所有版本:
for $KV in 1 2 3 4; do gcloud kms keys versions disable KV --key KMS_KEY \ --keyring KMS_KEYRING --location KMS_LOCATION \ --project KMS_PROJECT; done
請提供下列資訊:
1 2 3 4
:要停用的版本KMS_KEY
:CMEK 金鑰名稱KMS_KEYRING
:包含金鑰的 KMS 金鑰環KMS_LOCATION
:包含金鑰環的區域KMS_PROJECT
:包含金鑰的專案
再次列出所有金鑰版本時,會看到這些版本的狀態已翻轉為
DISABLED
,但 Bigtable 最多可能需要 4 小時才會根據這項狀態變更採取行動。[選用] 等待 4 小時後,如要確認已停用的 CMEK 狀態,請執行下列指令:
gcloud bigtable instances tables describe TABLE_ID \ --instance INSTANCE_ID --view ENCRYPTION \ --project CBT_PROJECT
請提供下列資訊:
TABLE_ID
:資料表的永久 IDINSTANCE_ID
:執行個體的永久 IDCBT_PROJECT
:包含 Bigtable 資源的專案
此指令會顯示類似下面內容的輸出:
clusterStates: CLUSTER: encryptionInfo: - encryptionStatus: code: 9 details: - '@type': type.googleapis.com/google.rpc.PreconditionFailure violations: - subject: KMS_KEY_NAME/cryptoKeyVersions/<int> type: KEY_DISABLED message: KMS_KEY_NAME is not enabled, current state is: DISABLED. encryptionType: CUSTOMER_MANAGED_ENCRYPTION kmsKeyVersion: KMS_KEY_NAME/cryptoKeyVersions/<int> name: projects/CBT_PROJECT/instances/INSTANCE/tables/TABLE
[選用] 如要確認執行個體中的叢集已停用,請執行下列指令:
gcloud bigtable clusters list --instances INSTANCE_ID --project CBT_PROJECT
請提供下列資訊:
INSTANCE_ID
:執行個體的永久 IDCBT_PROJECT
:包含 Bigtable 資源的專案
此指令會顯示類似下面內容的輸出:
NAME ZONE NODES STORAGE STATE my-cluster us-central1-a 1 SSD DISABLED my-other-cluster us-central1-b 1 SSD DISABLED
啟用金鑰
如果金鑰版本已停用,您可以重新啟用,以恢復存取 Bigtable 資源的權限。停用金鑰版本後,您有 30 天的時間可以還原。
主控台
這是建議做法。使用 Google Cloud 控制台可一次啟用所有金鑰版本。
請按照這些說明操作,為每個金鑰版本執行這項操作。
gcloud
建議您使用 Google Cloud 控制台啟用金鑰。如要改用 Google Cloud CLI,請執行下列指令。
查看版本清單,找出金鑰的所有版本:
gcloud kms keys versions list --key KMS_KEY \ --keyring KMS_KEYRING --location KMS_LOCATION \ --project KMS_PROJECT
請提供下列資訊:
KMS_KEY
:CMEK 金鑰名稱KMS_KEYRING
:包含金鑰的 KMS 金鑰環KMS_LOCATION
:包含金鑰環的區域KMS_PROJECT
:包含金鑰的專案
此指令會顯示類似下面內容的輸出:
NAME STATE KMS_KEY_NAME/cryptoKeyVersions/1 DISABLED KMS_KEY_NAME/cryptoKeyVersions/2 DISABLED KMS_KEY_NAME/cryptoKeyVersions/3 DISABLED KMS_KEY_NAME/cryptoKeyVersions/4 DISABLED
執行
kms keys versions enable
指令,並提供列出的所有版本。以範例輸出內容為例,指令如下所示:for $KV in 1 2 3 4; do gcloud kms keys versions enable KV --key KMS_KEY \ --keyring KMS_KEYRING --location KMS_LOCATION \ --project KMS_PROJECT; done
請提供下列資訊:
1 2 3 4
:要停用的版本KMS_KEY
:CMEK 金鑰名稱KMS_KEYRING
:包含金鑰的 KMS 金鑰環KMS_LOCATION
:包含金鑰環的區域KMS_PROJECT
:包含金鑰的專案
再次列出金鑰版本時,會發現其狀態已翻轉為
ENABLED
。
查看 Cloud KMS 金鑰的稽核記錄
啟用 Cloud KMS 資料存取稽核記錄前,請先熟悉 Cloud 稽核記錄。
Cloud KMS 資料存取稽核記錄會顯示 Bigtable 或任何其他設定為使用 CMEK 金鑰的產品,何時對 Cloud KMS 進行加密/解密呼叫。Bigtable 不會在每個資料要求中發出加密/解密呼叫,而是維護輪詢器,定期檢查金鑰。輪詢結果會顯示在稽核記錄中。
您可以在Google Cloud 控制台中設定稽核記錄並與之互動:
請確認專案中的 Cloud KMS API 已啟用記錄功能。
前往 Google Cloud 控制台的「Cloud Logging」頁面。
在查詢建構工具中新增下列程式碼,將記錄檔項目限制為 Cloud KMS 金鑰:
resource.type="cloudkms_cryptokey" resource.labels.key_ring_id = KMS_KEYRING resource.labels.crypto_key_id = KMS_KEY
請提供下列資訊:
KMS_KEY
:CMEK 金鑰名稱KMS_KEYRING
:包含金鑰的 KMS 金鑰環
記錄檔會顯示每個叢集內每個資料表約每五分鐘的記錄項目。記錄項目類似下列範例:
Info 2021-03-20 08:02:24.869 EDT Cloudkms.googleapis.com Decrypt projects/cloud-kms-project/locations/us-central1/keyRings/cloud-bigtable-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-bigtable.iam.gserviceaccount.com audit_log, method: "Decrypt", principal_email: "service-1234567891011@gcp-sa-bigtable.iam.gserviceaccount.com" Info 2021-03-20 08:02:24.913 EDT Cloudkms.googleapis.com Encrypt projects/cloud-kms-project/locations/us-central1/keyRings/cloud-bigtable-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-bigtable.iam.gserviceaccount.com audit_log, method: "Encrypt", principal_email: "service-123456789123@gcp-sa-bigtable.iam.gserviceaccount.com"
如要瞭解如何解讀稽核記錄,請參閱「瞭解稽核記錄」。
查看金鑰使用情形
透過 Cloud KMS,您可以查看金鑰保護的 Bigtable 資源相關資訊,包括:
- 金鑰使用摘要:包括使用金鑰的受保護資源和專案數量等資訊。
- 金鑰使用詳細資料:識別金鑰保護的資源,以及依附於金鑰的資源。
系統支援下列 Bigtable 資源:
bigtableadmin.googleapis.com/Backup
bigtableadmin.googleapis.com/Cluster
bigtableadmin.googleapis.com/Table
bigtableadmin.googleapis.com/AuthorizedView
下列 Bigtable 資源支援預覽:
bigtableadmin.googleapis.com/LogicalView
bigtableadmin.googleapis.com/MaterializedView
如要進一步瞭解如何查看金鑰用量,請參閱「查看金鑰用量資訊」。
查看資料表的加密狀態
主控台
您無法在Google Cloud 控制台中查看資料表的加密狀態。
gcloud
如要在表格中查看 CMEK 詳細資料,請將 view
設為 ENCRYPTION
或 FULL
。
回應會包含 Bigtable 目前使用的金鑰版本及其狀態。
gcloud alpha bigtable instances tables describe TABLE_ID \
--instance INSTANCE_ID --view ENCRYPTION \
--project CBT_PROJECT
請提供下列資訊:
TABLE_ID
:叢集的永久 IDINSTANCE_ID
:包含備份資料的執行個體永久 IDCBT_PROJECT
:包含 Bigtable 資源的專案
此指令會顯示類似下面內容的輸出:
clusterStates:
my-cluster:
encryptionInfo:
- encryptionStatus: {}
encryptionType: CUSTOMER_MANAGED_ENCRYPTION
kmsKeyVersion: KMS_KEY_NAME/cryptoKeyVersions/4
my-other-cluster:
encryptionInfo:
- encryptionStatus: {}
encryptionType: CUSTOMER_MANAGED_ENCRYPTION
kmsKeyVersion: KMS_KEY_NAME/cryptoKeyVersions/4
name: projects/cloud-bigtable-project/instances/cmek-test-instance/tables/my-table
查看備份的加密詳細資料
備份會固定使用原始金鑰版本。Cloud KMS 中的金鑰版本輪替不會輪替用於解密備份的金鑰版本。
主控台
前往Google Cloud console 的 Bigtable 執行個體頁面。
按一下執行個體名稱,開啟「Instance Details」(執行個體詳細資料) 頁面。
按一下左側導覽窗格中的「備份」。
每個備份的金鑰名稱和金鑰版本都會列在「Customer managed key」(客戶管理的金鑰) 下方。
gcloud
執行下列指令,查看備份的加密資訊。
gcloud alpha bigtable backups describe BACKUP_ID \
--instance INSTANCE_ID --cluster CLUSTER_ID \
--project CBT_PROJECT
請提供下列資訊:
BACKUP_ID
:指派給備份作業的 IDCLUSTER_ID
:叢集的永久 IDINSTANCE_ID
:包含備份資料的執行個體永久 IDCBT_PROJECT
:包含 Bigtable 資源的專案
指令會傳回類似以下的輸出內容。kmsKeyVersion
是備份作業所使用的 CMEK 金鑰版本。系統不會回報金鑰版本狀態。
encryptionInfo:
encryptionStatus:
code: 2
message: Status of the associated key version is not tracked.
encryptionType: CUSTOMER_MANAGED_ENCRYPTION
kmsKeyVersion: KMS_KEY_NAME/cryptoKeyVersions/3
endTime: '2020-09-01T00:03:26.568600Z'
expireTime: '2020-09-02T00:03:25.436473Z'
name: projects/cloud-bigtable-project/instances/cmek-test-instance/clusters/my-cluster/backups/my-backup
sizeBytes: '3780'