Назад | Перейти на главную страницу

Разрешения корзины для нескольких аккаунтов S3

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

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

  1. Политика сегмента для 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 для каждого отдельного объекта?

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

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

Хотя я не нашел способа настроить списки 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.