使用客户管理的加密密钥 (CMEK)

本页介绍如何执行与以下内容相关的任务: 适用于 Bigtable 的客户管理的加密密钥 (CMEK)。如需大致了解 CMEK(包括其启用时间和原因),请参阅 Cloud KMS 文档

我们建议您使用 Google Cloud Console 处理所有密钥管理任务。如果您计划使用 Google Cloud CLI,请安装适用于 Bigtable 的 gcloud CLI

准备 CMEK 密钥

在创建受 CMEK 保护的 Bigtable 资源之前,您需要完成以下步骤,为将要包含实例集群的每个区域创建 CMEK 密钥:

  1. 创建(或检索)Bigtable 服务代理
  2. 创建 CMEK 密钥
  3. 为该密钥配置 IAM 设置

创建 Bigtable 服务代理

在创建 CMEK 密钥之前,您必须拥有 Bigtable 服务 代理,Bigtable 使用它来访问密钥。

控制台

您无法在 Google Cloud 控制台中创建服务代理。但是,如果您在 Google Cloud 控制台中创建密钥,系统会提示您授予 Cloud KMS Encrypter/Decrypter 角色,并在此时创建服务代理(如果服务代理尚不存在)。

gcloud

  1. 运行 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 提供的外部管理的密钥。

  1. 在您要用于管理密钥的 Google Cloud 项目中,执行以下操作:

    1. 启用 Cloud KMS API

    2. 使用以下选项之一创建密钥环和密钥:

      Cloud KMS 密钥位置必须与要使用密钥的 Bigtable 集群相同。例如,如果您在 us-central1(爱荷华)创建了一个密钥环和密钥,则 us-central1-aus-central1-bus-central1-c 中的集群可以受到该密钥环中密钥的保护。

为密钥配置 IAM 设置

控制台

如需向您的服务代理授予 Cloud KMS 角色,请执行以下操作。如果需要更低的粒度级别,您也可以在密钥级层或密钥环级层授予权限。

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM 页面

  2. 点击添加

  3. 输入 Bigtable 服务代理的电子邮件格式 ID。

  4. 选择 Cloud KMS CryptoKey Encrypter/Decrypter 角色。

  5. 点击保存

gcloud

  1. 向您的服务账号授予 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 密钥版本信息,请完成以下步骤:

控制台

  1. 转到 Google Cloud 控制台中的“Bigtable 实例”页面。

    打开实例列表

  2. 点击包含该表的实例的名称,以打开实例详情页面并查看实例中的集群列表。

  3. 在集群 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,请运行以下命令。

  1. 列出 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
    
  2. 停用所有版本:

    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 小时来使此状态更改生效。

  3. [可选] 如需在等待 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
    
  4. [可选] 如需验证实例中的集群已停用,请运行以下命令:

    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,请运行以下命令。

  1. 查看版本列表以确定密钥的所有版本:

    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 控制台中设置审核日志并与之交互:

  1. 确保针对您的项目中的 Cloud KMS API 启用日志记录

  2. 在 Google Cloud 控制台中,前往 Cloud Logging

    前往 Cloud Logging

  3. 通过将以下行添加到查询构建器,将日志条目限制为 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 设置为 ENCRYPTIONFULL。响应中包含正在使用的密钥版本以及 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 中的密钥版本轮替不会轮替用于解密备份的版本。

控制台

  1. 转到 Google Cloud 控制台中的“Bigtable 实例”页面。

    打开实例列表

  2. 点击实例名称来打开实例详情页面。

  3. 在左侧导航窗格中,点击备份

客户管理的密钥下方列出每个备份的密钥名称和密钥版本。

gcloud

运行以下命令以查看备份的加密信息。

    gcloud alpha bigtable backups describe BACKUP_ID \
        --instance INSTANCE_ID --cluster CLUSTER_ID \
        --project CBT_PROJECT

提供以下信息:

  • BACKUP_ID:分配给备份的 ID
  • CLUSTER_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'

后续步骤