管理用于保护日志路由器数据的密钥

本页面介绍了如何配置和管理日志路由器的客户管理的加密密钥 (CMEK),以满足贵组织的合规性需求。

日志路由器的 CMEK 是在 Google Cloud 组织级层配置的。它应用于 Google Cloud 组织包含的所有 Cloud 项目和文件夹。

概览

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

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

如需了解 CMEK 的具体信息(包括其优点和限制),请参阅 CMEK

虽然目前无法对 Cloud Logging 中存储的日志使用 CMEK,但您可以使用 CMEK 来保护日志路由器使用的临时灾难恢复文件以及在将日志路由到 Cloud Storage 时使用的临时文件。

前提条件

如需开始为日志路由器启用 CMEK,请完成以下步骤:

  1. 安装并初始化 Cloud SDK

    本指南介绍了如何使用 gcloud 命令行工具(该工具使用 Cloud SDK 安装)。

  2. 确定要为其启用 CMEK 的组织。

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

    验证包含 Cloud 项目的 Google Cloud 组织是否为您授予具有 logging.cmekSettings.{get,update} 权限的 IAM 角色。建议您拥有包含必要权限的 Logs Configuration Writer 角色。

  4. 为运行 Cloud KMS 的 Cloud 项目启用 Cloud KMS API

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

    日志路由器允许您使用任何区域中的密钥,因为单个组织可能会将数据路由到多个区域。如果组织中的所有数据或大多数数据限于一个区域,则建议使用区域与数据的区域范围匹配的密钥。

  6. 确定以下所需参数;在本页示例中,以下变量用于表示 Google Cloud 资源元数据:

    • ORGANIZATION_ID 是为其启用 CMEK 的 Google Cloud 组织的唯一数字标识符
    • KMS_PROJECT_ID 是运行 Cloud KMS 的 Cloud 项目的唯一字母数字标识符,由 Cloud 项目名称和随机分配的编号组成
    • KMS_KEY_NAME 是 Cloud KMS 密钥的资源名称。其格式如下所示:projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEYRING/cryptoKeys/KEY

    如需了解如何查找资源标识符,请参阅标识项目获取组织 ID

为组织启用 CMEK

完成前提条件步骤后,请按照以下说明为您的 Google Cloud 组织启用 CMEK。

确定服务帐号 ID

如需在组织级层配置 CMEK,您需要获取与要为其应用 CMEK 的组织关联的服务帐号 ID。运行以下命令:

API

  1. OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。

  2. 发出 GET 请求以获取与要为其启用 CMEK 的 Google Cloud 组织关联的服务帐号 ID:

     curl -H "Authorization: Bearer AUTH_TOKEN" \
        https://logging.googleapis.com/v2/organizations/ORGANIZATION_ID/cmekSettings
    

gcloud

gcloud logging cmek-settings describe --organization=ORGANIZATION_ID

运行此命令会为组织生成服务帐号(如果组织尚无服务帐号),并在 serviceAccountId 字段中返回 ID:

serviceAccountId: "SERVICE_ACCOUNT_ID@gcp-sa-logging.iam.gserviceaccount.com"

您只需为每个资源运行一次此配置过程。多次运行此命令会为 serviceAccountId 字段返回相同的值。

分配加密者/解密者角色

如需使用 CMEK,请将 Cloud KMS CryptoKey Encrypter/Decrypter 角色分配给服务帐号,以向该服务帐号授予使用 Cloud KMS 的权限:

API

  1. OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。 如需了解相关说明,请参阅 API 身份验证
  2. 创建一个包含以下信息的 JSON 文件:

    {
      "policy": {
        "bindings": {
          "role": "roles/cloudkms.cryptoKeyEncrypterDecrypter",
          "members": "serviceAccount:SERVICE_ACCOUNT_ID@gcp-sa-logging.iam.gserviceaccount.com"
        },
      }
    }
  3. 使用 cURL 通过 POST setIamPolicy 请求调用 Cloud KMS API:

    curl -X POST --data-binary @JSON_FILE_NAME.json \
    -H "Authorization: Bearer OAUTH2_TOKEN" \
    -H "Content-Type: application/json" \
    "https://cloudkms.googleapis.com/v1/KEY_RESOURCE:setIamPolicy"

gcloud

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

在命令中设置变量,如下所示:

  • SERVICE_ACCOUNT_ID 替换为您在上一步中确定的 serviceAccountId 值。

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

    • KMS_PROJECT_ID 替换为运行 Cloud KMS 的 Cloud 项目的 ID。
    • KMS_KEY_LOCATION 替换为 Cloud KMS 密钥的区域。
    • KMS_KEY_RING 替换为 Cloud KMS 密钥环的名称。
    • KMS_KEY 替换为 Cloud KMS 密钥的名称。

控制台

  1. 在 Google Cloud Console 中打开 Cloud Key Management Service 密钥浏览器。
    打开 Cloud KMS 密钥浏览器
  2. 点击包含所需密钥的密钥环的名称。

  3. 选中所需密钥对应的复选框。

    权限标签变为可用。

  4. 添加成员对话框中,指定您授予访问权限的 Logging 服务帐号的电子邮件地址。

  5. 选择角色下拉列表中,选择 Cloud KMS CryptoKey Encrypter/Decrypter

  6. 点击添加

配置 Cloud KMS 密钥

如需完成启用 CMEK,请将 Cloud KMS 密钥名称添加到您的组织。运行以下命令:

API

  1. OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。

  2. 创建一个包含以下信息的 JSON 文件:

    {
        "kms_key_name": "KMS_KEY_NAME"
    }
    
  3. 发出 PATCH 请求,更新将与您要为其启用 CMEK 的 Google Cloud 组织关联的 kms_key_name

    curl -X PATCH \
        -H "Authorization: Bearer AUTH_TOKEN \
        -H "Content-Type: application/json" \
        --data-binary @JSON_FILE_NAME
        https://logging.googleapis.com/v2/organizations/ORGANIZATION_ID/cmekSettings?update_mask="kms_key_name"
    

gcloud

gcloud logging cmek-settings update \
    --organization=ORGANIZATION_ID --kms-key-name=KMS_KEY_NAME

验证密钥的启用状态

如需验证您的组织是否已成功启用 CMEK,请运行以下命令:

API

  1. OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。

  2. 发出 GET 请求,获取与您要验证其密钥启用状态的 Google Cloud 组织关联的 CMEK 设置:

     curl -H "Authorization: Bearer AUTH_TOKEN" \
        https://logging.googleapis.com/v2/organizations/ORGANIZATION_ID/cmekSettings
    
    {
        "kmsKeyName": "KMS_KEY_NAME",
        "serviceAccountId": "SERVICE_ACCOUNT_ID@gcp-sa-logging.iam.gserviceaccount.com"
    }
    

gcloud

gcloud logging cmek-settings describe --organization=ORGANIZATION_ID

运行此命令会返回 Cloud KMS 密钥名称:

kmsKeyName: KMS_KEY_NAME
serviceAccountId: SERVICE_ACCOUNT_ID@gcp-sa-logging.iam.gserviceaccount.com

如果填充了 kmsKeyName 字段,则表明您的组织已启用 CMEK。

管理 Cloud KMS 密钥

以下部分介绍了如何针对 Cloud KMS 密钥执行何更改、撤消访问权限或停用操作。

更改 Cloud KMS 密钥

如需更改与您的组织关联的 Cloud KMS 密钥,请创建密钥并使用新的 Cloud KMS 密钥名称更新组织的 CMEK 设置。

运行以下命令:

API

  1. OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。

  2. 创建一个包含以下信息的 JSON 文件:

    {
        "kms_key_name": "NEW_KMS_KEY_NAME"
    }
    
  3. 发出 PATCH 请求以更新 kms_key_name

    curl -X PATCH \
        -H "Authorization: Bearer AUTH_TOKEN \
        -H "Content-Type: application/json" \
        --data-binary @JSON_FILE_NAME
        https://logging.googleapis.com/v2/organizations/ORGANIZATION_ID/cmekSettings?update_mask="kms_key_name"
    

gcloud

gcloud logging cmek-settings update \
    --organization=ORGANIZATION_ID
    --kms-key-name=NEW_KMS_KEY_NAME

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

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

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

运行以下命令:

API

  1. OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。

  2. 创建一个包含以下信息的 JSON 文件:

    revoke.json:
    {
      "policy": {
        "bindings": {
          "role": "roles/cloudkms.cryptoKeyEncrypterDecrypter",
          "members":
        },
      }
    }
    
  3. 发出 POST 请求:

    curl -X POST --data-binary @revoke.json -H "Authorization: Bearer
    ${OAUTH_TOKEN}" -H "Content-Type: application/json"
    "https://cloudkms.googleapis.com/v1/{$KEY}:setIamPolicy"
    

gcloud

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

为您的组织停用 CMEK

为您的组织停用 CMEK 只会移除将在未来执行 CMEK 政策的操作;之前应用的配置保持不变。

如需为您的组织停用 CMEK,请运行以下命令:

API

  1. OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。

  2. 创建一个包含以下信息的 JSON 文件:

    {
        "kms_key_name": ""
    }
    
  3. 发出 PATCH 请求以更新 kms_key_name

    curl -X PATCH \
        -H "Authorization: Bearer AUTH_TOKEN \
        -H "Content-Type: application/json" \
        --data-binary @JSON_FILE_NAME
        https://logging.googleapis.com/v2/organizations/ORGANIZATION_ID/cmekSettings?update_mask="kms_key_name"
    

gcloud

gcloud logging cmek-settings update --organization=ORGANIZATION_ID --clear-kms-key

如果您要销毁密钥,请参阅销毁和恢复密钥版本

Cloud KMS 密钥轮替的影响

当与 Google Cloud 组织关联的 Cloud KMS 密钥轮替使用时,日志路由器不会自动轮替临时灾难恢复文件的加密密钥。现有恢复文件将继续使用在创建它们时所用的密钥版本。新的恢复文件会使用当前的主要密钥版本。

将日志路由到支持的目的地

如果您使用日志接收器将日志路由到支持的目的地,请考虑以下事项:

  • Cloud Storage 支持使用 CMEK 路由日志。请按照本页面中的说明正确加密您的数据。如需了解详情,请参阅使用客户管理的加密密钥

    如果在将日志数据路由到 Cloud Storage 时,由于密钥不可用而导致数据丢失,您可以追溯性地将日志批量复制到 Cloud Storage。如需了解详情,请参阅复制日志条目

  • 默认情况下,BigQuery 会对静态存储的客户内容进行加密。如需了解详情,请参阅使用 Cloud Key Management Service 密钥保护数据

  • 默认情况下,Pub/Sub 会对静态存储的客户内容进行加密。如需了解详情,请参阅配置消息加密

外部密钥注意事项

当您使用 Cloud EKM 密钥时,Google 无法控制由外部管理的密钥在外部密钥管理合作伙伴系统中的可用性。

如果外部管理的密钥不可用,Cloud Logging 会继续重试访问密钥,并将传入的日志数据仅缓存最多一个小时。1 小时后,如果 Cloud Logging 仍然无法访问外部管理的密钥,则 Cloud Logging 将开始丢弃数据。

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

限制

以下是用于日志路由器的 CMEK 的已知限制。

仅限组织级层的配置

目前,只能为 Google Cloud 组织配置用于日志路由器的 CMEK。配置完成后,CMEK 会传播到 Google Cloud 组织中的所有 Cloud 项目和文件夹。

不支持将 CMEK 用于 Cloud Logging 存储

存储在 Cloud Logging 中的日志不支持使用 CMEK。您可以使用 CMEK 来保护日志路由器使用的临时灾难恢复文件以及在将日志路由到 Cloud Storage 的过程中使用的临时文件。

为了防止将日志条目写入 Cloud Logging 存储,您可以使用排除项过滤条件创建接收器。

灾难恢复文件不可用

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

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

如果 Logging 无法再访问 Cloud KMS 密钥,则 Logging 无法写入临时灾难恢复文件,而对于用户,查询将停止运行。即使在密钥访问恢复后,查询性能也可能会降低。

将日志路由到 Cloud Storage 也可能受到影响,因为日志路由器将无法写入协调路由所需的临时文件。如果在加密或解密数据时遇到错误,系统会向包含 Cloud KMS 密钥的 Cloud 项目发送通知。

客户端库可用性

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

配额

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

排查配置错误

以下部分介绍了如何查找和缓解常见的 CMEK 配置错误。

配置 CMEK 时,包含 Cloud KMS 密钥的 Cloud 项目会收到相关问题的通知。例如,在以下情况下,更新将会失败:如果 KMS_KEY_NAME 无效、如果关联的服务帐号没有所需的 Cloud Key Management Service CryptoKey Encrypter/Decrypter 角色或者如果已停用对该密钥的访问权限。

找出配置错误

如需查找和查看 CMEK 配置错误,请执行以下操作:

  1. 导航到 Google Cloud Console:

    转到 Google Cloud Console

  2. 选择包含加密密钥的 Cloud 项目。

    您可以通过运行以下命令来识别项目 ID:

    gcloud logging cmek-settings describe --organization=ORGANIZATION_ID
    
    

    运行此命令会返回以下内容:

     kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEYRING/cryptoKeys/KEY
     serviceAccountId: SERVICE_ACCOUNT_ID@gcp-sa-logging.iam.gserviceaccount.com
     

    kmsKeyName 字段的值包含密钥的项目 ID。

  3. 选择 Cloud Console 中的活动标签页。

  4. 检查 Cloud Logging Cloud Logging CMEK 配置错误通知。

    每个错误通知都包含可用于缓解问题的步骤:

    错误 建议
    加密密钥权限被拒 与您的 Cloud 项目关联的 Logging 服务帐号没有足够的 IAM 权限,无法对指定的 Cloud KMS 密钥执行操作。按照错误消息或授予加密/解密权限中的说明授予适当的 IAM 权限。
    加密密钥已停用 指定的 Cloud KMS 密钥已停用。按照错误中的说明重新启用密钥。
    加密密钥已销毁 指定的 Cloud KMS 密钥已销毁。按照错误中或配置 Cloud KMS 密钥中的说明,使用其他密钥配置 CMEK 加密。

验证密钥的可用性

如需验证密钥的可用性,请运行以下命令以列出所有密钥:

gcloud kms keys list \
--location=KMS_KEY_LOCATION \
--keyring=KMS_KEY_RING

此命令以表格格式返回每个密钥的相关信息。输出的第一行是列名称列表:

NAME PURPOSE ...

验证 Cloud KMS 密钥在命令的输出中是否被列为 ENABLED,以及密钥的用途是否为对称加密:PURPOSE 列必须包含 ENCRYPT_DECRYPT,且 PRIMARY_STATE 列必须包含 ENABLED

如有必要,请创建新密钥

验证权限配置

与组织的 CMEK 设置关联的服务帐号必须拥有已配置密钥的 Cloud KMS CryptoKey Encrypter/Decrypter 角色。

如需列出密钥的 IAM 政策,请运行以下命令:

gcloud kms keys get-iam-policy KMS_KEY_NAME

如有必要,请向密钥添加包含 Cloud KMS CryptoKey Encrypter/Decrypter 角色的服务帐号。