[英]How can I make a S3 bucket public (the amazon example policy doesn't work)?
Amazon提供了向匿名用户授予权限的示例,如下所示(请参阅Amazon S3存储桶策略的示例案例 ):
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket/*"
}
]
}
在我的政策中,我已将“arn:aws:s3 ::: bucket /”中的“bucket”更改为“my-bucket”。
但是,一旦我尝试访问该存储桶的文件夹中的图像,我就会收到以下访问被拒绝错误:
此XML文件似乎没有与之关联的任何样式信息。 文档树如下所示。
(如果我明确地将该图像的属性更改为public,则重新加载其url,图像加载完美)
我究竟做错了什么?
更新#1 :显然它与我可以访问的第三方网站有关。 虽然它具有作为主用户(me)的所有权限,并且其对象位于同一文件夹中,具有完全相同的权限,但仍然不允许我将它们公开显示。 不知道为什么。
更新#2 :存储桶策略不适用于其他人“拥有”的对象,即使它们在您的存储桶中,请参阅我的答案以获取详细信息。
根据GoodGets的评论,真正的问题是存储桶策略不适用于其他人“拥有”的对象,即使它们在你的桶中 ,请参阅GoodGets自己的详细解答 (+1)。
这是一个新的存储桶/对象设置还是您尝试将存储桶策略添加到预先存在的设置?
在后一种情况下,由于可用的三种不同的S3访问控制机制之间的相互作用,您可能偶然发现了相关的陷阱,这可能相当混乱。 例如, 在一起使用ACL和存储桶策略中解决了这个问题:
当您将ACL和存储桶策略分配给存储桶时,Amazon S3会在确定帐户对Amazon S3资源的访问权限时评估现有的Amazon S3 ACL以及存储桶策略。 如果帐户可以访问ACL或策略指定的资源,则他们可以访问所请求的资源。
虽然这听起来很容易,但是ACL之间的细微不同默认值可能会导致无意的干扰:
使用现有的Amazon S3 ACL,授权始终提供对存储桶或对象的访问。 使用策略时, 拒绝始终会覆盖授权 。 [强调我的]
这解释了为什么添加ACL授权始终保证访问权限,但是,这不适用于添加策略授予,因为仍会强制执行设置中其他位置提供的显式策略拒绝,如IAM和Bucket Policies Together和Evaluation中进一步说明的那样。 逻辑 。
因此,我建议首先使用新的存储桶/对象设置来测试所需的配置,然后再将其应用到生产场景中(当然,这可能会产生干扰,但识别/调试差异会更容易)。
祝好运!
存储桶策略不会将文件应用于其他所有者。 因此,虽然我已经给第三方写入权限,但所有权仍然存在,我的存储桶策略将不适用于这些对象。
我浪费了几个小时,根本原因是愚蠢的,这里提到的解决方案没有帮助(我尝试了所有这些),AWS s3权限文档没有强调这一点。
如果“ Requester Pays
设置为“开”,则无法启用匿名访问(通过存储桶策略或ACL“所有人”)。 您可以确定编写策略和ACL并应用它们甚至使用控制台将文件显式设置为公共,但是非签名URL仍会在该文件上100%被拒绝403访问,直到您取消选中requester pays
在控制台中为整个存储桶设置(选择存储桶时的属性选项卡)。 或者,我假设,通过一些API REST调用。
未经检查的Requester Pays
和现在匿名访问正在工作,具有引荐来源限制等。 公平地说,AWS控制台告诉我们:
启用“请求者支付”时,将禁用对此存储桶的匿名访问。
问题在于你的Action它应该是数组格式
试试这个:
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"AddPerm",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::examplebucket/*"]
}
]
}
在“资源”中传递您的Bucket名称
如果您在使用Zencoder上传时遇到此问题,请查看此页面: https ://app.zencoder.com/docs/api/encoding/s3-settings/public
以下策略将使整个存储桶公开:
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"AddPerm",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::examplebucket/*"]
}
]
}
如果您希望使用Bucket策略将该存储桶下的特定文件夹公开,则必须明确将该文件夹/前缀设置为public,然后应用存储桶策略,如下所示:
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"AddPerm",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::examplebucket/images/*"]
}
]
}
上述策略将允许公共读取图像下的所有对象,但您将无法访问存储桶内的其他对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.