【发布时间】:2019-07-07 21:45:42
【问题描述】:
各种 IAM 用户正在共享对 S3 存储桶的访问权限。 S3 存储桶具有按用户分隔的内容,因此每个用户都有他们可以访问的唯一区域。
例如:
- S3 存储桶:
example-bucket。 - IAM 用户:
UserOne。该用户被标记为sampleTag=u11111。 - IAM 用户:
UserTwo。该用户被标记为sampleTag=u22222。 - 更多标记的 IAM 用户。
我想编写这样的 IAM 政策:
-
UserOne有权读取和写入s3://example-bucket/u11111/*的内容并从s3://example-bucket/config/u11111/读取内容 -
UserTwo可以对s3://example-bucket/u22222/*的内容进行读+写,并从s3://example-bucket/config/u22222/中读取内容 - 等等……
请注意,S3 键在路径中包含 sampleTag 的值。
我希望能够将此单一策略应用于整个 IAM 用户组,而无需为每个用户添加单独的策略。
由于${aws:PrincipalTag/sampleTag} 我认为这会在资源字符串中的该位置注入标签值,因此我希望这是可能的。但是在玩了策略模拟器之后,它似乎并没有做到这一点。
当前政策如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::example-bucket",
"arn:aws:s3:::example-bucket-test"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::example-bucket",
"arn:aws:s3:::example-bucket-test"
],
"Condition": {
"StringEquals": {
"s3:prefix": [
"",
"${aws:PrincipalTag/sampleTag}/"
],
"s3:delimiter": ["/"]
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::example-bucket",
"arn:aws:s3:::example-bucket-test"
],
"Condition": {
"StringLike": {
"s3:prefix": ["${aws:PrincipalTag/sampleTag}/*"]
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl"
],
"Resource": [
"arn:aws:s3:::example-bucket/config/${aws:PrincipalTag/sampleTag}/*",
"arn:aws:s3:::example-bucket-test/config/${aws:PrincipalTag/sampleTag}/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::example-bucket/${aws:PrincipalTag/sampleTag}/*",
"arn:aws:s3:::example-bucket-test/${aws:PrincipalTag/sampleTag}/*"
]
}
]
}
我认为最后两个策略不起作用。我找不到文档来说明是否可以将变量嵌入到 Resource 字符串中,但 s3:prefix 似乎不适用于 GetObject 或 PutObject 操作——所以我不确定如何限制这些权限的范围。
任何关于错误或如何完成此任务的想法都将不胜感激!
【问题讨论】:
-
您应该考虑使用用户名 (${aws:username}),而不是标签。见aws.amazon.com/premiumsupport/knowledge-center/…
-
docs.aws.amazon.com/IAM/latest/UserGuide/… 确认应该可以在
Resource字符串中使用 IAM 用户标签。很难调试,因为策略模拟器 (policysim.aws.amazon.com) 只是说没有规则匹配(默认拒绝)而不是解释评估过程。 --- 我不能像上面建议的那样使用用户名,这是针对以这种方式构造的现有数据,不能重新排列到与用户名匹配的目录中。 -
我不相信你可以在
Resource中使用PrincipalTag。您可以在Condition声明中。 -
你绝对可以在
Resource字符串中使用aws:PrincipalTag/*。正如我上面提到的,它位于该链接的官方文档(Condition Element之前的最后一项)部分。我实际上很确定我发布的政策可以正常工作。我目前正在参与测试,但所有迹象都表明 IAM 策略模拟器刚刚损坏/不支持它,因为经过身份验证的用户在模拟器之外采取的相同操作是允许而不是拒绝的。
标签: json amazon-web-services amazon-s3 amazon-iam policy