繁体   English   中英

如何公开S3存储桶(亚马逊示例策略不起作用)?

[英]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 TogetherEvaluation中进一步说明的那样。 逻辑

因此,我建议首先使用新的存储桶/对象设置来测试所需的配置,然后再将其应用到生产场景中(当然,这可能会产生干扰,但识别/调试差异会更容易)。

祝好运!

存储桶策略不会将文件应用于其他所有者。 因此,虽然我已经给第三方写入权限,但所有权仍然存在,我的存储桶策略将不适用于这些对象。

我浪费了几个小时,根本原因是愚蠢的,这里提到的解决方案没有帮助(我尝试了所有这些),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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM