各种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
操作 - 因此,我不确定如何限制这些范围权限。
关于错误或如何完成的任何想法,都将不胜感激!
我认为可以在策略的ressource属性中使用$ {aws:principaltag}。只需查看IAM的文档即可。该示例使用princtalTag作为ressource值的最后一部分。
(只需在文档网站上使用strg f并键入principaltag,您找到了示例)
您是对的,最后两个策略将行不通。
根据文档aws:PrincipalTag/tag-key
与字符串操作员一起使用,因此aws:PrincipalTag/tag-key
的用法仅在Condition
策略元素中使用。
另外,s3:prefix
条件密钥仅适用于ListBucket
&ListBucketVersions
操作:https://docs.aws.amazon.com/iam/latest/userguide/list_amazons3.html#amazons3-policy-keys
您可以将主塔作为资源的一部分。这有效。
{
"Sid": "FullPermissionOnlyForPrefix",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::mybucket/${aws:PrincipalTag/team}*",
"arn:aws:s3:::mybucket/${aws:PrincipalTag/team}/*"
]
}