Amazon S3 - 尽管有GetObject限制,仍返回403错误而不是404

时间:2016-06-08 16:29:40

标签: amazon-s3 http-status-code-404 http-status-code-403

我已使用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上找到了几个相关问题(例如thisthis),但他们的解决方案基于授予所有人访问存储桶的权限& #39;的内容。

这种方法有效,因为如果我提升我的IP过滤器,则会为丢失的文件而不是403提供404错误。但这会破坏IP过滤器的目的。

我了解到here

  当用户没有时,

S3返回403而不是404   列出存储桶内容的权限。

但我找不到方法让存储桶为缺少的文件生成404错误代码,而不用删除我的IP白名单过滤器。这包括用于检索对象的GetObject命令和用于列出对象的ListBucket

我的理由如下:如果允许IP地址访问存储桶的内容,那么S3不应该为这些IP而不是403生成404错误?如何在没有删除现有过滤器的情况下执行

3 个答案:

答案 0 :(得分:2)

请注意您引用的文档:

  当用户没有时,

S3返回403而不是404   列出存储桶内容的权限

您授予的GetObject权限仅允许获取存在的对象,但不授予列出存储桶中所有对象的权限。您需要将ListBucket权限添加到存储分区策略中。有关S3 IAM权限的完整列表及其涵盖的S3操作,请参阅this page

答案 1 :(得分:1)

我已经解决了S3发出403而不是404错误的问题,而不是通过更改存储桶策略,而只是在存储桶设置中添加“Everyone”列表策略:

New bucket policy

我觉得它不像设置存储桶策略那么优雅,但它现在至少可以使用。

我的随附存储桶策略现在仍然仅基于将一些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问题)