Amazon S3 버킷에 있는 객체에 대한 교차 계정 액세스 권한을 제공하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 9월 3일

Amazon S3(Amazon Simple Storage Service) 버킷에 저장된 객체에 대한 액세스 권한을 다른 AWS 계정에 부여하려고 합니다. Amazon S3 버킷에 대한 교차 계정 액세스 권한을 제공하려면 어떻게 해야 합니까?

간략한 설명

다음 방법 중 하나를 사용하여 S3 버킷에 저장된 객체에 대한 교차 계정 액세스 권한을 부여합니다.

  • S3 버킷 객체에 대한 프로그래밍 방식 전용 액세스를 위한 리소스 기반 정책 및 AWS Identity and Access Management(IAM) 정책
  • S3 버킷 객체에 대한 프로그래밍 방식 전용 액세스를 위한 리소스 기반 ACL(액세스 제어 목록) 및 IAM 정책
  • S3 버킷 객체에 대한 프로그래밍 방식 및 콘솔 액세스를 위한 교차 계정 IAM 역할

제공하려는 액세스 유형에 따라 다음 솔루션 중 하나를 사용하여 S3 버킷에 저장된 객체에 대한 세분화된 교차 계정 액세스 권한을 부여합니다. 다음 예제에서는 자신의 계정(계정 A)이 소유한 S3 버킷에 있는 객체를 다른 AWS 계정(계정 B)의 사용자가 관리할 수 있도록 해당 사용자에게 액세스 권한을 부여합니다.

참고: 계정 ID, 버킷 이름, ARN 등을 포함하도록 정책을 업데이트해야 합니다.

해결 방법

리소스 기반 정책 및 IAM 정책

버킷 정책을 사용하여 교차 계정 제어를 관리하고 S3 객체의 권한을 감사합니다. 버킷 수준에서 버킷 정책을 적용할 경우, 액세스할 수 있는 사용자(보안 주체 요소), 액세스할 수 있는 객체(리소스 요소) 및 액세스 방법(작업 요소)을 정의할 수 있습니다. 버킷 수준에서 버킷 정책을 적용하면 버킷 내의 여러 객체에 대한 세분화된 액세스를 정의할 수 있습니다. 버킷 정책을 검토하여 S3 버킷의 객체에 액세스할 수 있는 사용자를 확인할 수도 있습니다. 버킷 정책을 사용하여 S3 버킷 액세스를 관리하려면 다음 단계를 따르십시오.

1.    계정 A에서 Amazon S3 버킷을 생성합니다.

2.    계정 B에서 IAM 역할 또는 사용자를 생성합니다.

3.    이 IAM 정책을 사용하여 특정 S3 버킷에서 객체를 다운로드(GET Object)하고 업로드(PUT Object)할 수 있는 권한을 계정 B의 IAM 역할 또는 사용자에게 부여합니다. 또한 이 정책은 계정 B의 IAM 역할 또는 사용자에게 PUT Object acl을 호출하여 버킷 소유자에게 객체 권한을 부여할 수 있는 권한을 부여합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
  "s3:PutObject",
  "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountABucketName/*"

        }
    ]
}

참고: 리소스 요소에서 폴더 이름을 정의하여 계정 A의 특정 버킷 폴더에 대한 액세스를 제한할 수 있습니다(예: arn:aws:s3:::AccountABucketName/FolderName/*). 자세한 내용은 IAM 정책을 사용하여 특정 폴더에 대한 사용자별 액세스 권한을 부여하려면 어떻게 해야 합니까?를 참조하십시오.

4.    계정 B에서 생성한 IAM 역할 또는 사용자에게 권한을 부여하도록 계정 A에 대한 버킷 정책을 구성합니다. 이 버킷 정책을 사용하여 사용자에게 계정 A가 소유한 버킷의 객체에 대한 GetObject 및 PutObject 권한을 부여합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::AccountABucketName/*"
            ]
        }
    ]
}

참고: 리소스 요소에 특정 S3 버킷 폴더를 정의하여 "Resource": "arn:aws:s3:::AccountABucketName/FolderName/*"와 같이 보다 제한된 액세스를 위한 세분화된 액세스를 제공할 수 있습니다. s3: PutObject 권한과 조건을 사용하면 버킷 소유자가 다른 계정에서 업로드한 객체를 완전히 제어할 수 있습니다. 그러면 특정 헤더가 있는 ACL이 PutObject API 호출을 통해 전달됩니다. 자세한 내용은 버킷 소유자가 전체 권한을 가져오도록 요구하는 조건으로 s3:PutObject 권한 부여를 참조하십시오.

리소스 기반 ACL(액세스 제어 목록) 및 IAM 정책

객체 ACL을 사용하여 특정 시나리오와 ACL이 IAM 및 S3 버킷 정책보다 요구 사항을 더 잘 충족하는 경우에만 권한을 관리합니다. 자세한 내용은 ACL 기반 액세스 정책(버킷 및 객체 ACL)을 사용하는 경우를 참조하십시오. Amazon S3 ACL은 사용자가 READ, WRITE, READ_ACP, WRITE_ACP 및 FULL_CONTROL 권한 세트만 정의할 수 있도록 허용합니다. AWS 계정 또는 사전 정의된 Amazon S3 그룹 중 하나만 Amazon S3 ACL의 피부여자로 사용할 수 있습니다. AWS 계정의 이메일 주소 또는 정식 사용자 ID를 지정할 때 ACL은 피부여자 AWS 계정의 모든 엔터티에 적용됩니다. ACL을 사용하여 개별 IAM 사용자 또는 역할에 대한 액세스를 제한할 수 없습니다. 동일한 접두사를 공유하는 서로 다른 객체에는 ACL을 적용할 수 없습니다.

참고: 버킷 소유자는 ACL 피부여자가 업로드한 객체를 완전히 제어하지 못할 수 있습니다. 이는 ACL에서 승인하는 S3 작업에 대한 조건을 ACL이 지원하지 않기 때문입니다.

버킷 및 객체 ACL을 사용하여 S3 버킷 액세스를 관리하려면 다음 단계를 따르십시오.

1.    계정 B에서 IAM 역할 또는 사용자를 생성합니다. 그런 다음 필요한 Amazon S3 작업을 수행할 수 있는 권한을 해당 역할 또는 사용자에게 부여합니다. PutObject 및 GetObject를 호출하는 사용자는 리소스 기반 정책 및 IAM 정책 섹션에 나열된 권한이 필요합니다.

2.    계정 B에 대한 WRITE 이상의 권한을 포함하도록 버킷 ACL을 구성합니다. 이렇게 하면 계정 B의 IAM 역할 또는 사용자가 계정 A가 소유한 버킷에 객체를 업로드(PutObject API 호출)할 수 있습니다.

...
<AccessControlPolicy>
  <Owner>
    <ID> AccountACanonicalUserID </ID>
    <DisplayName> AccountADisplayName </DisplayName>
  </Owner>
  <AccessControlList>
...
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID> AccountBCanonicalUserID </ID>
        <DisplayName> AccountBDisplayName </DisplayName>
      </Grantee>
      <Permission> WRITE </Permission>
    </Grant>
    ...
  </AccessControlList>
</AccessControlPolicy>

참고: CanonicalUserID를 찾으려면 AWS 계정 정식 사용자 ID 찾기를 참조하십시오.

3.    계정 B에 대한 READ 이상의 권한을 포함하도록 객체 ACL을 구성합니다. 이렇게 하면 계정 B의 IAM 역할 또는 사용자가 계정 A가 소유한 버킷에서 객체를 다운로드(GetObject API 호출)할 수 있습니다.

...
<AccessControlPolicy>
  <Owner>
    <ID> AccountACanonicalUserID </ID>
    <DisplayName> AccountADisplayName </DisplayName>
  </Owner>
  <AccessControlList>
...
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID> AccountBCanonicalUserID </ID>
        <DisplayName> AccountBDisplayName </DisplayName>
      </Grantee>
      <Permission> READ </Permission>
    </Grant>
    ...
  </AccessControlList>
</AccessControlPolicy>

ACL 권한은 ACL이 적용되는 S3 리소스, 버킷 또는 객체에 따라 다릅니다. 자세한 내용은 ACL(액세스 제어 목록) 개요를 참조하십시오. 버킷을 생성하거나 기존 버킷에 객체를 업로드할 때 버킷 및 객체 ACL을 구성할 수 있습니다. 자세한 내용은 ACL 관리를 참조하십시오.

교차 계정 IAM 역할

모든 AWS 서비스가 리소스 기반 정책을 지원하는 것은 아닙니다. 이는 여러 서비스에 교차 계정 액세스를 제공할 때 교차 계정 IAM 역할을 사용하여 권한 관리를 중앙 집중화할 수 있음을 의미합니다. 교차 계정 IAM 역할을 사용하면 여러 S3 버킷에 저장된 S3 객체에 대한 교차 계정 액세스의 프로비저닝이 간소화되므로 S3 버킷에 대한 여러 정책을 관리할 필요가 없습니다. 이 방법은 다른 AWS 계정 또는 AWS 서비스가 소유하거나 업로드한 객체에 대한 교차 계정 액세스를 허용합니다. 교차 계정 IAM 역할을 사용하지 않는 경우 객체 ACL을 수정해야 합니다. 자세한 내용은 Amazon S3에서 객체 작업에 대한 요청에 권한을 부여하는 방법을 참조하십시오.

교차 계정 IAM 역할을 사용하여 S3 버킷 액세스를 관리하려면 다음 단계를 따르십시오.

1.    계정 A에서 IAM 역할을 생성합니다. 그런 다음 필요한 S3 작업을 수행할 수 있는 권한을 해당 역할에 부여합니다. 역할의 신뢰 정책에서 계정 B의 역할 또는 사용자에게 계정 A의 역할을 수임할 권한을 부여합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

다음 액세스 정책은 이 역할을 수임한 사용자가 프로그래밍 방식 및 Amazon S3 콘솔을 사용하여 객체를 다운로드하고 업로드할 수 있도록 허용합니다. 자세한 내용은 IAM 정책을 사용하여 특정 폴더에 대한 사용자별 액세스 권한을 부여하려면 어떻게 해야 합니까?를 참조하십시오.

참고: 프로그래밍 방식의 액세스만 필요한 경우 다음 정책의 처음 두 문을 제거할 수 있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::AccountABucketName"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::AccountABucketName/*"
        }
    ]
}

2.    계정 B의 IAM 역할 또는 사용자에게 계정 A에서 생성한 IAM 역할을 수임할 권한을 부여합니다.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::AccountA:role/AccountARole"
  }
}

3.    계정 B의 IAM 엔터티가 필요한 S3 작업을 수행할 수 있도록 계정 B의 역할 또는 사용자에서 계정 A의 역할을 수임합니다. 자세한 내용은 역할 전환(콘솔)을 참조하십시오.

참고: 계정 A의 IAM 역할을 수임하면 Amazon S3 작업은 액세스 정책에 따라 결정됩니다. IAM 역할은 계정 A의 로컬 IAM 엔터티가 수행한 API 호출로 간주됩니다. 교차 계정 액세스를 위한 버킷 정책 또는 ACL은 필요하지 않습니다. 자세한 내용은 Amazon S3 작업을 참조하십시오.