为什么我的 S3 存储桶策略拒绝跨账户访问?

Why is my S3 bucket policy denying cross account access?

我在账户 A 中有一个 S3 存储桶。

此存储桶已使用 ACL 授权 与帐户 B 的规范 ID(具有所有权限)共享。

当存储桶策略为空时,账户 B 中的 EC2 实例能够列出账户 A 上的 S3 存储桶。

存储桶是 public,我想授予对特定 public IP 和帐户 A 上配置的特定 VPC 的访问权限。

这是存储桶策略:

{
    "Version": "2012-10-17",
    "Id": "S3_Bucket_Policy",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::Account_B_Number:role/EC2_Role"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::s3_bucket_name",
                "arn:aws:s3:::s3_bucket_name/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::s3_bucket_name",
                "arn:aws:s3:::s3_bucket_name/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:SourceVpc": "vpc_id"
                },
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "67.100.20.15/32",
                        "79.190.30.2/32"
                    ]
                }
            }
        }
    ]
}

我可以从以下 IP 地址和指定的 VPC 访问 S3 存储桶,但是,我无法从账户 B 的 EC2 实例访问该存储桶。

EC2 实例具有以下分配的角色和以下策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": [
                "arn:aws:s3:::s3_bucket_name",
                "arn:aws:s3:::s3_bucket_name/*"
            ]
        }
    ]
}

为什么我无法从账户 B 访问账户 A 中的存储桶?

您的 S3 存储桶策略中有一个明确的 Deny 语句,它覆盖了 Allow 语句,因此更改您的 Deny 语句以允许账户 B 的角色校长.


此策略评估逻辑在 AWS Identity and Access Management 中突出显示 用户指南

在这种情况下,您将落入第一个红色方块,这将使最终决定成为 Deny


更改您的 StringNotEquals 以同时检查帐户 B 的 aws:PrincipalArn 角色,这样策略就不会再拒绝帐户 B 的角色:

"Condition": {
    "StringNotLike": {
        "aws:SourceVpc": "vpc_id",
        "aws:PrincipalArn": "arn:aws:iam::Account_B_Number:role/EC2_Role"
    },
    "NotIpAddress": {
        "aws:SourceIp": [
            "67.100.20.15/32",
            "79.190.30.2/32"
        ]
    }
}

完整的工作示例:

{
    "Version": "2012-10-17",
    "Id": "S3_Bucket_Policy",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::Account_B_Number:role/EC2_Role"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::s3_bucket_name",
                "arn:aws:s3:::s3_bucket_name/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::s3_bucket_name",
                "arn:aws:s3:::s3_bucket_name/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:SourceVpc": "vpc_id",
                    "aws:PrincipalArn": "arn:aws:iam::Account_B_Number:role/EC2_Role"
                },
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "67.100.20.15/32",
                        "79.190.30.2/32"
                    ]
                }
            }
        }
    ]
}