S3存储桶策略限制为IP CIDR范围

时间:2017-11-21 17:10:59

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

我正在尝试限制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地址aws s3 ls s3://test.bucket的ec2实例中的简单192.168.129.100失败并拒绝访问。这项政策实际上把我锁定了。

我不知道我错过了什么。我甚至尝试将ForAnyValueForAllValues添加到IpAddressNotIpAddress条件中。

1 个答案:

答案 0 :(得分:5)

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有类似的工具,但我现在找不到它。
  2. 如果是这种情况,您需要使用面向公众的IP地址而非私人IP地址更新您的政策。

    1. 如果您正在AWS网络内部执行aws s3 ls命令(例如,在EC2实例上),并且您的VPC没有启用“S3 VPC端点”,那么(再次),S3 Web端点正在查看公共IP地址,而不是您的私有IP地址。原因是S3命令退出VPC,成为公共连接,然后到达S3端点。
    2. 如果是这种情况,您有两种可能的解决方案:

      决议1:

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

      决议2:

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