ruby - Amazon 基于前缀的 S3 策略不起作用(AWS、IAM、STS、Ruby)

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

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

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

  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

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

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% 可以正常工作,但有一个明显的问题,即没有任何内容受限于允许用户破坏彼此工作的前缀。

我的政策哪里做错了?

最佳答案

扩展 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

关于ruby - Amazon 基于前缀的 S3 策略不起作用(AWS、IAM、STS、Ruby),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15981426/

相关文章:

ruby-on-rails - 缓存 expires_in 不工作

android - AWS认知: In mobile app how to set token expiry to infinite

postgresql - 无法修改 Amazon RDS 上剩余连接槽的默认参数组

mysql - 是否可以从 Amazon Aurora 迁移回 Amazon RDS 中的 native MySQL?

php - 1 个同时下载 + 强制等待时间 + Amazon S3

ruby-on-rails - 如何优化此事件记录查询?

ruby - UBUNTU 14.04 (x86_64) 上的 rbenv : BUILD FAILED when Install Ruby 2. 2.3

ruby - 在 ruby​​ 中打开填充表单页面

python - 如何在 boto S3 中获取文件/ key 大小?

amazon-web-services - 使用 AWS Lambda 函数访问存储在 AWS s3 中的大文件