【问题标题】:How can I make a S3 bucket public (the amazon example policy doesn't work)?如何公开 S3 存储桶(亚马逊示例策略不起作用)?
【发布时间】:2012-03-05 01:32:04
【问题描述】:

亚马逊提供了一个向匿名用户授予权限的示例,如下所示(参见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”。

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

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

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

我做错了什么?


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

更新 #2:存储桶策略不适用于他人“拥有”的对象,即使它们在您的存储桶中,请参阅 my answer 了解详情。

【问题讨论】:

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


    【解决方案1】:

    更新

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


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

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

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

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

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

    这解释了为什么添加 ACL 授权总是保证访问,但是,这不适用于添加策略授权,因为在您的设置中其他地方提供的显式策略拒绝仍将被强制执行,如示例中进一步说明的那样。 IAM and Bucket Policies TogetherEvaluation Logic

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

    祝你好运!

    【讨论】:

    • 我赞成您对所有信息的回答,谢谢。但是,我将上述存储桶策略应用于其中只有 1 个文件夹的全新存储桶。没有其他对象。然后我上传了一张图片,转到它的网址,但仍然被拒绝访问。
    • Steffen,我接受了你的回答,因为它确实帮助我调试了我的问题。但真正的问题是存储桶策略不适用于其他人“拥有”的对象,即使它们在您的存储桶中。
    • @GoodGets:感谢您接受并跟进您的解决方案,我已经更新了答案以相应地指导未来的读者!
    • 感谢您提供的信息,这对整理 S3 上的权限非常有帮助!
    【解决方案2】:

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

    【讨论】:

    • 我也遇到了这个问题 - 有什么要说的吗?
    • 如果对象的所有者是匿名的怎么办?
    • @GoodGets : 你找到解决方案了吗?
    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      试试这个:

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

      'Resource'

      中传递您的 Bucket 名称

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          {
            "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 下的所有对象,但您将无法访问存储桶内的其他对象。

          【讨论】:

            【解决方案7】:

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

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

            例子:

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

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

            希望这会有所帮助:)

            【讨论】:

              【解决方案8】:

              这行得通。

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-06-26
                • 2017-03-03
                • 2019-11-13
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多