我正在构建一个应用程序,该应用程序使用亚马逊的安全 token 服务来创建临时用户以访问 S3 存储桶上的子目录。用户由 IAM 用户创建,该用户对存储桶具有完全读/写访问权限(以及创建用户所需的权限)。
我创建的用户与 session 过期等完美配合,但我在制定正确的策略以允许基于前缀的 key 列表方面遇到问题。我希望最终用户拥有的权限是:
- 读取某个已定义前缀中的对象
- 将对象写入相同定义的前缀
- 列出驻留在定义的前缀中的所有对象
我设法让读写正常工作,但无论我尝试什么,列表访问都无法正常工作。这是我最接近时使用的 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 中拥有一个共享文件夹 - 您已经在第一个策略中有效地实现了它片段已经存在(取模 GetObjectVersion
,DeleteObjectVersion
,仅在使用 Object Versioning 时相关)。
现在缺少的是ListBucket - 请注意以下细节:
- 这属于 Operations on Buckets ,即 您可以在 Amazon S3 上执行的操作buckets ,而例如GetObject属于Operations on Objects ,即 您可以在 Amazon S3 对象 上执行的操作(此外还有 Operations on the Service ,目前只有 ListAllMyBuckets ,这可能不适用于您的用例)。
prefix
参数限制对以指定前缀开头的键的响应。您可以使用前缀将存储桶分成不同的键集,类似于文件系统使用文件夹的方式。,这意味着前缀不能包含通配符规范,或者更确切地说*
只是作为名称的一部分,参见 What characters are allowed in a bucket or object name? .- 这是许多用户最初偶然发现的文件夹/目录模拟的一个方面,因为 S3 实际上是一个仅由存储桶和对象/键组成的平面存储架构(有关更多详细信息,请参阅我对 How to specify an object expiration prefix that doesn't match the directory? 的回答)。
许多像您这样的用例因此需要两个不同的策略片段来分别处理与对象和存储桶相关的操作,因此您可能需要如下内容:
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/