【问题标题】:Amazon Prefix-Based S3 Policy Isn't Working (AWS, IAM, STS, Ruby)基于 Amazon Prefix 的 S3 策略不起作用(AWS、IAM、STS、Ruby)
【发布时间】:2013-04-05 13:48:00
【问题描述】:

我正在构建一个应用程序,该应用程序使用 Amazon 的安全令牌服务来创建临时用户以访问 S3 存储桶上的子目录。用户由对存储桶具有完全读/写访问权限(以及创建用户所需的权限)的 IAM 用户创建。

我创建的用户与会话到期等功能完美配合,但我在制定正确的策略以允许基于前缀的键列表时遇到问题。我希望最终用户拥有的权限是:

  1. 读取某些已定义前缀中的对象
  2. 将对象写入相同的定义前缀
  3. 列出所有位于定义前缀中的对象

我设法让读写工作,但不知何故,无论我尝试什么,列表访问都无法正常工作。这是我最近时使用的 Ruby 代码:

AWS::STS::Policy.new do |policy|
  policy.allow(
    actions: ["s3:GetObject*", "s3:PutObject*", "s3:DeleteObject*"],
    resources: "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/#{folder_path}/*"
  )

  policy.allow(
    actions: ["s3:*"],
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/*", "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"]
  ).where(:s3_prefix).like("#{folder_path}/*")
end

如果我记得,这让我可以阅读和写作,但不能列出。由于我仍在开发中,我已将代码更改为:

AWS::STS::Policy.new do |policy|
  # FIXME: This is way too permissive, but it's not working to be more specific.
  policy.allow(
    actions: ["s3:*"],
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/*", "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"]
  )
end

这可以 100% 正常工作,但有一个明显的问题是没有任何东西被限制在一个前缀上,这样用户就可以破坏彼此的工作。

我的政策做错了什么?

【问题讨论】:

    标签: ruby amazon-web-services amazon-s3 amazon-iam


    【解决方案1】:

    为了扩展 Bob Kinney 的 referenced article and fragments (+1),我想解释一下我认为您的问题的可能原因,这实际上与使用 AWS Security Token Service (STS) 无关,但经常涉及一些微妙之处一般遇到Amazon S3 IAM policies

    Example Policies for Amazon S3 涵盖了与您的类似或相关的各种用例 - 特别是您的用例显然包括 示例 2:允许组在 Amazon S3 中拥有一个共享文件夹 - 您已经有效地实现了已经在第一个片段的第一个策略中(模 GetObjectVersionDeleteObjectVersion,仅在使用 Object Versioning 时才相关)。

    现在缺少的是ListBucket - 请注意以下细微之处:

    因此,像您这样的许多用例需要两个不同的策略片段来分别处理对象和存储桶相关操作,因此您可能需要以下内容:

    AWS::STS::Policy.new do |policy|
      policy.allow(
        actions: ["s3:GetObject*", "s3:PutObject*", "s3:DeleteObject*"],
        resources: "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/#{folder_path}/*"
      )
    
      policy.allow(
        actions: ["s3:ListBucket"],
        resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"]
      ).where(:s3_prefix).like("#{folder_path}/")
    end
    

    【讨论】:

      【解决方案2】:

      您可能会发现这篇文章很有趣,因为它专门讨论了创建策略以将用户限制为 S3 存储桶中的前缀。

      Credential Management for Mobile Applications

      您很可能只需要参考第二个政策。

      { 
              "Statement":
              [
                  {
                    "Effect":"Allow",
                    "Action":["s3:PutObject","s3:GetObject","s3:DeleteObject"],
                    "Resource":"arn:aws:s3:::__MY_APPS_BUCKET_NAME__/__USERNAME__/*"
                  },
                  {
                    "Effect":"Allow",
                    "Action":"s3:ListBucket",
                    "Resource":"arn:aws:s3:::__MY_APPS_BUCKET_NAME__",
                    "Condition":{"StringLike":{"s3:prefix":"__USERNAME__/"}}
                  },
                  {
                    "Effect":"Deny",
                    "Action":["sts:*", "iam:*", "sdb:*"],
                    "Resource":"*"
                  }
              ]
      }
      

      前两个语句是您最感兴趣的。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2015-01-24
        • 2012-05-18
        • 2019-07-07
        • 1970-01-01
        • 2021-09-03
        • 2023-03-29
        • 1970-01-01
        • 2014-05-02
        • 2023-04-07
        相关资源
        最近更新 更多