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

Posted

技术标签:

【中文标题】Amazon S3 - 尽管有 GetObject 限制,但返回 403 错误而不是 404【英文标题】:Amazon S3 - Returns 403 error instead of 404 despite GetObject allowance 【发布时间】:2016-10-09 01:11:49 【问题描述】:

我已将我的 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"
                    ]
                
            
    
    ]

(如 Mark B 所指出的,已使用 ListBucket 命令更新。)

我在 SO 上发现了几个相关的问题(例如 this 和 this),但他们的解决方案是基于授予每个人访问存储桶内容的权限。

这种方法很有效,因为如果我解除 IP 过滤器,则会为丢失的文件而不是 403 给出 404 错误。但这违背了 IP 过滤器的目的。

我了解到here:

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

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

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

【问题讨论】:

【参考方案1】:

注意您引用的文档:

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

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

【讨论】:

感谢您的回复马克和敏锐的注意。我添加了ListBucket 权限策略,但同样的问题仍然存在——我更新了我的问题以反映这一点。【参考方案2】:

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

我觉得它没有设置存储桶策略那么优雅,但它至少现在有效。

我随附的存储桶策略现在仍然基于仅将几个 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"
                    ]
                
            
        
    ]

【讨论】:

您说“仍然仅基于白名单”,但您拥有的政策文档似乎是将 IP 地址列入黑名单,而不是列入白名单。我想这是一个错字或smth,你的意思是IpAddress而不是NotIpAddress【参考方案3】:

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

【讨论】:

以上是关于Amazon S3 - 尽管有 GetObject 限制,但返回 403 错误而不是 404的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Web Services:设置 S3 策略以允许 putObject 和 getObject 但拒绝 listBucket

如何在循环中获取 Amazon S3 对象?

如何使用 getSignedUrl 操作从 Amazon s3 访问对象

如何重命名 Amazon S3 存储桶中的文件? [复制]

从 Amazon S3 下载 res.download 文件

尽管存储桶是公共的,但 Amazon S3 base64 图像不适用于 og:image 标签