为日志存储分区配置 CMEK

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

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

概览

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

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

如需了解有关 CMEK 使用的具体信息(包括优势和限制),请参阅客户管理的加密密钥

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

前提条件

请完成以下步骤:

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

  2. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

    gcloud init

    本指南介绍了如何使用 Google Cloud CLI。

  3. 创建或识别要在其中运行 Cloud KMS 的 Google Cloud 项目。

  4. 如需获取创建密钥所需的权限,请让管理员授予您项目或父资源的 Cloud KMS Admin (roles/cloudkms.admin) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

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

  5. 确保您拥有以下 Cloud Logging 权限:

    • logging.settings.get
    • logging.buckets.get
    • logging.buckets.list
    • logging.buckets.create
    • logging.buckets.update
  6. 为运行 Cloud KMS 的 Google Cloud 项目启用 Cloud KMS API

  7. 为运行 Cloud KMS 的 Google Cloud 项目创建密钥环和密钥

    如需对齐故障网域,您必须使用位置与数据的区域范围匹配的密钥环:

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

  8. 确定以下变量的值:

    • BUCKET_ID 是要创建的 Logging 存储桶的唯一数字标识符。
    • BUCKET_PROJECT_ID 是包含新日志存储桶的 Google Cloud 项目的名称。
    • KMS_PROJECT_ID 是运行 Cloud KMS 的 Google Cloud 项目的唯一字母数字标识符,由您的 Google Cloud 项目名称和随机分配的编号组成。
    • KMS_KEY_LOCATION 是 Cloud KMS 密钥所在的区域。
    • KMS_KEY_RING 是 Cloud KMS 密钥环的名称。
    • KMS_KEY_NAME 替换为 Cloud KMS 密钥的名称。其格式如下所示:projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEYRING/cryptoKeys/KEY

    如需了解如何查找资源标识符,请参阅识别项目

启用 CMEK

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

确定服务账号 ID

如需确定 CMEK 会应用到的 Google Cloud 资源所关联的服务帐号 ID,请执行以下操作:

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

    gcloud logging settings describe --project=BUCKET_PROJECT_ID
    

    上一个命令会为指定资源(如果不存在此类资源)生成一个服务帐号,并在 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 的服务帐号。KMS_SERVICE_ACCT_NAME 字段的格式为 service-PROJECT_NUMBERcmek-pPROJECT_NUMBER

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

分配加密者/解密者角色

在日志存储桶级别配置 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_SERVICE_ACCT_NAME 替换为您在上一步中确定的 kmsServiceAccountId 值。

  • 将其他变量替换为您在前提条件步骤中确定的值。

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

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

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

验证密钥的启用状态

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

gcloud logging buckets list --project=BUCKET_PROJECT_ID

在表格输出中,您会看到一个名为 CMEK 的列。如果 CMEK 列的值为 TRUE,则表示为日志存储桶启用了 CMEK。

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

gcloud logging buckets describe BUCKET_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 --cmek-kms-key-name=NEW_KMS_KEY_NAME

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

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

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

如果您有关联的 BigQuery 数据集,则 BigQuery 无法使用此访问权限将键应用于新 BigQuery 表。如果要在 BigQuery 表上使用未关联到 Logging 的密钥,请按照 BigQuery 文档操作。如果您撤消 Logging 对某个键的访问权限,并且您拥有关联的 BigQuery 数据集,则您也会撤消 BigQuery 对同一键的访问权限。

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

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

如需移除 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

限制

以下是已知的限制。

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 无法控制外部管理的密钥在外部密钥管理合作伙伴系统中的可用性。对于存储桶级 CMEK,如果外部管理的密钥不可用,Cloud Logging 会继续将日志存储在日志存储桶中,但用户无法访问这些日志。

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

区域性

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

客户端库可用性

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

配额

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

排查配置错误

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