在 AWS Glue 中,如何解决 AWS KMS 加密文字访问被拒绝的 400 错误?
我在运行 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:Decrypt 和 kms: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"
相关信息
相关内容
- 已提问 7 个月前lg...
- 已提问 2 个月前lg...
- 已提问 9 天前lg...
- 已提问 2 个月前lg...
- AWS 官方已更新 9 个月前