我在AWS上有以下用例:
为了确保只在内部提供存储桶内容,我使用了以下存储桶策略来限制对静态IP的访问:
{
"Statement": [
{
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::mybucket.myhost.com/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"x.x.x.x/32"
]
}
}
}
]
}
这非常适合阻止我们办公室以外的任何人通过HTTP访问存储桶。完美。
但是,自动扩展组中的服务器(使用IAM角色对存储区具有完全权限)无法访问存储区。似乎S3存储桶策略优先。我无法将其IP添加到存储桶策略中,因为它是一个扩展组,其IP将定期更改。
我尝试了一些解决方案,但没有任何乐趣:
我觉得这应该很简单,但我现在感到沮丧:(
答案 0 :(得分:4)
我意识到我的存储桶中的所有对象都有公共读取ACL。我删除了公共读取ACL,因此对象默认为“拒绝”。然后,我可以使用这样的策略来访问我们的办公室IP和我们的自动扩展EC2服务器,这些服务器由其IAM角色标识:
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::mybucket.myhost.com/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"x.x.x.x/32"
]
}
}
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxx:role/xxxxxx"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::mybucket.myhost.com/*"
}
]
}