KMS 在由 AWS Managed Key 加密的 AWS 跨账户 S3 PutObject 中未发现异常

问题描述 投票:0回答:3

我正在尝试将账户 B 中的 Glue 中的虚拟文件放入账户 A 中的 S3 存储桶。S3 存储桶(test-bucket)正在启用 AWS-KMS 加密并启用 aws/s3 托管密钥。

  1. 我在账户 A-S3 存储桶(测试存储桶)中添加了以下权限:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Deny PutObject if NOT using correct KMS Encryption Key",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::test-bucket/*",
            "Condition": {
                "StringNotEquals": {
                    "s3:x-amz-server-side-encryption": "",
                    "s3:x-amz-server-side-encryption-aws-kms-key-id": "<ARN_KMS_ACCOUNT_A>"
                }
            }
        },
        {
            "Sid": "Allow Glue Role in Application account to put objects in the S3 bucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<IAM_Glue_Role_ARN>"
            },
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::test-bucket",
                "arn:aws:s3:::test-bucket/*"
            ]
        },
        {
            "Sid": "Only allow writes to my bucket with bucket owner full control",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<IAM_Glue_Role_ARN>"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::test-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}
  1. 向账户 B 中的 IAM Glue 角色添加了以下策略
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:Get*",
                "s3:List*",
                "s3:Put*"
            ],
            "Resource": "arn:aws:s3:::test-bucket*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "<ARN_KMS_ACCOUNT_A>",
            "Effect": "Allow"
        }
    ]
}

这是我的胶水代码:

s3.put_object(
    Bucket='output',
    Key='_SUCCESS',
    ServerSideEncryption='aws:kms',
    SSEKMSKeyId='<ARN_KMS_ACCOUNT_A>'
)

从帐户 B Glue 运行此代码时出现以下错误:

ClientError: An error occurred (KMS.NotFoundException) when calling the PutObject operation: Invalid arn ap-southeast-2

对此有什么想法吗?

amazon-web-services amazon-s3 aws-glue amazon-kms
3个回答
0
投票

有几件事:

  1. 对于存储桶上的策略,
    Deny
    权限应始终位于所有
    Allow
    权限之后。并删除
    condition
    权限上的
    Deny
    。您想要阻止所有未经授权的流量。
  2. 使用托管 KMS 密钥。在该密钥上,授予
    kms:decrypt
    给该密钥策略上的粘合角色。

0
投票

此处所述,您必须使用加密密钥的完整 ARN,这样跨账户才能成功。使用别名或密钥 ID 不起作用。

  • 跨账户操作使用加密时应注意以下事项: 当请求时未提供 AWS KMS 密钥 Amazon 资源名称 (ARN) 或别名,也未通过存储桶的默认加密配置提供时,将使用 AWS 托管密钥 (aws/s3)。
  • 如果您使用与 KMS 密钥位于同一 AWS 账户中的 AWS Identity and Access Management (IAM) 委托人上传或访问 S3 对象,则可以使用 AWS 托管密钥 (aws/s3)。
  • 如果您想授予对 S3 对象的跨账户访问权限,请使用客户管理的密钥。您可以配置客户管理密钥的策略以允许从其他帐户进行访问。
  • 如果指定您自己的 KMS 密钥,您应使用完全限定的 KMS 密钥 ARN。使用 KMS 密钥别名时,请注意 AWS KMS 将解析请求者账户中的密钥。这可能会导致数据使用属于请求者而非存储桶管理员的 KMS 密钥进行加密。
  • 您必须指定您(请求者)已被授予加密权限的密钥。有关更多信息,请参阅 AWS Key Management Service Developer Guide 中的允许关键用户使用 KMS 密钥进行加密操作。

S3 存储桶应该看起来像这样


0
投票

AWS 托管密钥

aws/s3
只能在同一帐户中使用,即密钥存在的位置(在您的情况下,其帐户 A)。您可以尝试使用账户 B 中的
aws/s3
CMK,或者在账户 A 中创建客户管理的 CMK 并按照此处的步骤与账户 B 共享。

© www.soinside.com 2019 - 2024. All rights reserved.