Amazon S3 - Returns 403 错误而不是 404 尽管有 GetObject 允许

Amazon S3 - Returns 403 error instead of 404 despite GetObject allowance

我已将我的 S3 存储桶设置为 this tutorial 以仅接受来自特定 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 and this),但他们的解决方案是基于授予 每个人 访问存储桶内容的权限。

而且这种方法行之有效,因为如果我取消我的 IP 过滤器,则会针对丢失的文件给出 404 错误而不是 403。但这违背了 IP 过滤器的目的。

我了解到here

S3 returns a 403 instead of a 404 when the user doesn't have permission to list the bucket contents.

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

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

注意您引用的文档:

S3 returns a 403 instead of a 404 when the user doesn't have permission to list the bucket contents.

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

我已经解决了 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"
                    ]
                }
            }
        }
    ]
}

我的问题是我的计算机时钟设置不正确。 (由于 DST 问题)