我目前有一个名为mets-logos的桶。它目前有这个桶策略,它允许来自任何人的GetObjects。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mets-logos/*"
}
]
}
我希望只允许来自ip白名单的geobject。这是我尝试过的,但它不起作用(外部IP仍然可以获得对象)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mets-logos/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"100.77.17.80/32",
"100.77.26.210/32",
]
}
}
}
]
}
附带问题:如果我的桶策略是正确的,我需要等待AWS反映这个更改,还是应该立即反映? 尝试添加一个Deny,以及例外,像这样:
{
"Version":"2012-10-17",
"Id":"S3PolicyId1",
"Statement":
[
{
"Sid" : "IPAllow",
"Effect" : "Deny",
"Principal": "*",
"Action" : "s3:GetObject",
"Resource" : "arn:aws:s3:::mets-logos/*",
"Condition": {
"IpAddress" : {
"aws:SourceIp": "0.0.0.0/0"
},
"NotIpAddress": {
"aws:SourceIp": "100.77.17.80/32"
},
"NotIpAddress": {
"aws:SourceIp": "100.77.26.210/32"
}
}
}
]
}
明确拒绝访问所有IP地址,但允许白名单中的两个地址执行GetObject
。
我可以看到,如果你在IAM凭据下访问S3,但你想进一步控制桶级别的访问,这将是多么有用。此策略中的Deny
将覆盖现有的IAM用户策略。
回答你的附加问题,政策变化立即生效。
对S3桶的访问由S3桶策略和附加到访问桶的主体上的IAM访问策略控制。
所以IAM访问策略可能会"否决"S3桶策略。
您的S3桶策略说"如果IP是某某,允许获取"。但是桶策略中没有任何内容说"不允许其他任何人"。
如果访问桶的IAM用户/角色允许桶上的s3:GetObject
(或*
),那么该策略允许他们访问桶。
如果IAM用户/角色没有明确的"允许"s3:GetObject"(或"s3:*"),那么您的策略将工作。
为了防止允许访问桶的用户/角色被限制到IP地址,那么你需要改变你的策略为"拒绝"任何不在允许的IP地址中的人。桶策略中的显式"deny"将否决IAM用户/角色策略中的任何"allow"。
试试这个策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyAllButFromAllowedIp",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mets-logos/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"100.77.17.80/32",
"100.77.26.210/32",
]
}
}
}
]
}