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

问题描述 投票:19回答:6

Amazon提供了一个向匿名用户授予权限的示例,如下所示(请参阅Example Cases for Amazon S3 Bucket Policies):

{
    "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:存储桶策略不适用于其他人“拥有”的对象,即使它们在您的存储桶中,有关详细信息,请参阅my answer

amazon-s3 amazon-web-services policy bucket
6个回答
20
投票

Update

根据GoodGets的评论,真正的问题是存储桶策略不适用于其他人“拥有”的对象,即使它们在你的桶中,请参阅GoodGets' own answer了解详细信息(+1)。


这是一个新的存储桶/对象设置还是您尝试将存储桶策略添加到预先存在的设置?

在后一种情况下,由于可用的三种不同的S3访问控制机制之间的相互作用,您可能偶然发现了相关的陷阱,这可能相当混乱。例如,这可以解决在Using ACLs and Bucket Policies Together

当您将ACL和存储桶策略分配给存储桶时,Amazon S3会在确定帐户对Amazon S3资源的访问权限时评估现有的Amazon S3 ACL以及存储桶策略。如果帐户可以访问ACL或策略指定的资源,则他们可以访问所请求的资源。

虽然这听起来很容易,但是ACL之间的细微不同默认值可能会导致无意的干扰:

使用现有的Amazon S3 ACL,授权始终提供对存储桶或对象的访问。使用策略时,拒绝始终会覆盖授权。 [强调我的]

这解释了为什么添加ACL授权始终保证访问权限,但是,这不适用于添加策略授予,因为仍然会强制执行您的设置中其他位置提供的显式策略拒绝,如在例如美国专利书中进一步说明的那样。 IAM and Bucket Policies TogetherEvaluation Logic

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

祝好运!


8
投票

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


3
投票

我浪费了几个小时,根本原因是愚蠢的,这里提到的解决方案没有帮助(我尝试了所有这些),AWS s3权限文档没有强调这一点。

如果您将Requester Pays设置为ON,则无法启用匿名访问(通过存储桶策略或ACL“Everyone”)。您可以确保编写策略和ACL并应用它们甚至使用控制台将文件显式设置为公共,但是非签名的URL仍会在该文件上100%被拒绝403访问,直到您取消选中requester pays设置在整个存储桶的控制台中(选择存储桶时的属性选项卡)。或者,我假设,通过一些API REST调用。

未经检查的Requester Pays和现在的匿名访问正在工作,有引荐来源限制等。公平地说,AWS控制台告诉我们:

启用“请求者支付”时,将禁用对此存储桶的匿名访问。


0
投票

问题在于你的Action它应该是数组格式

试试这个:

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/*"]
    }
  ]
}

在“资源”中传递您的Bucket名称


0
投票

如果您在使用Zencoder上传时遇到此问题,请查看此页面:https://app.zencoder.com/docs/api/encoding/s3-settings/public


0
投票

以下策略将使整个存储桶公开:

{
  "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/*"]
    }
  ]
}

上述策略将允许公共读取图像下的所有对象,但您将无法访问存储桶内的其他对象。

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