使用客户管理的加密密钥 (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'

后续步骤