버킷 소유자 조건으로 버킷 소유권 확인

버킷 소유자 조건으로 버킷 소유권 확인

Amazon S3 버킷 소유자 조건은 내 S3 작업에서 사용하는 버킷이 내가 예상하는 AWS 계정에 속하는지 확인해 줘요.

대부분의 S3 작업은 특정 S3 버킷에서 읽거나 써요. 여기에는 객체 업로드, 복사, 다운로드, 버킷 구성 검색 또는 수정, 객체 구성 검색 또는 수정이 포함돼요. 이런 작업을 수행할 때 요청에 버킷 이름을 포함해 사용하려는 버킷을 지정해요. 예를 들어 S3에서 객체를 검색하려면 버킷 이름과 그 버킷에서 검색할 객체 키를 지정하는 요청을 만들어요.

Amazon S3는 이름으로 버킷을 식별하므로, 요청에 잘못된 버킷 이름을 사용하는 애플리케이션은 예상과 다른 버킷에 대해 의도치 않게 작업을 수행할 수 있어요. 이런 상황에서 의도하지 않은 버킷 상호작용을 피하려면 버킷 소유자 조건을 사용할 수 있어요.

버킷 소유자 조건을 사용하면 대상 버킷이 예상한 AWS 계정이 소유하는지 확인할 수 있어요. 이는 내 S3 작업이 의도한 효과를 내고 있는지에 대한 추가적인 보증 계층을 제공해요.

출처: 문서

본문

Topics (주제)

  • 버킷 소유자 조건을 사용할 때
  • 버킷 소유자 확인
  • 예제
  • 제한 사항

버킷 소유자 조건을 사용할 때

지원되는 S3 작업을 수행하면서 예상 버킷 소유자의 계정 ID를 알고 있다면 버킷 소유자 조건을 사용하는 것을 권장해요. 버킷 소유자 조건은 모든 S3 객체 작업과 대부분의 S3 버킷 작업에서 사용할 수 있어요. 버킷 소유자 조건을 지원하지 않는 S3 작업 목록은 제한 사항을 참고하세요.

버킷 소유자 조건을 사용할 때의 이점을 보려면 AWS 고객 Bea와 관련된 다음 시나리오를 살펴보세요.

  1. Bea는 Amazon S3를 사용하는 애플리케이션을 개발해요. 개발 중에 Bea는 테스트 전용 AWS 계정을 사용해 bea-data-test라는 버킷을 만들고, 애플리케이션이 bea-data-test에 요청하도록 구성해요.
  2. Bea는 애플리케이션을 배포하지만, 프로덕션 AWS 계정의 버킷을 사용하도록 애플리케이션을 다시 구성하는 것을 잊어요.
  3. 프로덕션에서 Bea의 애플리케이션은 bea-data-test에 요청하고 이 요청은 성공해요. 그 결과 프로덕션 데이터가 Bea의 테스트 계정의 버킷에 기록돼요.

Bea는 버킷 소유자 조건을 사용해 이런 상황으로부터 보호할 수 있어요. 버킷 소유자 조건을 사용하면 Bea가 예상 버킷 소유자의 AWS 계정 ID를 요청에 포함할 수 있어요. 그러면 Amazon S3가 각 요청을 처리하기 전에 버킷 소유자의 계정 ID를 확인해요. 실제 버킷 소유자가 예상 버킷 소유자와 일치하지 않으면 요청이 실패해요.

Bea가 버킷 소유자 조건을 사용하면 앞서 설명한 시나리오는 Bea의 애플리케이션이 실수로 테스트 버킷에 쓰는 결과를 낳지 않아요. 대신 3단계에서 Bea의 애플리케이션이 만드는 요청은 Access Denied 오류 메시지와 함께 실패해요. 버킷 소유자 조건을 사용함으로써 Bea는 잘못된 AWS 계정의 버킷과 실수로 상호작용할 위험을 없앨 수 있어요.

버킷 소유자 확인

버킷 소유자 조건을 사용하려면 예상 버킷 소유자를 지정하는 매개 변수를 요청에 포함해요. 대부분의 S3 작업은 버킷 하나만 포함하므로 버킷 소유자 조건을 사용하려면 이 단일 매개 변수만 필요해요. CopyObject 작업의 경우 이 첫 매개 변수가 대상 버킷의 예상 소유자를 지정하고, 원본 버킷의 예상 소유자를 지정하는 두 번째 매개 변수를 포함해요.

버킷 소유자 조건 매개 변수가 포함된 요청을 만들면 S3는 요청을 처리하기 전에 버킷 소유자의 계정 ID를 지정된 매개 변수와 비교해요. 매개 변수가 버킷 소유자의 계정 ID와 일치하면 S3는 요청을 처리해요. 매개 변수가 버킷 소유자의 계정 ID와 일치하지 않으면 요청은 Access Denied 오류 메시지와 함께 실패해요.

버킷 소유자 조건은 AWS Command Line Interface(AWS CLI), AWS SDK, Amazon S3 REST API에서 사용할 수 있어요. AWS CLI와 Amazon S3 REST API에서 버킷 소유자 조건을 사용할 때는 다음 매개 변수 이름을 사용하세요.

접근 방식 복사가 아닌 작업의 매개 변수 복사 작업 원본 매개 변수 복사 작업 대상 매개 변수
AWS CLI --expected-bucket-owner --expected-source-bucket-owner --expected-bucket-owner
Amazon S3 REST API x-amz-expected-bucket-owner 헤더 x-amz-source-expected-bucket-owner 헤더 x-amz-expected-bucket-owner 헤더

AWS SDK에서 버킷 소유자 조건을 사용하는 데 필요한 매개 변수 이름은 언어에 따라 달라져요. 필요한 매개 변수를 확인하려면 원하는 언어의 SDK 문서를 참고하세요. SDK 문서는 AWS에서 구축할 도구에서 찾을 수 있어요.

예제

다음 예제는 AWS CLI 또는 AWS SDK for Java 2.x를 사용해 Amazon S3에서 버킷 소유자 조건을 구현하는 방법을 보여 줘요.

예제 – 객체 업로드

다음 예제는 버킷 소유자 조건을 사용해 amzn-s3-demo-bucket1이 AWS 계정 111122223333에 의해 소유되었는지 확인하면서 S3 버킷 amzn-s3-demo-bucket1에 객체를 업로드해요.

AWS CLI

aws s3api put-object \
--bucket amzn-s3-demo-bucket1 --key exampleobject --body example_file.txt \
--expected-bucket-owner 111122223333

AWS SDK for Java 2.x

public void putObjectExample() {
    S3Client s3Client = S3Client.create();;
    PutObjectRequest request = PutObjectRequest.builder()
        .bucket("amzn-s3-demo-bucket1")
        .key("exampleobject")
        .expectedBucketOwner("111122223333")
        .build();
    Path path = Paths.get("example_file.txt");
    s3Client.putObject(request, path);
}

예제 – 객체 복사

다음 예제는 S3 버킷 amzn-s3-demo-bucket1의 객체 object1을 S3 버킷 amzn-s3-demo-bucket2로 복사해요. 버킷 소유자 조건을 사용해 다음 표에 따라 버킷이 예상 계정에 의해 소유되었는지 확인해요.

버킷 예상 소유자
amzn-s3-demo-bucket1 111122223333
amzn-s3-demo-bucket2 444455556666

AWS CLI

aws s3api copy-object --copy-source amzn-s3-demo-bucket1/object1 \
--bucket amzn-s3-demo-bucket2 --key object1copy \
--expected-source-bucket-owner 111122223333 --expected-bucket-owner 444455556666

AWS SDK for Java 2.x

public void copyObjectExample() {
    S3Client s3Client = S3Client.create();
    CopyObjectRequest request = CopyObjectRequest.builder()
        .copySource("amzn-s3-demo-bucket1/object1")
        .destinationBucket("amzn-s3-demo-bucket2")
        .destinationKey("object1copy")
        .expectedSourceBucketOwner("111122223333")
        .expectedBucketOwner("444455556666")
        .build();
    s3Client.copyObject(request);
}

예제 – 버킷 정책 검색

다음 예제는 버킷 소유자 조건을 사용해 amzn-s3-demo-bucket1이 AWS 계정 111122223333에 의해 소유되었는지 확인하면서 S3 버킷 amzn-s3-demo-bucket1의 접근 정책을 검색해요.

AWS CLI

aws s3api get-bucket-policy --bucket amzn-s3-demo-bucket1 --expected-bucket-owner 111122223333

AWS SDK for Java 2.x

public void getBucketPolicyExample() {
    S3Client s3Client = S3Client.create();
    GetBucketPolicyRequest request = GetBucketPolicyRequest.builder()
        .bucket("amzn-s3-demo-bucket1")
        .expectedBucketOwner("111122223333")
        .build();
    try {
        GetBucketPolicyResponse response = s3Client.getBucketPolicy(request);
    }
    catch (S3Exception e) {
        // The call was transmitted successfully, but Amazon S3 couldn't process
        // it, so it returned an error response.
        e.printStackTrace();
    }
}

제한 사항

Amazon S3 버킷 소유자 조건에는 다음과 같은 제한 사항이 있어요.

  • 버킷 소유자 조건 매개 변수의 값은 AWS 계정 ID(12자리 숫자 값)여야 해요. 서비스 보안 주체는 지원되지 않아요.
  • 버킷 소유자 조건은 CreateBucket, ListBuckets, 또는 AWS S3 Control에 포함된 작업에는 사용할 수 없어요. Amazon S3는 이 작업들에 대한 요청에 포함된 버킷 소유자 조건 매개 변수를 무시해요.
  • 버킷 소유자 조건은 검증 매개 변수에 지정된 계정이 버킷을 소유하는지만 확인해요. 버킷 소유자 조건은 버킷의 구성을 확인하지 않아요. 또한 버킷의 구성이 특정 조건을 충족하거나 과거 상태와 일치한다는 것도 보장하지 않아요.

더 알아보기 (Learn more)