我正在构建一个使用亚马逊安全令牌服务的应用来创建临时用户来访问S3存储桶上的子目录。用户由具有对存储桶的完全读/写访问权限的IAM用户创建(以及创建用户所需的权限)。
我创建的用户与会话过期完美配合等等,但我在制定正确的策略时遇到问题,以允许基于前缀的密钥列表。我希望最终用户拥有的权限是:
我设法读取和写入工作,但无论如何我尝试列表访问不能正常工作。这是我最接近时使用的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%正常使用明显的问题,即没有任何内容限制在一个允许用户互相破坏对方工作的前缀。
我的政策出错了什么?
答案 0 :(得分:8)
为了扩展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 - 请注意以下细微之处:
prefix
参数限制对以指示前缀开头的键的响应。您可以使用前缀以类似于文件系统使用文件夹的方式将存储桶分隔为不同的密钥集。,这意味着前缀不能包含通配符规范,或者更确切地说*
仅作为名称的一部分,请参阅What characters are allowed in a bucket or object name?。
因此,像您这样的许多用例需要两个不同的策略片段来分别处理对象和存储桶相关的操作,因此您可能需要以下内容:
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
答案 1 :(得分:7)
您可能会发现这篇感兴趣的文章,因为它专门讨论了创建策略以将用户限制为S3 Bucket中的前缀。
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":"*"
}
]
}
前两个陈述是你最感兴趣的。
希望这有帮助。