为日志存储分区配置 CMEK

本文档介绍了如何为存储在日志存储分区中的日志配置客户管理的加密密钥 (CMEK)。本文档还介绍了如何管理这些密钥,以及使用 CMEK 时存在的限制。

您可以将 CMEK 配置为组织或文件夹的默认资源设置。配置后,Cloud Logging 会确保组织或文件夹中的所有新日志存储分区都使用客户管理的密钥进行加密。如果您在创建日志存储桶时未提供密钥,则系统会使用默认密钥。如需了解详情,请参阅为 Cloud Logging 配置 CMEK

概览

默认情况下,Cloud Logging 会对以静态方式存储的客户内容进行加密。Logging 存储在日志分桶中的数据使用密钥加密密钥进行加密,此过程称为“信封加密”。访问日志记录数据需要访问这些密钥加密密钥,Google Cloud 会为您管理这些密钥,您无需执行任何操作。

您的组织可能具有我们的默认静态加密不提供的监管、合规性相关或高级加密要求。为满足贵组织的要求,您可以管理用于保护数据的加密密钥,而不是由 Google Cloud 管理。

如需详细了解 CMEK 的使用(包括优势和限制),请参阅 CMEK

对于对称加密,定期自动轮替密钥的是推荐的安全做法。如需了解详情,请参阅密钥轮替

前提条件

请完成以下步骤:

  1. 使用 CMEK 时存在一些限制。在创建启用了 CMEK 的日志存储桶之前,请先查看限制

  2. In the Google Cloud console, activate Cloud Shell.

    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.

  3. 配置您计划创建密钥的 Google Cloud 项目:

    1. 如需获得创建密钥所需的权限,请让管理员为您授予项目或父级资源的 Cloud KMS Admin (roles/cloudkms.admin) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

      您也可以通过自定义角色或其他预定义角色来获取所需的权限。

    2. 启用 Cloud KMS API

    3. 创建密钥环和密钥

      借助 Cloud Logging,您可以使用任何区域的密钥。不过,在创建日志存储桶时,日志存储桶的位置必须与密钥的位置一致。如需了解支持的区域,请参阅以下内容:

      您无法为在 global 区域中创建的日志存储分区启用 CMEK。

  4. 确保您在计划创建日志存储分区的 Google Cloud 项目中拥有以下 Cloud Logging 权限:

    • logging.settings.get
    • logging.buckets.get
    • logging.buckets.list
    • logging.buckets.create
    • logging.buckets.update

启用 CMEK

完成前提条件步骤后,请按照以下说明为单个日志存储桶启用 CMEK。

确定服务账号 ID

如需确定与要为其应用 CMEK 的 Google Cloud 资源关联的服务账号 ID,请执行以下操作:

  1. 运行以下 gcloud logging settings describe 命令:

    gcloud logging settings describe --project=BUCKET_PROJECT_ID
    

    在运行上一个命令之前,请先进行以下替换:

    • BUCKET_PROJECT_ID:您计划在其中创建日志存储桶的 Google Cloud 项目的名称。

    上述命令会为指定的资源生成服务账号(如果尚不存在),并在 kmsServiceAccountId 字段中返回该服务账号的 ID:

    kmsServiceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
    loggingServiceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com
    name: projects/BUCKET_PROJECT_ID/settings
    

    kmsServiceAccountId 字段列出了 Cloud Logging 用于调用 Cloud Key Management Service 的服务账号。

  2. 如果 KMS_SERVICE_ACCT_NAME 字段的格式为 cmek-pPROJECT_NUMBER,并且您使用的是 VPC Service Controls 或启用了受限网域共享,请确定您是否需要迁移 CMEK 服务账号。如需了解何时需要迁移以及迁移步骤,请参阅排查 VPC Service Controls 和受限网域共享问题

分配 Encrypter/Decrypter 角色

在日志存储桶级别配置 CMEK 时,请将 Cloud KMS CryptoKey Encrypter/Decrypter 角色分配给由 kmsServiceAccountId 字段标识的服务账号,以向该服务账号账号授予使用 Cloud KMS 的权限:

gcloud kms keys add-iam-policy-binding \
--project=KMS_PROJECT_ID \
--member serviceAccount:KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--location=KMS_KEY_LOCATION \
--keyring=KMS_KEY_RING \
KMS_KEY_NAME

在运行上一个命令之前,请先进行以下替换:

  • KMS_PROJECT_ID:运行 Cloud KMS 的 Google Cloud 项目的唯一字母数字标识符,由 Google Cloud 项目名称和随机分配的编号组成。如需了解如何获取此标识符,请参阅标识项目
  • KMS_SERVICE_ACCT_NAMEgcloud logging settings describe 命令响应的 kmsServiceAccountId 字段中显示的服务账号的名称。
  • KMS_KEY_LOCATION:Cloud KMS 密钥所在的区域。
  • KMS_KEY_RING:Cloud KMS 密钥环的名称。
  • KMS_KEY_NAME:Cloud KMS 密钥的名称。其格式如下所示:projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY

创建日志存储桶并提供 Cloud KMS 密钥

如需创建日志存储桶并为日志存储桶启用 CMEK,请运行以下 gcloud logging buckets create 命令:

gcloud logging buckets create BUCKET_ID \
--location=LOCATION \
--cmek-kms-key-name=KMS_KEY_NAME \
--project=BUCKET_PROJECT_ID

在运行上一个命令之前,请先进行以下替换:

  • BUCKET_ID:日志存储桶的名称或 ID。
  • LOCATION:日志存储桶的位置。
  • KMS_KEY_NAME:Cloud KMS 密钥的名称。其格式如下所示:projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY
  • BUCKET_PROJECT_ID:将创建日志存储桶的 Google Cloud 项目的名称。

验证密钥的启用状态

如需验证您是否已成功创建启用了 CMEK 的日志存储桶,请运行以下 gcloud logging buckets list 命令:

gcloud logging buckets list --project=BUCKET_PROJECT_ID

在运行上一个命令之前,请先进行以下替换:

  • BUCKET_PROJECT_ID:存储日志存储桶的 Google Cloud 项目的名称。

在表格输出中,您会看到标记为 CMEK 的列。如果 CMEK 列的值为 TRUE,则表明日志存储桶已启用 CMEK。

如需查看特定日志存储桶的详细信息(包括密钥的详细信息),请运行以下命令:

gcloud logging buckets describe BUCKET_ID --location=LOCATION --project=BUCKET_PROJECT_ID

管理 Cloud KMS 密钥

以下部分介绍了如何更新日志存储桶以使用 Cloud KMS 密钥的最新主键版本。其中还介绍了如何更改、撤消 Cloud KMS 密钥的访问权限以及停用 Cloud KMS 密钥。

轮替 Cloud KMS 密钥

创建 Cloud KMS 密钥时,您可以配置轮替周期。您还可以手动轮替 Cloud KMS 密钥。每次轮替密钥时,系统都会为该密钥创建一个新版本。

如果您轮替 Cloud KMS 密钥,则新密钥版本仅适用于在密钥轮替后创建的日志存储分区。如果密钥由现有日志存储桶使用,轮替密钥不会更改日志存储桶保护其数据的方式。

例如,假设您创建了一个日志存储桶并启用了 CMEK,然后轮替了 Cloud KMS 密钥。您创建的日志存储桶不会使用新密钥版本,而是继续使用在创建日志存储桶时标记为主要的密钥版本来保护其数据。

如需更新日志存储桶以使用 Cloud KMS 密钥的最新主密钥版本,请执行以下操作:

  1. 确定日志存储桶的当前 Cloud KMS 密钥。 如需了解详情,请参阅验证密钥启用情况
  2. 指定您可以使用的其他 Cloud KMS 密钥。如果您的密钥环只有一个密钥,请创建密钥
  3. 将日志存储桶的 Cloud KMS 密钥更改为在上一步中创建的 Cloud KMS 密钥。
  4. 将日志存储桶的 Cloud KMS 密钥更改为原始 Cloud KMS 密钥。

更改 Cloud KMS 密钥

如需更改与日志存储桶关联的 Cloud KMS 密钥,请创建密钥并更新日志存储桶的 CMEK 设置:

gcloud logging buckets update BUCKET_ID --location=LOCATION \
--cmek-kms-key-name=NEW_KMS_KEY_NAME --project=BUCKET_PROJECT_ID
  • BUCKET_ID:日志存储桶的名称或 ID。
  • LOCATION:日志存储桶的位置。
  • NEW_KMS_KEY_NAME:新密钥的名称。
  • BUCKET_PROJECT_ID:存储日志存储桶的 Google Cloud 项目的名称。

撤消对 Cloud KMS 密钥的访问权限

任何时候,如需撤消 Logging 对 Cloud KMS 密钥的访问权限,请移除已配置的服务账号对该密钥的 IAM 权限。

如果您取消了 Logging 对某个密钥的访问权限,更改最长可能需要一小时才会生效。

如果您有关联的 BigQuery 数据集,BigQuery 将无法使用此访问权限来应用于新 BigQuery 表的键。如果您想在未与日志记录关联的 BigQuery 表上使用密钥,请按照 BigQuery 文档中的说明操作。如果您撤消日志记录对密钥的访问权限,并且您有一个关联的 BigQuery 数据集,则 BigQuery 对同一密钥的访问权限也会被撤消。

您无法撤消 BigQuery 对关联数据集密钥的访问权限,同时保留 Logging 的访问权限。

如需详细了解撤消访问权限的影响,请参阅限制

如需移除 Logging 对密钥的访问权限,请运行以下命令:

gcloud kms keys remove-iam-policy-binding \
--project=KMS_PROJECT_ID \
--member serviceAccount:KMS_SERVICE_ACCT_NAME@gcp-sa-logging.iam.gserviceaccount.com \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--location=KMS_KEY_LOCATION \
--keyring=KMS_KEY_RING \
KMS_KEY_NAME

在运行上一个命令之前,请先进行以下替换:

  • KMS_PROJECT_ID:运行 Cloud KMS 的 Google Cloud 项目的唯一字母数字标识符,由 Google Cloud 项目名称和随机分配的编号组成。如需了解如何获取此标识符,请参阅标识项目
  • KMS_SERVICE_ACCT_NAMEgcloud logging settings describe 命令响应的 kmsServiceAccountId 字段中显示的服务账号的名称。
  • KMS_KEY_LOCATION:Cloud KMS 密钥所在的区域。
  • KMS_KEY_RING:Cloud KMS 密钥环的名称。
  • KMS_KEY_NAME:Cloud KMS 密钥的名称。其格式如下所示:projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY

限制

以下是已知限制。

CMEK 会停用 Error Reporting

如果您想使用 Error Reporting 功能,请勿在日志存储分区上启用客户管理的加密密钥 (CMEK)。如需了解详情,请参阅问题排查

无法从日志存储分区中移除 CMEK

您无法重新配置日志存储分区以更改或移除 CMEK。

由于 Cloud KMS 密钥不可用而导致降级

如果同时满足以下两个条件,则 Cloud KMS 密钥被视为可由 Logging 使用和访问:

  • 密钥已启用
  • Logging 服务账号拥有该密钥的加密和解密权限。

Logging 强烈建议确保所有密钥都已正确配置,并且始终可用。

灾难恢复文件丢失

如果 Cloud Logging 主存储空间中出现重大故障,则 Logging 会将日志记录数据镜像到灾难恢复文件。为资源(例如 Google Cloud 组织)启用 CMEK 后,属于该资源的日志受配置的 CMEK 密钥保护。如果无法访问 CMEK 密钥,则无法为该资源写入灾难恢复文件。

灾难恢复文件丢失不会影响正常的日志记录操作。但是,如果发生存储灾难,Cloud Logging 可能无法从未正确配置 CMEK 的资源中恢复日志。

支持限制条件

如果资源的密钥未正确配置或不可用,则 Cloud Customer Care 无法读取该资源的日志。

查询性能下降

当客户管理的加密密钥无法访问时,Cloud Logging 会继续加密您的数据并将数据存储在日志存储分区中。不过,Cloud Logging 无法对这些数据执行后台优化。如果恢复了密钥访问权限,则数据将可用;但是,数据最初会以未优化的状态存储,并且查询性能可能会受到影响。

由于 Cloud EKM 密钥不可用而导致降级

当您使用 Cloud EKM 密钥时,Google Cloud 无法控制由外部管理的密钥在外部密钥管理合作伙伴系统中的可用性。对于存储桶级层 CMEK,如果外部管理的密钥不可用,则 Cloud Logging 会继续将日志存储在日志存储桶中,但用户无法访问这些日志。

如需了解使用外部密钥的更多注意事项和可能的替代方案,请参阅 Cloud External Key Manager 文档

区域性

创建日志存储桶并启用 CMEK 时,您必须使用区域与数据的区域范围相匹配的密钥。您无法为在 global 区域中创建的日志存储分区配置 CMEK。

客户端库可用性

Logging 客户端库不提供配置 CMEK 的方法。

配额

如需详细了解日志记录用量限制,请参阅配额和限制

排查配置错误

如需了解如何排查 CMEK 配置错误,请参阅排查 CMEK 和组织设置错误