S3 교차 계정 버킷 권한

S3 교차 계정 버킷 권한

이 기사[0]에 설명된 내용과 유사하게 제가 일하는 회사에서는 배스천 AWS 계정을 사용하여 IAM 사용자와 기타 AWS 계정을 저장하여 다양한 실행 환경(프로덕션, 개발 등)을 분리합니다. 이것이 중요한 이유는 여러 개의 AWS 계정이 있고 일부 독특한 경우에는 이러한 AWS 계정이 단일 S3 버킷에 액세스해야 하기 때문입니다.

이것이 올바르게 작동하도록 하는 방법은 특정 AWS 계정의 VPC에서 S3 엔드포인트의 버킷에 대한 액세스를 허용하는 버킷 정책을 설정하는 것입니다.

  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에서 devAWS 계정은 객체를 읽을 수 있지만 다른 AWS 계정(예: )은 객체를 prod읽을 수 있습니다.~ 아니다"수혜자"로 추가될 때까지 개체를 읽을 수 있습니다.

내 질문:각 개별 객체에 ACL을 설정하지 않고도 여러 AWS 계정에서 S3 버킷에 객체를 읽고 쓸 수 있는 방법이 있습니까?

참고: 우리는 s3a를 사용하여 s3에 쓰기 위해 스파크를 사용합니다.

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

답변1

객체별로 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 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을 보다 적절하게 처리할 수 있는 방법을 제공할 수 있기를 바랍니다.

관련 정보