12

我正在构建一个应用程序,它使用亚马逊的安全令牌服务来创建临时用户来访问 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% 正常工作,但有一个明显的问题是没有任何东西被限制在允许用户破坏彼此工作的前缀上。

我的政策做错了什么?

4

2 回答 2

8

为了扩展 Bob Kinney引用的文章和片段(+1),我想解释一下我认为您的问题的可能原因,这实际上与使用AWS Security Token Service (STS)无关,但涉及一些一般而言, Amazon S3 IAM 策略经常遇到的微妙之处:

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

现在缺少的是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
于 2013-04-18T11:44:16.943 回答
7

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

移动应用程序的凭据管理

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

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

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

希望这可以帮助。

于 2013-04-15T17:02:55.800 回答