S3 кросс-аккаунт разрешений

Подобно тому, что описано в этой статье [0], компания, в которой я работаю, использует учетную запись AWS для хранения пользователей IAM и других учетных записей AWS для разделения различных рабочих сред (prod, dev и т. Д.). Это важно по той причине, что у нас есть несколько учетных записей AWS, и в некоторых уникальных случаях этим учетным записям AWS требуется доступ к одной корзине S3.

Чтобы это работало правильно, нужно установить политику сегментов, которая разрешает доступ к сегменту из конечной точки S3 из VPC конкретной учетной записи AWS.

  1. Политика Bucket для 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"
            }
        }
    }
    
  2. Ролевая политика для роли 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 для каждого отдельного объекта?

Примечание: мы используем spark для записи в s3, используя s3a.

[0] https://engineering.coinbase.com/you-need-more-than-one-aws-account-aws-bastions-and-assume-role-23946c6dfde3

1 ответ

Хотя я не нашел способа настройки списков ACL для каждого объекта, есть способ обеспечить правильную настройку списков ACL при загрузке с помощью Bucket Policy. В этом примере политики показано, как разрешить учетной записи 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 header (упоминается Michael-sqlbot в комментариях) и завершается неудачно при любой загрузке, где это не установлено. При использовании интерфейса командной строки AWS для загрузки файлов для этого требуется установить флаг --acl bucket-owner-full-control.

Пример:

aws s3 cp example-file.txt s3://data-warehouse/example-file.txt --profile aws-profile-name --acl bucket-owner-full-control

Надеемся, что в какой-то момент AWS предоставит способ более изящного обращения к спискам ACL.

Другие вопросы по тегам