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

问题描述 投票:2回答:3

我已经使用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"
                    ]
                }
            }
    }
    ]
}

(如Mark B.所指出的那样,用ListBucket命令更新)

我在SO上找到了几个相关的问题(比如thisthis),但他们的解决方案是基于允许每个人访问存储桶内容的权限。

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

我学会了here

当用户没有列出存储桶内容的权限时,S3返回403而不是404。

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

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

amazon-s3 http-status-code-404 http-status-code-403
3个回答
2
投票

请注意您引用的文档:

当用户没有列出存储桶内容的权限时,S3返回403而不是404。

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


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"
                    ]
                }
            }
        }
    ]
}

0
投票

我的问题是我的电脑时钟设置不正确。 (因为DST问题)

© www.soinside.com 2019 - 2024. All rights reserved.