使用客户管理的加密密钥 (CMEK)
本页介绍了如何执行与适用于 Bigtable 的客户管理的加密密钥 (CMEK) 相关的任务。如需大致了解 CMEK(包括其启用时间和原因),请参阅 Cloud KMS 文档。
我们建议您使用 Google Cloud Console 处理所有密钥管理任务。如果您计划使用 Google Cloud CLI,请安装适用于 Bigtable 的 gcloud CLI。
准备 CMEK 密钥
在创建受 CMEK 保护的 Bigtable 资源之前,您需要完成以下步骤,为将要包含实例集群的每个区域创建 CMEK 密钥:
创建 Bigtable 服务代理
创建 CMEK 密钥之前,您必须拥有 Bigtable 服务代理,Bigtable 将用于访问密钥。
控制台
您无法在 Google Cloud 控制台中创建服务代理。但是,如果您在 Google Cloud 控制台中创建密钥,系统会提示您授予 Cloud KMS Encrypter/Decrypter 角色,并在此时创建服务代理(如果服务代理尚不存在)。
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 角色。
点击保存。
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
:您要向其授予访问权限的服务代理的电子邮件格式标识符KMS_PROJECT
:包含密钥的项目
创建启用了 CMEK 的实例
创建并配置 CMEK 密钥后,您可以创建受 CMEK 保护的实例。受 Google 默认加密保护的现有 Bigtable 实例无法转换为使用 CMEK;您只能在创建时选择加密类型和密钥。
按照创建实例中的步骤创建受 CMEK 保护的实例。
查看正在使用的密钥
密钥版本相关信息来自 encryption_info
字段。
如需查看表的 CMEK 密钥版本信息,请完成以下步骤:
控制台
转到 Google Cloud 控制台中的“Bigtable 实例”页面。
点击包含该表的实例的名称,以打开实例详情页面并查看实例中的集群列表。
在集群 ID 旁边,点击加密密钥下方的“密钥名称”,以查看集群密钥的版本页面。
gcloud
对于每个集群,您可以使用以下命令确认其 CMEK 配置:
gcloud bigtable clusters describe CLUSTER_ID \
--instance INSTANCE_ID --project CBT_PROJECT
提供以下信息:
CLUSTER_ID
:集群的永久性标识符INSTANCE_ID
:实例的永久性标识符CBT_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
:表的永久标识符INSTANCE_ID
:实例的永久性标识符CBT_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
:实例的永久性标识符CBT_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 Audit Logs。
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
如需详细了解如何查看密钥使用情况,请参阅查看密钥使用情况信息。
查看表的加密状态
控制台
您无法在 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
:集群的永久性标识符INSTANCE_ID
:包含备份的实例的永久标识符CBT_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 控制台中的“Bigtable 实例”页面。
点击实例名称来打开实例详情页面。
在左侧导航窗格中,点击备份。
客户管理的密钥下方列出每个备份的密钥名称和密钥版本。
gcloud
运行以下命令以查看备份的加密信息。
gcloud alpha bigtable backups describe BACKUP_ID \
--instance INSTANCE_ID --cluster CLUSTER_ID \
--project CBT_PROJECT
提供以下信息:
BACKUP_ID
:分配给备份的 IDCLUSTER_ID
:集群的永久性标识符INSTANCE_ID
:包含备份的实例的永久标识符CBT_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'