我已使用this tutorial设置我的S3存储桶,仅接受来自特定IP地址的请求。但即使这些IP被允许GetObject
,它们也会因缺少任何文件而获得403错误而不是404错误。
我更新的存储分区策略是(带有虚构的IP地址):
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "IPDeny",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::www.bucketname.com/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"100.100.100.0/22",
"101.101.101.0/22"
]
}
}
},
{
"Sid": "ListItems",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::www.bucketname.com",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"100.100.100.0/22",
"101.101.101.0/22"
]
}
}
}
]
}
(使用ListBucket
命令更新,如Mark B所述。)
我已在SO上找到了几个相关问题(例如this和this),但他们的解决方案基于授予所有人访问存储桶的权限& #39;的内容。
这种方法有效,因为如果我提升我的IP过滤器,则会为丢失的文件而不是403提供404错误。但这会破坏IP过滤器的目的。
我了解到here:
当用户没有时,S3返回403而不是404 列出存储桶内容的权限。
但我找不到方法让存储桶为缺少的文件生成404错误代码,而不用删除我的IP白名单过滤器。这包括用于检索对象的GetObject
命令和用于列出对象的ListBucket
。
我的理由如下:如果允许IP地址访问存储桶的内容,那么S3不应该为这些IP而不是403生成404错误?如何在没有删除现有过滤器的情况下执行?
答案 0 :(得分:2)
请注意您引用的文档:
当用户没有时,S3返回403而不是404 列出存储桶内容的权限。
您授予的GetObject
权限仅允许获取存在的对象,但不授予列出存储桶中所有对象的权限。您需要将ListBucket
权限添加到存储分区策略中。有关S3 IAM权限的完整列表及其涵盖的S3操作,请参阅this page。
答案 1 :(得分:1)
我已经解决了S3发出403而不是404错误的问题,而不是通过更改存储桶策略,而只是在存储桶设置中添加“Everyone”列表策略:
我觉得它不像设置存储桶策略那么优雅,但它现在至少可以使用。
我的随附存储桶策略现在仍然仅基于将一些IP列入白名单:
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "IPDeny",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::website-bucket/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"10.1.1.0/22",
"11.1.1.0/22"
]
}
}
}
]
}
答案 2 :(得分:0)
我的问题是我的计算机时钟设置不正确。 (由于DST问题)