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

时间:2012-02-13 16:25:25

标签: amazon-s3 amazon-web-services policy bucket

亚马逊提供授予匿名用户权限的示例,如下所示(请参阅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/*"
        }
    ]
}

在我的政策范围内,我已经改变了#34;桶" in"" arn:aws:s3 ::: bucket /" to" my-bucket"。

但是,一旦我尝试访问该存储桶的文件夹中的图像,我就会收到以下访问被拒绝错误:

  

此XML文件似乎没有任何关联的样式信息   用它。文档树如下所示。

(如果我明确地将该图像的属性更改为public,然后重新加载其url,则图像加载完美)

我做错了什么?


更新#1 :显然它与我可以访问的第三方网站有关。虽然它具有作为主用户(me)的所有权限,并且其对象位于同一文件夹中,具有完全相同的权限,但仍然不允许我将它们公开显示。不知道为什么。

更新#2 :广告投放管理政策不适用于对象"拥有"其他人,即使他们在你的桶中,请参阅my answer了解详情。

8 个答案:

答案 0 :(得分:20)

更新

根据GoodGets的评论,真正的问题是桶策略不适用于其他人“拥有”的对象,即使它们在你的桶中,请参阅{{3} }详情(+1)。


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

在后一种情况下,由于可用的三种不同的S3访问控制机制之间的相互作用,您可能偶然发现了相关的陷阱,这可能相当混乱。例如,这可以解决在GoodGets' own answer中:

  

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

虽然这听起来很容易,但是无意中的干扰可能是因为ACL之间存在微妙的不同默认值和策略:

  

使用现有的Amazon S3 ACL,授权始终提供对a的访问权限   桶或物体。使用策略时,拒绝始终覆盖a   授予即可。 [强调我的]

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

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

祝你好运!

答案 1 :(得分:8)

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

答案 2 :(得分:3)

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

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

未选中requester pays,现在匿名访问正在运行,有引荐来源限制等。公平地说,AWS控制台告诉我们:

  

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

答案 3 :(得分:0)

问题在于操作,它应该是 数组 格式

试试这个:

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

'资源'中传递广告管道名称

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

如果要使用存储桶策略将该存储桶下的特定文件夹公开,则必须将该文件夹/前缀明确设置为公共,然后按以下方式应用存储桶策略:

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

以上政策将允许公众读取图片下的所有对象,但您将无法访问存储桶中的其他对象。

答案 6 :(得分:0)

我知道这是一个老问题,但是我想补充一些今天仍然有用的信息。

我认为该存储桶应该是静态站点。因此,必须使用特定的URL才能接受规则。为此,您必须在您的URL中添加一个“网站”。否则,它将像对待对象存储库一样对待它。

示例:

指出问题所在: https://name-your-bucket.sa-east-1.amazonaws.com/home

没有指出的问题: http://name-your-bucket.s3-website-sa-east-1.amazonaws.com/home

希望这会有所帮助:)

答案 7 :(得分:0)

这有效。

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