【问题标题】:Why is my S3 bucket policy denying cross account access?为什么我的 S3 存储桶策略拒绝跨账户访问?
【发布时间】:2021-12-02 05:48:15
【问题描述】:

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

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

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

存储桶是公共的,我想授予对特定公共 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 中的存储桶?

【问题讨论】:

  • 您的存储桶策略中有多个语句。其中之一是拒绝。拒绝胜过允许。您需要修改 Deny 语句,使其在从账户 B 访问存储桶时不生效。
  • 或者,如果来自账户 A 的 VPC 或特定 IP(并且没有任何拒绝子句),则重新调整策略以仅允许相关 S3 操作。

标签: amazon-web-services amazon-s3 amazon-ec2 amazon-iam


【解决方案1】:

您的 S3 存储桶策略中有明确的 Deny 语句,它会覆盖 Allow 语句,因此请更改您的 Deny 语句以允许账户 B 的角色主体。


AWS Identity and Access Management User Guide 中突出显示了此策略评估逻辑:

在这种情况下,您将落入第一个红色方块,这将做出最终决定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"
                    ]
                }
            }
        }
    ]
}

【讨论】:

  • 谢谢,我没有找到任何名为NotPrencipal的条件,你的意思是用"Principal": "*"替换它吗?
  • 我收到Invalid policy syntax.
  • @DaniWol。啊 - You cannot use the NotPrincipal element in an IAM identity-based policy. - 对不起!答案应该是固定的。
猜你喜欢
  • 2018-01-10
  • 2019-04-23
  • 2021-06-28
  • 2023-03-17
  • 2018-05-19
  • 2021-04-25
  • 2019-04-20
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多