使用默认 kms 密钥进行 s3 跨帐户访问

lea*_*hru 7 amazon-s3 amazon-web-services amazon-iam

我的帐户中有一个 s3 存储桶,它使用默认aws-kms密钥启用了 SSE。我希望向我的存储桶提供另一个帐户的读取权限。

我已按照以下链接提供访问权限: https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-denied-error-s3/

我正在使用aws s3 ls <s3://bucket_name>aws s3 cp <path to s3 object> . 下载该对象

我尝试在未启用 SSE 的情况下提供对存储桶的跨账户访问。我成功地检索了存储桶详细信息并下载了对象。但是,当我尝试从启用了 SSE 的存储桶下载对象时,出现An error occurred (AccessDenied) when calling the GetObject operation: Access Denied异常。我可以列出启用 SSE 的存储桶中的对象,但不能下载它们。

我的存储桶政策:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<Account_B_AWS_Account_Id>:role/ReadOnly"
                ]
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket-name>",
                "arn:aws:s3:::<bucket-name>/*"
            ]
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
              "AWS": [
                    "arn:aws:iam::<Account_B_AWS_Account_Id>:role/ReadOnly"
              ]
            },
            "Action": [
              "kms:Encrypt",
              "kms:Decrypt",
              "kms:ReEncrypt*",
              "kms:GenerateDataKey*",
              "kms:DescribeKey"
            ],
            "Resource": "*"
        }
    ]
}

Run Code Online (Sandbox Code Playgroud)

账户中的 ReadOnly 角色拥有所有 aws 服务的读取权限。此外,我还为该角色附加了以下策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SomeProperites",
            "Effect": "Allow",
            "Action": [
                "s3:GetLifecycleConfiguration",
                "s3:ListBucketByTags",
                "s3:GetBucketTagging",
                "s3:GetInventoryConfiguration",
                "s3:GetObjectVersionTagging",
                "s3:GetBucketLogging",
                "s3:ListBucketVersions",
                "s3:GetAccelerateConfiguration",
                "s3:ListBucket",
                "s3:GetBucketPolicy",
                "s3:GetEncryptionConfiguration",
                "s3:GetObjectAcl",
                "s3:GetObjectVersionTorrent",
                "s3:GetBucketRequestPayment",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectTagging",
                "s3:GetMetricsConfiguration",
                "s3:GetBucketPolicyStatus",
                "s3:GetBucketPublicAccessBlock",
                "s3:ListBucketMultipartUploads",
                "s3:GetBucketWebsite",
                "s3:GetBucketVersioning",
                "s3:GetBucketAcl",
                "s3:GetBucketNotification",
                "s3:GetReplicationConfiguration",
                "s3:ListMultipartUploadParts",
                "s3:GetObject",
                "s3:GetObjectTorrent",
                "s3:DescribeJob",
                "s3:GetBucketCORS",
                "s3:GetAnalyticsConfiguration",
                "s3:GetObjectVersionForReplication",
                "s3:GetBucketLocation",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::<bucket-name>"
        },
        {
            "Sid": "SomePermission",
            "Effect": "Allow",
            "Action": [
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:ListJobs",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "KMSWriteKey",
            "Effect": "Allow",
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我相信由于 KMS 解密,我无法获取对象,因为我可以使用禁用 SSE 的存储桶进行下载。我的上述政策正确吗?如果使用默认 kms 密钥,我是否需要提供一些额外的权限?是否可以使用默认的 kms 密钥并提供跨帐户访问?

小智 9

-> 使用默认 aws-kms 密钥启用 SSE

这是 AWS Managed KMS 密钥,您只能查看其密钥策略。您无法编辑其密钥策略。因此,您将无法使用 SSE-KMS AWS 托管密钥进行跨账户 s3 对象共享。

请切换到使用SSE-KMS Customer Managed Key并通过所选 KMS CMK 中的操作授予跨账户主体descrypt


Jor*_*cia -1

要向账户 B 中的用户授予对账户 A 中 AWS KMS 加密存储桶的访问权限,您必须拥有以下权限:

  • 账户 A 中的存储桶策略必须授予账户 B 访问权限。
  • 账户 A 中的 AWS KMS 密钥策略必须向账户 B 中的用户授予访问权限。
  • 账户 B 中的 AWS Identity and Access Management (IAM) 用户策略必须授予用户对账户 A 中的存储桶和密钥的访问权限。

请在此处查看更多信息:

https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-denied-error-s3/

  • 该问题明确提到“默认 kms 密钥”。除非假定同一账户中的角色,否则无法使用 SSE-S3 进行跨账户访问。 (7认同)