21

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 文件似乎没有任何与之关联的样式信息。文档树如下所示。

(如果我将该图像的属性显式更改为公共,然后重新加载其 url,图像加载完美)

我究竟做错了什么?


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

更新#2:存储桶策略不适用于其他人“拥有”的对象,即使它们在您的存储桶中,请参阅我的答案以获取详细信息。

4

8 回答 8

21

更新

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


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

在后一种情况下,由于同时可用的三种不同 S3 访问控制机制之间的交互,您可能会偶然发现一个相关的陷阱,这确实令人困惑。这在Using ACLs and Bucket Policies Together中得到了解决:

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

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

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

这解释了为什么添加 ACL 授权总是保证访问,但是,这不适用于添加策略授权,因为在您的设置中其他地方提供的显式策略拒绝仍将被强制执行,如IAM 和存储桶策略一起评估中进一步说明逻辑

因此,我建议从新的存储桶/对象设置开始以测试所需的配置,然后再将其应用于生产场景(当然,这可能仍会干扰,但以防万一,识别/调试差异会更容易)。

祝你好运!

于 2012-02-13T22:43:01.803 回答
7

存储桶策略不适用于其他所有者的文件。因此,尽管我已将写入权限授予第三方,但所有权仍属于他们,并且我的存储桶策略不适用于这些对象。

于 2012-02-14T22:19:41.187 回答
3

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

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

未经检查Requester Pays,现在匿名访问正在工作,有推荐人限制等。公平地说,AWS 控制台确实告诉我们:

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

于 2013-12-12T23:50:15.120 回答
0

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

试试这个:

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

在“资源”中传递您的存储桶名称

于 2015-12-07T09:32:08.580 回答
0

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

于 2016-06-20T19:07:10.697 回答
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/*"]
    }
  ]
}

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

于 2018-09-04T06:30:57.637 回答
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

希望这可以帮助 :)

于 2020-05-25T14:17:29.007 回答
0

这行得通。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::example-bucket/*"
        }
    ]
}
于 2020-08-19T22:02:44.127 回答