Подобно тому, что описано в этой статье [0], компания, в которой я работаю, использует бастионную учетную запись AWS для хранения пользователей IAM и другие учетные записи AWS для разделения различных рабочих сред (prod, dev и т. Д.). Причина, по которой это важно, заключается в том, что у нас есть несколько учетных записей AWS, и в некоторых уникальных случаях этим учетным записям AWS требуется доступ к одной корзине S3.
Чтобы это работало правильно, можно установить политику корзины, которая разрешает доступ к корзине из конечной точки S3 из VPC определенного аккаунта AWS.
Политика сегмента для data-warehouse
{
"Sid": "access-from-dev-VPCE",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::data-warehouse",
"arn:aws:s3:::data-warehouse/*"
],
"Condition": {
"StringEquals": {
"aws:sourceVpce": "vpce-d95b05b0"
}
}
}
Ролевая политика для роли EMRRole
{
"Sid": "AllowRoleToListBucket",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": [
"arn:aws:s3:::data-warehouse",
]
},
{
"Sid": "AllowRoleToGetBucketObjects",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::data-warehouse/*"
}
К сожалению, это не сработает, пока я явно не установлю ACL для каждый объект чтобы предоставить полный контроль над этим объектом владельцу учетной записи AWS, из которой я получаю доступ. Если я этого не сделаю, я получу:
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
Мой экземпляр, на котором я запускаю это (EMR), имеет правильную роль:
[hadoop@ip-10-137-221-91 tmp]$ aws sts get-caller-identity
{
"Account": "1234567890",
"UserId": "AROAIGVIL6ZDI6SR87KXO:i-0eaf8a5ca52876835",
"Arn": "arn:aws:sts::1234567890:assumed-role/EMRRole/i-0eaf8a5ca52876835"
}
ACL для объекта в data-warehouse
ведро выглядит так:
aws s3api get-object-acl --bucket=data-warehouse --key=content_category/build=2017-11-23/part0000.gz.parquet
{
"Owner": {
"DisplayName": "aws+dev",
"ID": "YXJzdGFyc3RhcnRzadc6frYXJzdGFyc3RhcnN0"
},
"Grants": [
{
"Grantee": {
"Type": "CanonicalUser",
"DisplayName": "aws+dev",
"ID": "YXJzdGFyc3RhcnRzadc6frYXJzdGFyc3RhcnN0"
},
"Permission": "FULL_CONTROL"
}
]
}
В приведенном выше ACL dev
Учетная запись AWS сможет читать объект, но другая учетная запись AWS, скажем, prod
, воля не иметь возможность читать объект, пока он не будет добавлен как «Получатель гранта».
Мой вопрос: Есть ли способ читать / записывать объекты в корзину S3 из нескольких учетных записей AWS без необходимости устанавливать ACL для каждого отдельного объекта?
Примечание: мы используем искру для записи в s3 с помощью s3a.
Хотя я не нашел способа настроить списки ACL для каждого объекта, есть способ обеспечить правильную настройку списков ACL при загрузке с помощью политики сегмента. В этом примере политики показано, как разрешить учетной записи AWS загружать объекты в вашу корзину, и требуется, чтобы владельцу корзины был предоставлен полный контроль над всеми загруженными объектами:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSourceAccount0123456789ToPutObjects",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::0123456789:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::data-warehouse/*"
},
{
"Sid": "RequireAllUploadedObjectsToAssignFullControlToBucketOwner",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::data-warehouse/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
Ключом является явное отрицание, которое проверяет наличие x-amz-acl: bucket-owner-full-control
заголовок (упомянутый Michael-sqlbot в комментариях) и не выполняет любую загрузку, если он не установлен. При использовании интерфейса командной строки AWS для загрузки файлов требуется --acl bucket-owner-полный контроль устанавливаемый флаг.
Пример:
aws s3 cp example-file.txt s3://data-warehouse/example-file.txt --profile aws-profile-name --acl bucket-owner-full-control
Надеюсь, в какой-то момент AWS предоставит способ более изящно обращаться к ACL.