我正在尝试限制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
失败并拒绝访问。这项政策实际上把我锁定了。
我不知道我错过了什么。我甚至尝试将ForAnyValue
和ForAllValues
添加到IpAddress
和NotIpAddress
条件中。
答案 0 :(得分:5)
S3存储桶策略中指定的IP地址是指S3 Web端点从其接收请求的IP地址。有一些事情会影响到这一点。
在您的政策中,您指定了192.168.*.*
CIDR块,该块是内部 IP地址。
aws s3 ls
命令(例如,在您的本地计算机上),那么AWS将无法看到您的本地192.168.29.100
IP地址。相反,它会看到您公开的IP地址。检查What Is My IP Address?等工具,查看您的工具。我认为AWS有类似的工具,但我现在找不到它。如果是这种情况,您需要使用面向公众的IP地址而非私人IP地址更新您的政策。
aws s3 ls
命令(例如,在EC2实例上),并且您的VPC没有启用“S3 VPC端点”,那么(再次),S3 Web端点正在查看公共IP地址,而不是您的私有IP地址。原因是S3命令退出VPC,成为公共连接,然后到达S3端点。如果是这种情况,您有两种可能的解决方案:
决议1:
更新您的政策以包含公共IP地址,而不是您的私人IP地址。如果您的EC2实例位于私有子网中,则很可能是NAT的公共IP地址;如果您的实例位于公有子网中,则可能是EC2实例的公共IP地址。
决议2:
在您的VPC上启用“S3 VPC Endpoints”。这将在您的内部VPC和S3端点之间建立直接连接,从而绕过公共互联网。