在 AWS Glue 中,如何解决 AWS KMS 加密文字访问被拒绝的 400 错误?

2 分钟阅读
0

我在运行 AWS Glue 爬网程序或 AWS Glue ETL 任务时遇到 400 错误。

简短描述

使用 AWS Glue 时,当您尝试访问 Amazon Simple Service Solution (Amazon S3) 存储桶等 AWS 资源时,可能会收到此错误:

"The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access."(加密文字指的是不存在的客户主密钥、不在此区域的客户主密钥或不允许您访问的客户主密钥。)

当您使用 AWS Glue 任务或爬网程序访问任何使用 AWS Key Management Service (AWS KMS) 密钥加密的 AWS 服务时,您会收到此错误。该错误很可能是由于以下原因之一而导致的:

  • 尝试访问加密密钥的主体没有所需的 AWS KMS 权限
  • AWS KMS 密钥不存在或不存在于特定的 AWS 区域

解决方法

**注意:**如果您在运行 AWS 命令行界面(AWS CLI)命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

检查您的 AWS Glue 角色策略是否具有所需的权限

首先,检查您使用的 AWS Glue 角色策略是否具有访问资源的 AWS KMS 密钥所需的权限。

例如,假设您有一个名为 AWSGlue-MyGlueCustomRole 的 AWS Glue 角色。此角色正在访问使用 AWS KMS 密钥 arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 加密的 S3 存储桶。除其他权限外,AWS Glue 角色策略还必须具有以下上下文:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07"
        }
    ]
}

检查您的 AWS KMS 密钥策略是否允许 AWS Glue 角色

AWS KMS 密钥策略必须允许 AWS Glue 角色作为其允许实体的一部分。

使用前面的示例,AWS KMS 密钥 arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 策略必须附加以下权限:

{
    "Sid": "Allow use of the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": [
            "arn:aws:iam::XXXXXXXX9645:role/AWSGlue-MyGlueCustomRole "
        ]
    },
    "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
    ],
    "Resource": "*"
}

确保 AWS KMS 密钥与您的 AWS Glue 任务位于同一区域

要检查您的 AWS KMS 密钥存在于哪个区域,请按照以下步骤操作:

1.    打开 AWS KMS 控制台

2.    选择出现错误的区域。

3.    在导航窗格中,选择 AWS 托管式密钥客户托管密钥。然后搜索您正在使用的 AWS KMS 密钥。您也可以使用 AWS CLI 搜索 AWS KMS 密钥。如果该区域中不存在该密钥,则以下命令会返回 NotFoundException 错误:

aws kms describe-key --key-id <Key-ID> --region <region-name>

注意:请务必将此示例中的 <Key-ID><region-name> 替换为您正在使用的区域的密钥 ID 和名称。

4.    检查 AWS CloudTrail API 调用 kms:Decryptkms:Encrypt,看看是否观察到任何故障。或者,您可以使用 kms.amazonaws.com 作为事件源来查看所有事件日志。

跨账户示例

如果 AWS Glue 角色和 AWS KMS 密钥位于不同的账户中,请使用客户托管密钥,而不是 AWS 托管式密钥。只有当主体来自同一个账户时,才能使用 AWS KMS 密钥。您无法修改 AWS 托管式密钥的密钥策略。当您访问第二个账户中的 AWS KMS 密钥时,请确保源和目标都有权限。

假设您想要允许账户 Y 中的 AWS Identity and Access Management (IAM) 用户 X 访问账户 Z 中的 AWS KMS 密钥。在这种情况下,IAM policy 必须包含所需的 AWS KMS 操作。AWS KMS 密钥策略必须允许执行相同的操作。有关更多信息,请参阅允许其他账户中的用户使用 AWS KMS 密钥

以下是从跨账户访问 AWS KMS 密钥时发生的最常见问题。

如果错误消息是由服务控制策略(SCP)引起的,请检查您账户上所有应用的 SCP。这可以帮助您识别限制 kms:Decrypt 操作的 SCP。更新有影响的 SCP,然后重试您的操作。有关更多信息,请参阅列出附加到根、OU 或账户的策略更新 SCP。参阅此错误的以下示例:

User: arn:aws:iam::XXXXXXXX9645:user/KMSDemO is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 with an explicit deny in a service control policy"

如果 IAM 实体附加了权限边界,则该边界将设置实体拥有的最大权限。检查 IAM 主体的权限边界,确保允许执行所需的 AWS KMS 解密操作。然后,再次尝试该操作。参阅此错误的以下示例:

User: arn:aws:iam::XXXXXXXX9645:user/KMSDemO is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 because no permissions boundary allows the kms:Decrypt action"

如果您使用 VPC 端点连接到 AWS KMS,请检查应用的 VPC 端点策略。确保策略中允许 kms:Decrypt 操作。参阅此错误的以下示例:

User: arn:aws:iam::XXXXXXXX9645:user/KMSDemO is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 because no VPC endpoint policy allows the kms:Decrypt action"

相关信息

在 AWS Glue 中设置加密

AWS KMS 中的密钥策略

AWS 官方
AWS 官方已更新 1 年前