Различные пользователи 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/
- Etc ...
Обратите внимание, что ключ 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
- поэтому я не уверенкак еще ограничить сферу действия этих разрешений.
Буду признателен за любые идеи относительно того, что не так или как этого добиться!