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

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

Подобно тому, что описано в этой статье[0], компания, в которой я работаю, использует учетную запись AWS bastion для хранения пользователей 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 без необходимости настраивать списки контроля доступа для каждого отдельного объекта?

Примечание: мы используем 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. Этот пример политики показывает, как разрешить учетной записи 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 CLI для загрузки файлов это требует--acl владелец-корзины-полный-контрольфлаг должен быть установлен.

Пример:

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

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

Связанный контент