【问题标题】:S3 bucket policy restricting to IP CIDR rangeS3 存储桶策略限制为 IP CIDR 范围
【发布时间】:2018-05-05 06:07:26
【问题描述】:

我正在尝试将 S3 存储桶访问限制为几个不同子网中的 EC2 实例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Principal": {"AWS": "*"},
            "Resource": [
                "arn:aws:s3:::test.bucket",
                "arn:aws:s3:::test.bucket/*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "192.168.129.64/27",
                        "192.168.129.96/27",
                        "192.168.128.64/26"
                    ]
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": "s3:*",
            "Principal": {"AWS": "*"},
            "Resource": [
                "arn:aws:s3:::test.bucket",
                "arn:aws:s3:::test.bucket/*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "192.168.129.64/27",
                        "192.168.129.96/27",
                        "192.168.128.64/26"
                    ]
                }
            }
        }
    ]
}

我知道在此政策的特殊性方面还有其他问题,但我已尝试使其尽可能简单,但条件除外。不幸的是,从 IP 地址为192.168.129.100 的 ec2 实例尝试简单的aws s3 ls s3://test.bucket 失败,访问被拒绝。这项政策有效地将我拒之门外。

我不知道我错过了什么。我什至尝试在 IpAddressNotIpAddress 条件前添加 ForAnyValueForAllValues

【问题讨论】:

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


    【解决方案1】:

    S3 存储桶策略中指定的 IP 地址是指 S3 Web 端点接收请求的 IP 地址。有几件事会影响这一点。

    在您的策略中,您指定了一个192.168.*.* CIDR 块,它是一个内部 IP 地址。

    1. 如果您从 AWS 网络外部(例如,在您的本地计算机上)执行 aws s3 ls 命令,则 AWS 将看不到您的本地 192.168.29.100 IP 地址。相反,它会看到您面向公众的 IP 地址。检查诸如What Is My IP Address? 之类的工具,看看你的工具是什么。我认为 AWS 有类似的工具,但我现在找不到。

    如果是这种情况,您需要使用您的公开 IP 地址而不是您的私人 IP 地址来更新您的政策。

    1. 如果您从 AWS 网络内部(例如,在 EC2 实例上)执行 aws s3 ls 命令,并且您的 VPC 没有启用“S3 VPC 终端节点”,那么(再次),S3 Web 终端节点是看到公共 IP 地址,而不是您的私人 IP 地址。原因是 S3 命令正在退出您的 VPC,成为公共连接,然后到达 S3 端点。

    如果是这种情况,您有两种可能的解决方案:

    解决方案 1:

    更新您的政策以包含公共 IP 地址而不是您的私有 IP 地址。如果您的 EC2 实例位于私有子网中,这很可能是您的 NAT 的公有 IP 地址;如果您的实例位于公有子网中,则很可能是您的 EC2 实例的公有 IP 地址。

    解决方案 2:

    在您的 VPC 上启用“S3 VPC 终端节点”。这将在您的内部 VPC 和 S3 端点之间创建直接连接,从而绕过公共互联网。

    【讨论】:

    • 另外,我相信有办法回到存储桶,通过此策略的例外情况,只要您使用的是允许删除带有aws s3api delete-bucket-policy <bucket-name> 的存储桶策略拥有存储桶的 AWS 账户的 根凭证(访问密钥 ID 和密钥)。
    • 不幸的是,即使 s3 的 VPC 终端节点与 VPC 中的所有子网关联,当我尝试列出存储桶的内容时,策略也会失败
    • 试一下principal as just *.
    • @MattHouser 根据docs.aws.amazon.com/IAM/latest/UserGuide/… 这些主体是等效的。
    猜你喜欢
    • 2018-04-24
    • 2017-09-14
    • 1970-01-01
    • 2012-04-05
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多