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
如何使用 getSignedUrl 操作从 Amazon s3 访问对象