为日志路由器启用客户管理的加密密钥

本页面介绍了如何为 Cloud Logging 中的日志路由器启用客户管理的加密密钥 (CMEK),以满足您的合规性需求。您可以在 Cloud Key Management Service 中创建、控制和管理用于保护您的数据的加密密钥,而无需由 Google 进行管理。

如需查看加密选项的摘要,请转到静态加密

用于日志路由器的 CMEK

通过 CMEK,您可以控制用于加密静态数据的密钥。您可用它来满足 Google Cloud 组织的以下要求:

  • 合规性和内部控制:CMEK 可用于控制您在 Google Cloud 产品中存储的敏感数据或受监管数据。此控制措施通常是内部合规程序中记录的一项要素;该要素可能会向监管机构披露,且难以更改。

  • 高级加密:您的组织可能设有我们的默认静态加密不提供的高级加密要求(例如快速密钥删除)。CMEK 通过与 Cloud KMS 集成,提供了满足这些要求的途径。

  • 法规要求:您的组织可能需要根据政府法规(例如出口管理条例 (EAR))控制敏感材料。

静态加密已经在各项 Google Cloud 服务中提供,包括日志路由器中。虽然目前无法对 Cloud Logging 中存储的日志使用 CMEK,但您可以使用 CMEK 来保护日志路由器使用的临时灾难恢复文件以及在导出到 Cloud Storage 的过程中使用的临时文件。如需了解详情,请转到限制

如需了解日志路由器,请转到概览

使用入门

  1. 创建或识别要在其中运行 Cloud KMS 的 Google Cloud 项目。
  2. 为运行 Cloud KMS 的 Google Cloud 项目启用 Cloud KMS API
  3. 为运行 Cloud KMS 的 Google Cloud 项目创建密钥环和密钥

    请注意,密钥的区域范围应与数据的区域范围相匹配。Cloud KMS 位置会列出可用区域。

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

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

    如需了解如何识别这些参数,请转到识别项目获取组织 ID

为组织启用 CMEK

完成开始使用步骤后,请按照以下说明为您的 Google Cloud 组织启用 CMEK。

授予加密和解密权限

确定相应的服务帐号 ID,并向该服务帐号授予使用 Cloud KMS 密钥的权限。

确定服务帐号 ID

REST API

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

  2. 发出 GET 请求以获取与要启用 CMEK 的 Google Cloud 组织关联的 serviceAccountId

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

gcloud

如需获取与希望启用 CMEK 的 Google Cloud 组织关联的 serviceAccountId,请运行以下 gcloud 命令:

gcloud alpha logging cmek-settings describe --organization=[ORGANIZATION_ID]

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

分配 Encrypter/Decrypter 角色

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

REST API

  1. OAuth 2.0 Playground 获取授权访问令牌。将 Playground 配置为使用您自己的 OAuth 凭据。
  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]

[KMS_PROJECT_ID] 替换为运行 Cloud KMS 的 Google Cloud 项目的 ID,将 [KMS_KEY_LOCATION][KMS_KEY_RING][KMS_KEY_RING][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 密钥

使用 Cloud KMS 密钥名称更新 Google Cloud 组织的 CMEK 设置,为您的组织启用该功能。

如果 [KMS_KEY_NAME] 无效,关联的服务帐号没有所需的 encrypter/decrypter 角色,或者系统已禁止访问该密钥,则这些更新将失败。

REST 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 命令:

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

验证密钥的启用状态

使用 Cloud KMS 密钥名称更新 Google Cloud 组织的 CMEK 设置,以验证您的组织是否启用了 CMEK。

REST API

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

  2. 发出 GET 请求,获取与您要验证其密钥启用状态的 Google Cloud 组织关联的 CMEK 设置。如果已填充 kms_key_name,则表明您的组织已启用 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 命令,获取与您要验证其密钥启用状态的 Google Cloud 组织关联的 CMEK 设置。如果已填充 kmsKeyName,则表明您的组织已启用 CMEK:

gcloud alpha logging cmek-settings describe --organization=[ORGANIZATION_ID]

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

管理 Cloud KMS 密钥

下文介绍了如何更改、撤消 Cloud KMS 密钥的访问权限或删除 Cloud KMS 密钥。

更改 Cloud KMS 密钥

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

REST 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 命令:

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

如果 [KMS_KEY_NAME] 无效,关联的服务帐号没有所需的 encrypter/decrypter 角色,或者系统已禁止访问该密钥,则此更新将失败。

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

任何时候,如需撤消 Logging 对 Cloud KMS 密钥的访问权限,请取消该密钥的 Cloud IAM 权限。

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

REST 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 命令:

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

REST 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 命令,更新与要为其停用 CMEK 的组织关联的 serviceAccountId

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

如果 [KMS_KEY_NAME] 无效,关联的服务帐号没有所需的 encrypter/decrypter 角色,或者系统已禁止访问该密钥,则此更新将失败。

如需了解如何销毁密钥,请转到销毁和恢复密钥版本

Cloud KMS 密钥轮替的影响

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

用于导出功能的 CMEK

如果您使用日志接收器向其他目标位置导出日志,则必须正确配置 CMEK 以保护在该目标位置存储的数据。

如果目标位置已经过 CMEK 加密,则 Cloud Storage 支持使用 CMEK 进行日志导出。如需了解详情,请转到使用客户管理的加密密钥

另外两个 Logging 接收器目标位置 BigQuery 和 Pub/Sub 尚不支持使用 CMEK 保护 Cloud Logging 导出的数据。

限制

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

仅限组织级层的配置

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

不支持将 CMEK 用于 Cloud Logging 存储

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

为了防止将日志条目写入 Cloud Logging 存储,您可以排除这些条目。如需查看相关说明,请转到使用排除项查询

灾难恢复文件不可用

如果 Logging 无法再访问 Cloud KMS 密钥,用户体验可能会受到严重影响,并且可能导致数据丢失。用户将无法再访问这些受 CMEK 保护的临时灾难恢复文件中以及导出到 Cloud Storage 时所用的临时文件中的数据。

如果符合以下条件,Cloud KMS 密钥会被视为可由 Logging 使用和访问:

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

如果 Cloud KMS 密钥不再可用,则日志路由器将无法写入临时灾难恢复文件。在此期间处理的数据将没有可用的灾难恢复文件。

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

客户端库可用性

Logging 客户端库不支持用于配置 CMEK 的命令。

价格

如需详细了解日志记录用量限制,请参阅配额和限制。如需详细了解可能产生的费用,请参阅价格

排查配置错误

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

找出配置错误

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

  1. 导航到 Google Cloud Console:

    转到 Google Cloud Console

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

    您可通过以下 gcloud 命令找出项目 ID:

    gcloud alpha 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
    

    命令输出中的 Cloud KMS 密钥的全名在 kmsKeyName 字段中包含项目 ID。

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

  4. 查看所选项目的 Cloud Logging Stackdriver Logging CMEK 配置错误通知。

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

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

若要解决该问题,请按错误通知消息中列出的步骤操作。

验证密钥的可用性

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

    gcloud kms keys list 
--location=[KMS_KEY_LOCATION]
--keyring=[KMS_KEY_RING]

NAME    PURPOSE   ALGORITHM   PROTECTION_LEVEL  LABELS  PRIMARY_ID  PRIMARY_STATE
<var>[KMS_KEY_NAME]</var>  ENCRYPT_DECRYPT  GOOGLE_SYMMETRIC_ENCRYPTION  SOFTWARE  1  ENABLED

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

如有必要,请创建一个新密钥;如需查看说明,请参阅上文。

验证权限配置

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

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

    gcloud kms keys get-iam-policy [KMS_KEY_NAME]
   

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