尽管存储桶策略正确,跨账户 S3 访问仍被拒绝

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

我正在尝试设置对 S3 存储桶的跨账户访问,允许来自两个不同 AWS 账户(账户 A 和账户 B)的特定用户访问该存储桶。我已将存储桶策略配置为允许两个账户中的特定 IAM 用户执行 s3:GetObject 等操作。虽然账户 A 的用户可以成功访问存储桶,但账户 B 的用户在尝试列出或访问存储桶中的对象时会收到“AccessDenied”错误。

这是我附加到存储桶的策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Deny-all-unauthorized-access",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::AccountA-Id:user/AccountA-user1", 
                    "arn:aws:iam::AccountA-Id:user/AccountA-user2", 
                    "arn:aws:iam::AccountA-Id:user/AccountA-user3", 
                    "arn:aws:iam::AccountB-Id:user/AccountB-user1"
                ]
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::occ-infra-s3-bucket",
                "arn:aws:s3:::occ-infra-s3-bucket/*"
            ]
        },
        {
            "Sid": "Allow-actions",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::AccountA-Id:user/AccountA-user1", 
                    "arn:aws:iam::AccountA-Id:user/AccountA-user2", 
                    "arn:aws:iam::AccountA-Id:user/AccountA-user3", 
                    "arn:aws:iam::AccountB-Id:user/AccountB-user1"
                ]
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::myBucket", 
                "arn:aws:s3:::myBucket/*"
            ]
        }
    ]
}

我希望两个帐户中的指定用户都能够根据配置的允许语句以及他们被排除在拒绝之外的事实来列出和访问存储桶内容。但是,只有账户 A 的用户才能访问该存储桶。当帐户 B 用户尝试访问它时,会遇到以下错误:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

在 CloudTrail 中,我注意到账户 A 用户的 userIdentity 正确地将其显示为 IAMUser,而对于账户 B 用户,userIdentity 显示为 AWSAccount,这似乎不正确。以下是帐户 A 用户的相关日志条目:

"userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDAQB7XESH6TMDGHIUEI",
    "arn": "arn:aws:iam::AccountA-Id:user/AccountA-user1",
    "accountId": "AccountA-Id",
    "accessKeyId": "AKIAQB7JHUY87K7JHJ6X",
    "userName": "AccountA-user1"
}

这是帐户 B 用户的日志条目:

"userIdentity": {
    "type": "AWSAccount",
    "principalId": "AIDATACUJHYGDFERMLSJ7",
    "accountId": "AccountB-Id"
}

如果我从存储桶策略中删除拒绝语句,账户 B 用户就可以毫无问题地访问存储桶。我相信这表明 AWS 无法正确识别账户 B 中的外部 IAM 用户,并且由于 NotPrincipal 条件而拒绝他的访问。

我还通过运行

aws sts get-caller-identity
确认帐户 B 用户已正确进行身份验证,这将返回预期结果:

{
    "UserId": "AIDATACUJHYGDFERMLSJ7",
    "Account": "AccountB-Id",
    "Arn": "arn:aws:iam::AccountB-Id:user/AccountB-user1"
}

AWS S3 我是 跨账户访问 桶策略

amazon-web-services amazon-s3 amazon-iam amazon-policy
1个回答
0
投票

授予跨账户访问权限时,必须在两个账户中配置权限。

例如,假设您有:

  • User-A
     中的 
    IAM 用户 
    Account-A
  • S3 桶
    Bucket-B
    Account-B

您需要配置以下内容:

  • User-A
    需要一个授予访问权限的 IAM 策略
    Bucket-B
    (因为 IAM 用户默认没有权限,因此除非策略授予此访问权限,否则他们将不被允许使用 S3)
  • Bucket-B
    需要一个存储桶策略来授予
    User-A
    访问存储桶的权限

另请注意,Amazon S3 存储桶默认是私有的。因此,您不应该创建

Deny
策略,除非您有特定需要撤销在其他地方授予的权限。例如,如果管理员有权访问“所有 S3 存储桶”,但您随后特别想要撤销他们对敏感存储桶的访问权限,那么您将使用
Deny
策略。否则,最好避免它们,因为它们可能会导致政策评估方式混乱。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.