排查 CMEK 和默认设置错误

本文档介绍了如何查找和缓解常见的 CMEK 配置错误,以及如何识别在设置默认资源位置时发生的错误。

排查默认资源位置设置问题

您尝试更新组织或文件夹的默认存储位置,但命令失败,并显示类似于以下内容的错误:

ERROR: (gcloud.logging.settings.update) INVALID_ARGUMENT: The KMS key location must match the storage location. Received KMS key location: us-central1, storage location: us-west1
- '@type': type.googleapis.com/google.rpc.DebugInfo
  detail: '[ORIGINAL ERROR] generic::invalid_argument: The KMS key location must match
    the storage location. Received KMS key location: us-central1, storage location:
    us-west1 [google.rpc.error_details_ext] { message: "The KMS key location must
    match the storage location. Received KMS key location: us-central1, storage location:
    us-west1" }'

如需解决此错误,请将组织或文件夹的默认存储位置设置为与该组织或文件夹的 Cloud Key Management Service 密钥位置一致。

排查 CMEK 问题

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

配置 CMEK 后,至少会发生以下情况之一:

  • 您从 Cloud Logging 收到了关于 CMEK 访问权限问题的通知。

  • 您注意到,在组织或文件夹中创建新 Trusted Cloud 项目时,_Default_Required 日志存储桶未启用 CMEK。

  • 从启用 CMEK 的日志存储桶中读取数据时,或者尝试创建或更新日志存储桶时,您收到错误消息。

通知会提供有关失败的信息,并包含可用于缓解问题的操作:

错误 建议
加密密钥权限被拒

与您的 Trusted Cloud 项目关联的 Logging 服务账号没有足够的 IAM 权限,无法对指定的 Cloud KMS 密钥执行操作。请按照错误消息中的说明操作,或参阅以下文档:

加密密钥已停用 指定的 Cloud KMS 密钥已停用。按照错误中的说明重新启用密钥。
加密密钥已销毁

指定的 Cloud KMS 密钥已销毁。请按照说明操作或参阅以下文档:

确定包含 Cloud KMS 密钥的项目

如需确定包含日志存储桶、文件夹或组织使用的加密密钥的 Trusted Cloud 项目的 ID,请执行以下操作:

项目

gcloud logging settings describe --project=PROJECT_ID

在运行命令之前,请将 PROJECT_ID 替换为包含日志存储桶的项目 ID。

文件夹

gcloud logging settings describe --folder=FOLDER_ID

在运行命令之前,请将 FOLDER_ID 替换为文件夹的 ID。

单位

gcloud logging settings describe --organization=ORGANIZATION_ID

在运行命令之前,请将 ORGANIZATION_ID 替换为组织的 ID。

上面的命令会返回类似于以下内容的信息:

kmsServiceAccountId: KMS_SERVICE_ACCT_NAME@gcp-sa-logging.s3ns-system.iam.gserviceaccount.com
loggingServiceAccountId: SERVICE_ACCT_NAME@gcp-sa-logging.s3ns-system.iam.gserviceaccount.com

对于组织和文件夹,还会返回以下字段:

kmsKeyName: projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KEY

kmsKeyName 字段的值包含存储密钥的 Trusted Cloud 项目。

验证密钥的可用性

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

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 角色的服务账号。