메뉴
Amazon Simple Storage Service
개발자 안내서 (API Version 2006-03-01)

정책에서 조건 지정

권한 부여 시 액세스 정책 언어를 통해 조건을 지정할 수 있습니다. Condition 요소(또는 Condition 블록)를 사용하여 정책의 효력이 발생하는 시점에 대한 조건을 지정할 수 있습니다. 선택적으로 Condition 요소에서 요청의 값과 조건을 매칭하기 위해 부울 연산자(equal, less than 등)를 사용하는 식을 작성할 수 있습니다. 예를 들어 객체를 업로드하는 사용자 권한을 부여하는 경우, 버킷 소유자는 다음과 같이 StringEquals 조건을 추가하여 객체가 공개적으로 읽기 가능하도록 요구할 수 있습니다.

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::examplebucket/*" ], "Condition": { "StringEquals": { "s3:x-amz-acl": [ "public-read" ] } } } ] }

Condition 블록에서는 지정된 키-값 페어 "s3:x-amz-acl":["public-read"]에 적용되는 StringEquals 조건을 지정합니다. 조건을 나타내는 데에 사용할 수 있는 사전 정의된 키 집합이 있습니다. 이 예제에서는 s3:x-amz-acl 조건 키를 사용합니다. 이 조건에서는 사용자에게 모든 PUT Object 요청에 public-read 값을 가진 x-amz-acl 헤더를 포함하도록 요구합니다.

액세스 정책 언어로 조건을 지정하는 방법에 대한 자세한 내용은 IAM 사용 설명서조건 단원을 참조하십시오.

다음 주제에서는 AWS 차원의 조건 키와 Amazon S3 전용 조건 키에 대해 설명하고 정책 예제를 제공합니다.

사용 가능한 조건 키

Amazon S3 액세스 정책에서 조건 지정을 위해 사용 가능한 사전 정의된 키는 다음과 같이 분류될 수 있습니다.

  • AWS 차원의 키 - AWS에서는 정책을 지원하는 전체 AWS 서비스에서 지원되는 공통 키 집합을 제공합니다. 모든 서비스에 공통된 이 키들은 AWS 차원 키라고 하며 접두사 aws:을 사용합니다. AWS 차원 키 목록은 IAM 사용 설명서사용 가능한 조건 키 단원을 참조하십시오. Amazon S3 전용 키도 있는데, 이 키들은 접두사 s3:을 사용합니다. Amazon S3 전용 키는 다음 글머리표 항목에 설명되어 있습니다.

     

    새 조건 키 aws:sourceVpceaws:sourceVpc가 VPC 엔드포인트의 버킷 정책에 사용되었습니다. 이러한 조건 키의 사용 예는 Amazon S3의 VPC 엔드포인트에 대한 예제 버킷 정책 단원을 참조하십시오.

    다음 버킷 정책 예제에서는 요청이 특정 범위의 IP 주소(192.168.143.*)에서 비롯된 경우 s3:GetObject 작업을 사용하기 위한 인증된 사용자 권한을 허용합니다.단, IP 주소가 192.168.143.188인 경우는 예외입니다. 조건 블록에서 IpAddressNotIpAddress가 조건에 해당하며 각 조건에는 평가를 위한 키-값 페어가 제공됩니다. 이 예제에서의 키-값 페어는 모두 aws:SourceIp라는 AWS 차원의 키를 사용합니다.

    참고

    조건에 지정된 IPAddressNotIpAddress 키 값은 RFC 4632에 설명된 것과 같은 CIDR 표기법을 사용합니다. 자세한 내용은 http://www.rfc-editor.org/rfc/rfc4632.txt를 참조하십시오.

    Copy
    { "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": "*", "Action":["s3:GetObject"] , "Resource": "arn:aws:s3:::examplebucket/*", "Condition" : { "IpAddress" : { "aws:SourceIp": "192.168.143.0/24" }, "NotIpAddress" : { "aws:SourceIp": "192.168.143.188/32" } } } ] }
  • Amazon S3 전용 키 – AWS 차원 키에 더해 Amazon S3 전용 권한을 부여하는 컨텍스트에서만 적용 가능한 다음과 같은 조건 키도 있습니다. 이러한 Amazon S3 전용 키는 접두사 s3:을 사용합니다.

    • s3:x-amz-acl

    • s3:x-amz-copy-source

    • s3:x-amz-metadata-directive

    • s3:x-amz-server-side-encryption

    • s3:VersionId

    • s3:LocationConstraint

    • s3:delimiter

    • s3:max-keys

    • s3:prefix

    • s3:x-amz-server-side-encryption-aws-kms-key-id

    • s3:ExistingObjectTag/<tag-key>

      조건 키와 관련하여 객체 태그를 사용하는 정책의 예는 객체 태그 지정 및 액세스 제어 정책 단원을 참조하십시오.

    • s3:RequestObjectTagKeys

    • s3:RequestObjectTag/<tag-key>

     

    예를 들어 다음 버킷 정책에서는 객체를 공개적으로 읽기 가능하도록 만드는 x-amz-acl 헤더가 요청에 포함된 경우, 두 개의 AWS 계정에 대해 s3:PutObject 권한을 허용합니다.

    Copy
    { "Version":"2012-10-17", "Statement": [ { "Sid":"AddCannedAcl", "Effect":"Allow", "Principal": { "AWS": ["arn:aws:iam::account1-ID:root","arn:aws:iam::account2-ID:root"] }, "Action":["s3:PutObject"], "Resource": ["arn:aws:s3:::examplebucket/*"], "Condition": { "StringEquals": { "s3:x-amz-acl":["public-read"] } } } ] }

    Condition 블록에서는 StringEquals 조건을 사용하며 여기에는 평가를 위한 키-값 페어 "s3:x-amz-acl":["public-read"가 제공됩니다. 키-값 페어에서 s3:x-amz-acl은 Amazon S3 전용 키로서, 접두사 s3:로 표시됩니다.

중요

모든 조건이 전체 작업에 적용되는 것은 아닙니다. 예를 들어 s3:LocationConstraint Amazon S3 권한을 부여하는 정책에는 s3:CreateBucket 조건을 포함하는 것이 가능하지만, s3:GetObject 권한에 대해서는 그렇지 않습니다. Amazon S3에서는 Amazon S3 전용 조건을 포함한 이러한 유형의 의미 체계 오류를 테스트할 수 있습니다. 그러나, IAM 사용자에 대해 정책을 만드는 경우 의미 체계상으로 잘못된 Amazon S3 조건을 포함한다 해도, IAM에서 Amazon S3 조건을 검증할 수 없으므로 오류는 보고되지 않습니다.

다음 단원에서는 버킷 및 객체 작업에 대한 조건부 권한을 부여하는 데 사용할 수 있는 조건 키를 설명합니다. 또한 Amazon S3 서명 버전 4 인증과 관련된 조건 키가 나와 있습니다. 자세한 내용은 Amazon Simple Storage Service API ReferenceAmazon S3 Signature Version 4 Authentication Specific Policy Keys 단원을 참조하십시오.

객체 작업에 대한 Amazon S3 조건 키

다음 표에서는 Amazon S3 작업과 함께 사용 가능한 Amazon S3 조건의 종류를 보여 줍니다. 정책 예제가 표에 이어서 제공되어 있습니다. 다음 표에 설명되어 있는 Amazon S3 전용 조건 키에 대한 다음 내용에 유의하십시오:

  • 조건 키 이름 앞에는 접두사 s3:이 옵니다. 예, s3:x-amz-acl.

  • 각 조건 키는 API에서 조건이 설정될 수 있도록 허용된 같은 이름의 요청 헤더에 매핑됩니다. 즉, 이러한 조건 키는 이름이 같은 요청 헤더의 동작을 명령합니다. 예:

    • s3:PutObject 권한에 대한 조건 권한을 부여하는 데 사용할 수 있는 조건 키 s3:x-amz-acl은 PUT Object API에서 지원되는 x-amz-acl 요청 헤더의 동작을 정의합니다.

    • s3:GetObjectVersion 권한에 대한 조건부 권한을 부여하는 데 사용할 수 있는 조건 키 s3:VersionId는 GET Object 요청에서 설정한 versionId 쿼리 파라미터의 동작을 정의합니다.

권한 적용 가능한 조건 키(또는 키워드) 설명

s3:PutObject

  • s3:x-amz-acl(미리 준비된 ACL 권한의 경우)

  • s3:x-amz-grant-permission(명시적 권한의 경우). 여기서 permission에는 다음이 올 수 있음:

    read, write,​ read-acp,​ write​-acp,​ ​full​-control

PUT Object 작업은 ACL 기반 권한을 부여하는 데 사용할 수 있는 ACL(액세스 제어 목록) 전용 헤더를 허용합니다. 이러한 키를 사용하면 버킷 소유자는 사용자가 객체를 업로드할 때 특정 액세스 권한을 요구하도록 조건을 설정할 수 있습니다.

정책 예제는 예제 1: 버킷 소유자가 전체 권한을 가져오도록 요구하는 조건으로 s3:PutObject 권한 부여을 참조하십시오..

ACL에 대한 자세한 내용은 ACL(액세스 제어 목록) 개요 단원을 참조하십시오.

s3:x-amz-copy-source

객체를 복사하려면 PUT Object API(PUT Object 참조)를 사용하고 x-amz-copy-source 헤더를 사용하여 원본을 지정합니다. 이 키를 사용하면 버킷 소유자는 특정 버킷, 버킷의 특정 폴더 또는 버킷의 특정 객체에 대한 복사 원본을 제한할 수 있습니다.

정책 예제는 예제 3: 복사 원본에 대한 제한이 있는 s3:PutObject 객체 복사 권한을 부여 단원을 참조하십시오.

s3:x-amz-server-side-encryption

객체를 업로드할 때 AWS Key Management Service(KMS) 또는 Amazon S3에 의해 관리되는 봉투 암호화 키를 사용하여 저장 시 객체를 암호화하도록 x-amz-server-side-encryption 헤더를 사용하여 Amazon S3에 요청할 수 있습니다(서버 측 암호화를 사용하여 데이터 보호 참조).

s3:PutObject 권한을 부여하는 경우 버킷 소유자는 이 키를 사용하여 요청에 이 헤더를 지정하도록 사용자에게 요구하는 조건을 추가할 수 있습니다. 버킷 소유자는 사용자가 업로드한 객체를 저장할 때 암호화하도록 그러한 조건부 권한을 부여할 수 있습니다.

정책 예제는 예제 1: 버킷 소유자가 전체 권한을 가져오도록 요구하는 조건으로 s3:PutObject 권한 부여 단원을 참조하십시오.

s3:x-amz-server-side-encryption-aws-kms-key-id

객체를 업로드할 때 지정된 AWS KMS 키를 사용하여 저장 시 객체를 암호화하도록 x-amz-server-side-encryption-aws-kms-key-id 헤더를 사용하여 Amazon S3에 요청할 수 있습니다(AWS KMS 관리형 키(SSE-KMS)를 사용하는 서버 측 암호화로 데이터 보호 참조).

버킷 소유자는 s3:PutObject 권한을 부여할 때 이 키를 사용하여 객체 암호화에 사용되는 AWS KMS 키 ID를 특정 값으로 제한하도록 조건을 추가할 수 있습니다.

버킷 소유자는 사용자가 업로드한 객체를 저장할 때 특정 키로 암호화하도록 그러한 조건부 권한을 부여할 수 있습니다.

정책에 지정하는 KMS 키는 다음과 같은 형식을 사용해야 합니다.

arn:aws:kms:region:acct-id:key/key-id

s3:x-amz-metadata-directive

PUT Object API(PUT Object 참조)를 사용하여 객체를 복사하는 경우, 선택적으로 x-amz-metadata-directive 헤더를 추가하여 객체 메타데이터를 원본 객체로부터 복사할지 아니면 요청에 제공된 메타데이터로 대체할지 여부를 지정할 수 있습니다.

이 키 버킷을 사용하면 소유자는 객체가 업로드될 때 특정 동작을 강제로 실행하는 조건을 추가할 수 있습니다.

유효한 값: COPY | REPLACE. 기본값은 COPY입니다.

s3:x-amz-storage-class

기본적으로 s3:PutObjectSTANDARD 스토리지 클래스를 사용하여 객체를 저장하지만 x-amz-storage-class 요청 헤더를 사용하여 다른 스토리지 클래스를 지정할 수도 있습니다.

s3:PutObject 권한을 부여할 때는 s3:x-amz-storage-class 조건 키를 사용하여 업로드된 객체를 저장할 때 사용할 스토리지 클래스를 제한하는 것도 가능합니다. 스토리지 클래스에 대한 자세한 정보는 스토리지 클래스를 참조하십시오.

정책에 대한 예는 예 5: 특정 스토리지 클래스를 이용한 객체 업로드 제한을 참조하십시오.

유효한 값: STANDARD | STANDARD_IA | REDUCED_REDUNDANCY. 기본값은 STANDARD입니다.

  • s3:RequestObjectTagKeys

  • s3:RequestObjectTag/<tag-key>

이 조건 키를 사용하여 요청에서 허용되는 객체 태그를 제한함으로써 s3:PutObject 작업에 대한 권한을 제한할 수 있습니다. 이러한 조건 키의 사용 예는 객체 태그 지정 및 액세스 제어 정책 단원을 참조하십시오.

s3:PutObjectAcl

  • s3:x-amz-acl(미리 준비된 ACL 권한의 경우)

  • s3:x-amz-grant-permission(명시적 권한의 경우). 여기서 permission에는 다음이 올 수 있음:

    read, write,​ read-acp,​ write​-acp,​ ​grant-full​-control

PUT Object ACL API는 지정된 객체에 ACL(액세스 제어 목록)을 설정합니다. 이 작업에서는 ACL 관련 헤더를 지원합니다. 이 권한을 부여할 때 버킷 소유자는 특정 권한을 요구하는 이러한 키를 사용하여 조건을 추가할 수 있습니다. ACL에 대한 자세한 내용은 ACL(액세스 제어 목록) 개요 단원을 참조하십시오.

예를 들어 버킷 소유자가 객체 소유자가 누구인지와 상관없이 객체에 대한 제어를 유지하려 할 수 있습니다. 이 작업을 수행하기 위해서는 버킷 소유자가 이러한 키 중 하나를 사용하여 버킷 소유자에 대한 특정 권한을 포함하도록 사용자에게 요구하는 조건을 추가할 수 있습니다.

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 s3:PutObjectAcl 작업에 대한 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:PutObjectTagging

  • s3:RequestObjectTagKeys

  • s3:RequestObjectTag/<tag-key>

이 조건 키를 사용하여 요청에서 허용되는 객체 태그를 제한함으로써 s3:PutObjectTagging 작업에 대한 권한을 제한할 수 있습니다. 이러한 조건 키의 사용 예는 객체 태그 지정 및 액세스 제어 정책 단원을 참조하십시오.

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:PutObjectVersionTagging

  • s3:RequestObjectTagKeys

  • s3:RequestObjectTag/<tag-key>

이 조건 키를 사용하여 요청에서 허용되는 객체 태그를 제한함으로써 s3:PutObjectVersionTagging 작업에 대한 권한을 제한할 수 있습니다. 이러한 조건 키의 사용 예는 객체 태그 지정 및 액세스 제어 정책 단원을 참조하십시오.

s3:VersionId

이 조건 키를 사용하여 s3:PutObjectVersionTagging 작업에 대한 권한을 특정 객체 버전으로 제한할 수 있습니다. 정책에 대한 예는 예제 4: 특정 버전의 객체에 대한 액세스 권한을 부여을 참조하십시오.

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:GetObjectVersion

s3:VersionId

이러한 Amazon S3 권한을 통해 사용자는 Amazon S3 API 작업 집합을 수행할 수 있습니다(Amazon S3 스토리지 클래스 분석 내보내기 파일 레이아웃객체 작업에 대한 Amazon S3 권한 참조). 버전 관리를 사용하는 버킷의 경우 데이터를 가져올 객체 버전을 지정할 수 있습니다.

이 키를 사용하는 조건을 추가함으로써 버킷 소유자는 사용자가 특정 버전의 객체에 대한 데이터만 액세스하도록 제한할 수 있습니다. 정책에 대한 예는 예제 4: 특정 버전의 객체에 대한 액세스 권한을 부여을 참조하십시오.

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:GetObject

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:GetObjectAcl

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:GetObjectVersionAcl

s3:VersionId

GET Object acl API를 사용하여 특정 객체 버전의 ACL(액세스 제어 목록)을 검색할 수 있습니다. 사용자는 s3:GetObjectVersionAcl 작업에 대한 권한이 있어야 합니다. 버전 관리를 사용하는 버킷의 경우 이 Amazon S3 권한은 사용자에게 특정 버전의 객체에 대한 ACL을 가져오도록 허용합니다.

버킷 소유자는 이 키를 사용하는 조건을 추가하여 특정 버전의 객체로 사용자를 제한할 수 있습니다.

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:PutObjectVersionAcl

s3:VersionId

버전 관리를 사용하는 버킷의 경우 특정 객체 버전에 대해 ACL을 설정하는 PUT Object acl 요청에서 객체 버전을 지정할 수 있습니다. 이 조건을 사용하여 버킷 소유자는 특정 버전의 객체에 대해서만 ACL을 설정하도록 사용자를 제한할 수 있습니다.

  • s3:x-amz-acl(미리 준비된 ACL 권한의 경우)

  • s3:x-amz-grant-permission(명시적 권한의 경우). 여기서 permission에는 다음이 올 수 있음:

    read, write,​ read-acp,​ write​-acp,​ ​grant-full​-control

버전 관리를 사용하는 버킷의 경우 이 Amazon S3 권한은 사용자에게 특정 버전의 객체에 대해 ACL을 설정하도록 허용합니다.

이러한 조건 키에 관한 설명은 이 표에서 s3:PutObjectACL 권한 부분을 참조하십시오.

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:DeleteObjectVersion

s3:VersionId

버전 관리를 사용하는 버킷의 경우 이 Amazon S3 권한은 사용자에게 특정 버전의 객체를 삭제하도록 허용합니다.

버킷 소유자는 이 키를 사용하는 조건을 추가하여 사용자가 특정 버전의 객체만 삭제할 수 있도록 제한할 수 있습니다.

이러한 조건 키의 사용 예는 예제 4: 특정 버전의 객체에 대한 액세스 권한을 부여 단원을 참조하십시오. 이 예제는 s3:GetObjectVersion 작업 권한 부여에 관한 것이지만 정책에서 이 조건 키의 사용 사례를 보여 줍니다.

s3:DeleteObjectTagging

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:DeleteObjectVersionTagging

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:VersionId

이 조건 키를 사용하여 s3:DeleteObjectVersionTagging 작업에 대한 권한을 특정 객체 버전으로 제한할 수 있습니다. 정책에 대한 예는 예제 4: 특정 버전의 객체에 대한 액세스 권한을 부여을 참조하십시오.

s3:GetObjectTagging

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:GetObjectVersionTagging

s3:ExistingObjectTag/<tag-key>

이 조건 키를 사용하여 권한을 특정 태그 키 및 값이 있는 객체에만 제한할 수 있습니다. 예제는 객체 태그 지정 및 액세스 제어 정책을 참조하십시오.

s3:VersionId

이 조건 키를 사용하여 s3:GetObjectVersionTagging 작업에 대한 권한을 특정 객체 버전으로 제한할 수 있습니다. 정책에 대한 예는 예제 4: 특정 버전의 객체에 대한 액세스 권한을 부여을 참조하십시오.

예제 1: 버킷 소유자가 전체 권한을 가져오도록 요구하는 조건으로 s3:PutObject 권한 부여

Account A가 버킷을 소유하고 있고 계정 관리자는 Dave라는 Account B의 사용자에게 객체 업로드 권한을 부여하려 한다고 가정합니다. 기본적으로 Dave가 업로드하는 객체는 Account B의 소유이며 Account A에는 이러한 객체에 대한 권한이 없습니다. 버킷 소유자는 비용을 지불하고 있으므로 Dave가 업로드한 객체에 대한 전체 권한을 갖길 원합니다. Account A 관리자는 요청에 명시적으로 전체 권한을 부여하거나 미리 준비된 ACL을 사용하는 ACL 전용 헤더를 포함하는 조건으로 s3:PutObject 권한을 Dave에게 부여함으로써 이 작업을 수행할 수 있습니다(PUT Object 참조).

  • 버킷 소유자에 대한 전체 제어 권한으로 요청에 x-amz-full-control 헤더를 포함하도록 요구.

    다음 버킷 정책은 s3:x-amz-grant-full-control 조건 키를 사용하는 조건으로 사용자 Dave에게 s3:PutObject 권한을 부여합니다. 이 조건 키는 요청에 x-amz-full-control 헤더를 포함하도록 요구합니다.

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } } ] }

    참고

    이 예제는 계정 간 권한에 관한 것입니다. 그러나, 권한을 가져오는 Dave가 버킷을 소유한 AWS 계정에 속한 경우, Dave가 속한 상위 계정이 사용자가 업로드한 객체를 소유하고 있으므로 이러한 조건부 권한은 필요하지 않습니다.

    앞서 다뤄본 버킷 정책에서는 조건부 권한을 Account B의 사용자 Dave에게 부여했습니다. 반면 이 정책이 적용되면 Dave는 다른 정책을 통한 어떠한 조건 없이도 같은 권한을 가질 수 있습니다. 예를 들어 Dave는 특정 그룹에 속할 수 있으며 이 그룹에 아무런 조건 없이 s3:PutObject 권한을 부여합니다. 그러한 권한 순환 고리를 끊기 위해 명시적 거부를 추가하여 더 강력한 액세스 정책을 작성할 수 있습니다. 이 예제에서는 버킷 소유자에게 전체 권한을 부여하는 요청에 필수 헤더를 포함하지 않은 경우 사용자 Dave의 업로드 권한을 명시적으로 거부합니다. 명시적 거부는 이미 부여된 다른 모든 권한에 항상 우선합니다. 다음은 개정된 액세스 정책 예제입니다.

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } } ] }

    두 개의 AWS 계정이 있는 경우 AWS CLI를 사용하여 정책을 테스트할 수 있습니다. Dave의 자격 증명을 사용하여 정책을 연결하고 다음 AWS CLI put-object 명령을 사용하여 권한을 테스트합니다. --profile 파라미터를 추가하여 Dave의 자격 증명을 제공합니다. --grant-full-control 파라미터를 추가하여 버킷 소유자에게 전체 제어 권한을 부여합니다. AWS CLI의 설정 및 사용에 대한 자세한 내용은 예제 안내를 위한 도구 설정 단원을 참조하십시오.

    Copy
    aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBUserProfile
  • 버킷 소유자에 대한 전체 제어 권한을 부여하는 미리 준비된 ACL 사용 x-amz-acl 헤더를 포함하도록 요구합니다.

    요청에 x-amz-acl 헤더를 포함하도록 요구하려면 아래와 같이 Condition 블록의 키-값 페어를 대체하고 s3:x-amz-acl 조건 키를 지정할 수 있습니다.

    Copy
    "Condition": { "StringNotEquals": { "s3:x-amz-acl": "bucket-owner-full-control" }

    AWS CLI를 사용하는 권한을 테스트하려면 --acl 파라미터를 지정합니다. 그런 뒤 AWS CLI에서는 요청을 보낼 때 x-amz-acl 헤더를 추가합니다.

    Copy
    aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --acl "bucket-owner-full-control" --profile AccountBadmin

예제 2: 서버 측 암호화를 사용하여 저장된 객체를 요구하는 s3:PutObject 권한 부여

Account A에서 버킷을 소유하고 있고 계정 관리자는 Account A의 사용자인 Jane이 Amazon S3에서 암호화된 객체를 저장할 수 있도록 항상 서버 측 암호화를 요청한다는 조건으로 그녀에게 객체 업로드 권한을 부여하려 한다고 가정합니다. Account A 관리자는 다음과 같이 s3:x-amz-server-side-encryption 조건 키를 사용하여 이 작업을 수행할 수 있습니다. Condition 블록의 키-값 페어는 s3:x-amz-server-side-encryption 키를 지정합니다.

Copy
"Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" }

AWS CLI를 사용하여 권한을 테스트하는 경우 --server-side-encryption 파라미터를 사용하여 필요한 파라미터를 추가해야 합니다.

Copy
aws s3api put-object --bucket example1bucket --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountBadmin

예제 3: 복사 원본에 대한 제한이 있는 s3:PutObject 객체 복사 권한을 부여

PUT Object 요청에서 원본 객체를 지정하는 경우, 이는 복사 작업에 해당합니다(PUT Object - Copy 참조). 따라서 버킷 소유자는 원본에 대한 제한이 있는 객체 복사 권한을 사용자에게 부여할 수 있습니다. 예:

  • sourcebucket 버킷에서만 객체를 복사하도록 허용합니다.

  • sourcebucket 버킷에서 객체를 복사하도록 허용하며 키 이름의 접두사가 public/로 시작하는 객체만 복사하도록 허용합니다(예: sourcebucket/public/*).

  • sourcebucket에서 특정 객체만 복사하도록 허용합니다. 예, sourcebucket/example.jpg.

다음 버킷 정책은 요청에 s3:x-amz-copy-source 헤더를 포함하고 헤더 값으로 /examplebucket/public/* 키 이름 접두사를 지정하는 조건을 충족하는 객체만 복사하도록 허용하는 권한을 s3:PutObject 사용자 Dave에게 부여합니다.

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "cross-account permission to user in your own account", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": ["s3:PutObject"], "Resource": "arn:aws:s3:::examplebucket/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/folder", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::examplebucket/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "examplebucket/public/*" } } } ] }

AWS CLI copy-object 명령을 사용하는 권한을 테스트할 수 있습니다. --copy-source 파라미터를 추가하여 원본을 지정할 수 있습니다. 이때 키 이름은 정책에 허용된 접두사와 일치해야 합니다. --profile 파라미터를 사용하는 사용자 Dave의 자격 증명을 제공해야 합니다. AMI CLI 설정에 대한 자세한 내용은 예제 안내를 위한 도구 설정 단원을 참조하십시오.

Copy
aws s3api copy-object --bucket examplebucket --key HappyFace.jpg --copy-source examplebucket/public/PublicHappyFace1.jpg --profile AccountADave

앞서 다룬 정책에서는 StringNotLike 조건을 사용합니다. 특정 객체만 복사할 수 있는 권한을 부여하려면 StringNotLike에서 StringNotEquals로 조건을 변경한 뒤 다음과 같이 정확한 객체 키를 지정해야 합니다.

Copy
"Condition": { "StringNotEquals": { "s3:x-amz-copy-source": "examplebucket/public/PublicHappyFace1.jpg" } }

예제 4: 특정 버전의 객체에 대한 액세스 권한을 부여

Account A에서 버전 관리를 사용하는 버킷을 소유하고 있다고 가정합니다. 버킷에는 몇 가지 버전의 HappyFace.jpg 객체가 있습니다. 계정 관리자는 현재 해당 계정의 사용자(Dave)에게 특정 버전의 객체만 가져올 수 있는 권한을 부여하려 합니다. 계정 관리자는 다음과 같이 조건부로 Dave에게 s3:GetObjectVersion 권한을 부여함으로써 이 작업을 수행할 수 있습니다. Condition 블록의 키-값 페어는 s3:VersionId 조건 키를 지정합니다.

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": ["s3:GetObjectVersion"], "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": ["s3:GetObjectVersion"], "Resource": "arn:aws:s3:::examplebucketversionenabled/HappyFace.jpg", "Condition": { "StringNotEquals": { "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e" } } } ] }

이 경우 Dave는 가져오려는 객체의 정확한 객체 버전 ID를 알고 있어야 합니다.

특정 객체 버전을 식별하는 --version-id 파라미터를 적용한 AWS CLI get-object 명령을 사용하여 권한을 테스트할 수 있습니다. 이 명령은 객체를 가져와서 이를 OutputFile.jpg 파일로 저장합니다.

Copy
aws s3api get-object --bucket examplebucketversionenabled --key HappyFace.jpg OutputFile.jpg --version-id AaaHbAQitwiL_h47_44lRO2DDfLlBO5e --profile AccountADave

예 5: 특정 스토리지 클래스를 이용한 객체 업로드 제한

Account A가 버킷을 소유하고 있고, 계정 관리자는 Account A에 속한 사용자 Dave만 STANDARD_IA 스토리지 클래스를 이용해 저장할 버킷에 객체를 업로드할 수 있도록 허용하려고 합니다. Account A 관리자는 다음 버킷 정책 예와 같이 s3:x-amz-storage-class 조건 키를 사용해 이러한 객체 업로드 제한이 가능합니다.

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA-ID:user/Dave" }, "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::examplebucket/*" ], "Condition": { "StringEquals": { "s3:x-amz-storage-class": [ "STANDARD_IA" ] } } } ] }

버킷 작업에 대한 Amazon S3 조건 키

다음 표에는 정책에서 부여할 수 있는 버킷 작업별 권한과 각 권한에 대해 조건 지정에 사용 가능한 키의 목록이 나와 있습니다.

권한 적용 가능한 조건 키 설명

s3:CreateBucket

  • s3:x-amz-acl(미리 준비된 ACL 권한의 경우)

  • s3:x-amz-grant-permission(명시적 권한의 경우). 여기서 permission에는 다음이 올 수 있음:

    read, write,​ read-acp,​ write​-acp,​ ​full​-control

Create Bucket API(PUT Bucket 참조)는 ACL 전용 헤더를 지원합니다. 이러한 조건 키를 사용하여 사용자가 이러한 헤더를 특정 권한을 부여하는 요청에 설정하도록 요구할 수 있습니다.

s3:LocationConstraint

이 조건 키를 사용하여 사용자가 특정 리전에서 버킷을 만들도록 제한할 수 있습니다. 정책 예제는 예제 1: 사용자에게 특정 리전에서만 버킷을 생성하도록 허용 단원을 참조하십시오.

s3:ListBucket

s3:prefix

이 조건 키를 사용하여 Get Bucket (List Objects) API(GET Bucket (List Objects) 참조)의 응답을 키 이름에 특정 접두사가 있는 경우로 제한할 수 있습니다.

Get Bucket (List Objects) API에서는 지정된 버킷에 있는 객체 키의 목록을 반환합니다. 이 API는 특정 접두사가 있는 객체 키만 가져오는 prefix 헤더를 지원합니다. 이 조건 키는 prefix 헤더와 관련되어 있습니다.

예를 들어 Amazon S3 콘솔에서는 키 이름 접두사를 사용하는 폴더 개념을 지원합니다. 따라서 키 이름이 public/object1.jpgpublic/object2.jpg인 두 개의 객체가 있는 경우, 콘솔에서는 public 폴더 아래에 객체가 나타납니다. 그러한 접두사를 사용하여 객체 키를 구성하는 경우, 사용자가 특정 접두사가 있는 키 이름 목록을 가져오도록 허용하는 조건으로 s3:ListBucket 권한을 부여할 수 있습니다.

정책 예제는 예제 2: 사용자가 특정 접두사에 따라 버킷의 객체 목록을 가져오도록 허용 단원을 참조하십시오.

s3:delimiter

접두사 및 접미사를 사용하는 객체 키 이름을 구성하는 경우, 사용자에게 Get Bucket (List Objects) 요청에 delimiter 파라미터를 지정하도록 요구하는 이 조건 키를 사용할 수 있습니다. 이 경우 Amazon S3에서 반환하는 응답은 그룹으로 묶인 공통 접두사가 있는 객체 키 목록이 됩니다. 접두사 및 접미사를 사용하는 예제는 Get Bucket (List Objects)을 참조하십시오.

s3:max-keys

이 조건을 사용하면 사용자에게 max-keys 파라미터를 지정하도록 요구함으로써 Get Bucket (List Objects) 요청에 대한 응답으로 Amazon S3에서 반환하는 키의 개수를 제한할 수 있습니다. 기본적으로 API에서는 최대 1,000개의 키 이름을 반환합니다.

사용 가능한 숫자 조건의 목록은 IAM 사용 설명서숫자 조건 연산자 단원을 참조하십시오.

s3:ListBucketVersions

s3:prefix

버킷에서 버전 관리를 사용하는 경우 GET Bucket Object versions API(GET Bucket Object versions 참조)를 사용하여 전체 객체 버전의 메타데이터를 가져올 수 있습니다. 이 API의 경우 버킷 소유자가 정책에 s3:ListBucketVersions 권한을 부여해야 합니다.

이 조건 키를 사용하면 사용자에게 요청에 특정 값을 가진 prefix 파라미터를 지정하도록 요구함으로써 특정 접두사가 있는 키 이름으로 API의 응답을 제한할 수 있습니다.

예를 들어 Amazon S3 콘솔에서는 키 이름 접두사를 사용하는 폴더 개념을 지원합니다. 키 이름이 public/object1.jpgpublic/object2.jpg인 두 개의 객체가 있는 경우, 콘솔에서는 public 폴더 아래에 객체가 나타납니다. 그러한 접두사를 사용하여 객체 키를 구성하는 경우, 사용자가 특정 접두사가 있는 키 이름 목록을 가져오도록 허용하는 조건으로 s3:ListBucket 권한을 부여할 수 있습니다.

정책 예제는 예제 2: 사용자가 특정 접두사에 따라 버킷의 객체 목록을 가져오도록 허용 단원을 참조하십시오.

s3:delimiter

접두사 및 접미사를 사용하는 객체 키 이름을 구성하는 경우, 사용자에게 GET Bucket Object versions 요청에 delimiter 파라미터를 지정하도록 요구하는 이 조건 키를 사용할 수 있습니다. 이 경우 Amazon S3에서 반환하는 응답은 그룹으로 묶인 공통 접두사가 있는 객체 키 목록이 됩니다.

s3:max-keys

이 조건을 사용하면 사용자에게 max-keys 파라미터를 지정하도록 요구함으로써 GET Bucket Object versions 요청에 대한 응답으로 Amazon S3에서 반환하는 키의 개수를 제한할 수 있습니다. 기본적으로 API에서는 최대 1,000개의 키 이름을 반환합니다. 사용 가능한 숫자 조건의 목록은 IAM 사용 설명서숫자 조건 연산자 단원을 참조하십시오.

s3:PutBucketAcl

  • s3:x-amz-acl(미리 준비된 ACL 권한의 경우)

  • s3:x-amz-grant-permission(명시적 권한의 경우). 여기서 permission에는 다음이 올 수 있음:

    read, write,​ read-acp,​ write​-acp,​ ​full​-control

PUT Bucket acl API(PUT Bucket 참조)는 ACL 전용 헤더를 지원합니다. 이러한 조건 키를 사용하여 사용자가 이러한 헤더를 요청에 설정하도록 요구할 수 있습니다.

예제 1: 사용자에게 특정 리전에서만 버킷을 생성하도록 허용

AWS 계정 관리자가 해당 계정 사용자(Dave)에게 남아메리카(상파울루) 리전에서만 버킷을 생성하는 권한을 부여하려 한다고 가정합니다. 계정 관리자는 다음과 같은 조건으로 s3:CreateBucket 권한을 부여하는 다음 사용자 정책을 연결할 수 있습니다. Condition 블록의 키-값 페어는 s3:LocationConstraint 조건 키와 sa-east-1 리전을 해당 값으로 지정합니다.

참고

이 예제에서 버킷 소유자는 해당 사용자 중 하나에게 권한을 부여하려 하므로 버킷 정책 또는 사용자 정책 중 하나를 사용할 수 있습니다. 이 예제는 사용자 정책을 나타냅니다.

Amazon S3 리전의 목록은 Amazon Web Services 일반 참조에서 Regions and Endpoints 단원을 참조하십시오.

Copy
{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action":[ "s3:CreateBucket" ], "Resource":[ "arn:aws:s3:::*" ], "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }

이 정책은 sa-east-1을 제외한 다른 리전에서 버킷을 생성하지 못하도록 사용자를 제한합니다. 그러나 다른 정책에서 이 사용자에게 다른 리전에서 버킷을 생성할 수 있는 권한을 부여할 수 있습니다. 예를 들어, 사용자가 그룹에 속한 경우 그룹 내 전체 사용자에게 다른 리전에서 버킷을 생성할 수 있는 권한을 허용하는 정책이 이 그룹에 연결되어 있을 수 있습니다. 사용자가 다른 리전에서 버킷을 생성할 수 있는 권한을 갖지 못하게 하려면 이 정책에 명시적 거부 문을 추가할 수 있습니다.

Copy
{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action":[ "s3:CreateBucket" ], "Resource":[ "arn:aws:s3:::*" ], "Condition": { "StringLike": { "s3:LocationConstraint": "sa-east-1" } } }, { "Sid":"statement2", "Effect":"Deny", "Action":[ "s3:CreateBucket" ], "Resource":[ "arn:aws:s3:::*" ], "Condition": { "StringNotLike": { "s3:LocationConstraint": "sa-east-1" } } } ] }

Deny 문은 StringNotLike 조건을 사용합니다. 즉, 버킷 생성 요청은 위치 제한이 "sa-east-1"이 아닌 경우 거부됩니다. 명시적 거부는 사용자가 다른 어떤 권한을 갖고 있더라도 사용자가 다른 리전에서 버킷을 생성하는 것을 허용하지 않습니다.

다음 create-bucket AWS CLI 명령을 사용하는 정책을 테스트할 수 있습니다. 이 예제에서는 bucketconfig.txt 파일을 사용하여 위치 제한을 지정합니다. Windows 파일 경로를 확인하여 버킷 이름과 경로를 적절히 업데이트해야 합니다. --profile 파라미터를 사용하여 사용자 자격 증명을 제공해야 합니다. AWS CLI의 설정 및 사용에 대한 자세한 내용은 예제 안내를 위한 도구 설정 단원을 참조하십시오.

Copy
aws s3api create-bucket --bucket examplebucket --profile AccountADave --create-bucket-configuration file://c:/Users/someUser/bucketconfig.txt

bucketconfig.txt 파일은 다음과 같은 구성을 지정합니다.

Copy
{"LocationConstraint": "sa-east-1"}

예제 2: 사용자가 특정 접두사에 따라 버킷의 객체 목록을 가져오도록 허용

버킷 소유자는 사용자가 버킷의 특정 폴더에 있는 콘텐츠 목록만 가져오도록 제한할 수 있습니다. 이는 버킷의 객체가 키 이름 접두사로 정리되어 있는 경우 유용하며, 그러한 경우 Amazon S3 콘솔에서는 접두사를 사용하여 폴더 계층 구조를 표시합니다(콘솔에서 폴더 개념을 지원하는 경우에 한함. Amazon S3 API에서는 버킷과 객체만 지원).

이 예제에서, 버킷 소유자와 사용자가 속한 상위 계정은 동일합니다. 따라서 버킷 소유자는 버킷 정책 또는 사용자 정책 중 하나를 사용할 수 있습니다. 먼저 사용자 정책을 살펴보겠습니다.

다음 사용자 정책은 사용자가 요청에서 prefix의 값을 projects로 지정하도록 요구하는 조건으로 s3:ListBucket 권한을 부여합니다(GET Bucket (List Objects) 참조).

Copy
{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::examplebucket" ], "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::examplebucket" ], "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }

이 조건은 사용자가 projects 접두사가 있는 객체 키만 수신하도록 제한합니다. 추가된 명시적 거부는 사용자가 보유할 수 있는 다른 모든 권한에도 불구하고 다른 접두사가 있는 키의 목록을 가져오려는 사용자 요청을 거부합니다. 예를 들어 사용자가 앞서 다룬 사용자 정책으로 업데이트하거나 버킷 정책을 통해 아무런 제한 없이 객체 키 목록을 가져올 권한을 갖게 될 수 있습니다. 그러나 명시적 거부가 항상 우선하므로 project 접두사가 아닌 키의 목록을 가져오려는 사용자 요청은 거부됩니다.

앞서 다룬 정책은 사용자 정책입니다. 사용자를 식별하는 Principal 요소를 정책에 추가하는 경우, 다음과 같이 버킷 정책을 갖게 됩니다.

Copy
{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Principal": { "AWS": "arn:aws:iam::BucketOwner-accountID:user/user-name" }, "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::examplebucket" ], "Condition" : { "StringEquals" : { "s3:prefix": "examplefolder" } } }, { "Sid":"statement2", "Effect":"Deny", "Principal": { "AWS": "arn:aws:iam::BucketOwner-AccountID:user/user-name" }, "Action":[ "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::examplebucket" ], "Condition" : { "StringNotEquals" : { "s3:prefix": "examplefolder" } } } ] }

다음 list-object AWS CLI 명령을 사용하는 정책을 테스트할 수 있습니다. 이 명령에서 --profile 파라미터를 사용하여 사용자 자격 증명을 제공합니다. AWS CLI의 설정 및 사용에 대한 자세한 내용은 예제 안내를 위한 도구 설정 단원을 참조하십시오.

Copy
aws s3api list-objects --bucket examplebucket --prefix examplefolder --profile AccountADave

버킷에서 버전 관리를 사용하는 경우 버킷의 객체 목록을 가져오려면 s3:ListBucket 권한 대신 s3:ListBucketVersions 권한을 앞서 다룬 정책에 부여해야 합니다. 또한 이 권한은 s3:prefix 조건 키를 지원합니다.