我想在AWS IAM服务中设置一个策略,以允许遵循特定模式的用户连接到名称遵循特定模式的S3存储桶。
我的用户看起来像archiver_clientname
,我的广告资源看起来像clientname_archive
。到目前为止,我通读了this和this
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
"Condition": {"StringLike": {"${s3:prefix}": ["${aws:username:suffix}/*"]}}
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::EXAMPLE-BUCKET-NAME"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::EXAMPLE-BUCKET-NAME/*"
}
]
}
${s3:prefix}
和${aws:username:suffix}
是我编造的一些变量,好${s3:prefix}
实际存在,但我不确定这是否符合我的预期。能够将我的存储桶名称与我的用户名匹配而不重命名它会很棒,因为否则名称不会说话而只是客户端名称,尽管我有其他不同用途的存储桶。交换用户前缀和后缀或使用不同的分隔符是可以的。并且看起来政策工具有足够的灵活性来解决我的任务我无法以某种方式找到正确的文档。
我也不想为每个用户设置新策略。
我会很高兴得到答案,我的方法是错误的,并且有一个很好的解释,为什么它是错的,我可以做什么呢。
答案 0 :(得分:3)
首先,当用户获取存储桶列表时,无法限制返回给用户的列表。所以,不要在“s3:ListAllMyBuckets”动作上加上条件。他们要么看到所有桶,要么看不到任何桶。
接下来,您无法“拆分”用户名。 IAM策略语言并不复杂。如果您的用户名是“archiver_username”,那么您应该能够使用资源中的`$ {aws:username}变量将其与存储桶“archiver_username_archive”匹配:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::${aws:username}_archive"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::${aws:username}_archive/*"
}
]
}
但该语言不允许您匹配名为“username_archive”的存储桶。