조건 키를 사용한 버킷 정책 예시 - Amazon Simple Storage Service

조건 키를 사용한 버킷 정책 예시

권한 부여 시 액세스 정책 언어를 사용하여 조건을 지정할 수 있습니다. 선택적 Condition 요소 또는 Condition 블록을 사용하여 정책이 적용되는 시기에 대한 조건을 지정할 수 있습니다.

객체 및 버킷 작업에 Amazon S3 조건 키를 사용하는 정책은 다음 예제를 참조하십시오. 조건 키에 대한 자세한 내용은 Amazon S3의 정책 조건 키 섹션을 참조하십시오. 정책에 지정할 수 있는 Amazon S3 작업, 조건 키, 리소스의 전체 목록은 서비스 승인 참조에서 Amazon S3에 사용되는 작업, 리소스 및 조건 키를 참조하세요.

S3 리소스 유형별 S3 API 작업 권한에 대한 자세한 내용은 Amazon S3 API 작업에 필요한 권한 섹션을 참조하세요.

예제: 객체 작업을 위한 Amazon S3 조건 키

다음 예제는 객체 작업에 Amazon S3별 조건 키를 사용하는 방법을 보여줍니다. 정책에 지정할 수 있는 Amazon S3 작업, 조건 키, 리소스의 전체 목록은 서비스 승인 참조에서 Amazon S3에 사용되는 작업, 리소스 및 조건 키를 참조하세요.

S3 리소스 유형별 S3 API 작업 권한에 대한 자세한 내용은 Amazon S3 API 작업에 필요한 권한 섹션을 참조하세요.

몇 가지 예제 정책은 PUT Object 작업에서 조건 키를 사용할 수 있는 방법을 보여 줍니다. PUT Object 작업은 ACL(액세스 제어 목록) 기반 권한을 부여하는 데 사용할 수 있는 ACL 전용 헤더를 허용합니다. 이러한 조건 키를 통해 사용자가 객체를 업로드할 때 특정 액세스 권한이 필요하도록 조건을 설정할 수 있습니다. 또한 PutObjectAcl 작업을 사용하여 ACL 기반 권한을 부여할 수 있습니다. 자세한 내용은 Amazon S3 Amazon Simple Storage Service API ReferencePutObjectAcl을 참조하십시오. ACL에 대한 자세한 내용은 ACL(액세스 제어 목록) 개요 단원을 참조하십시오.

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

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

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

AWS CLI를 사용하여 이 권한을 테스트할 때는 다음 예제와 같이 --server-side-encryption 파라미터를 사용하여 필요한 암호화를 추가해야 합니다. 이 예 명령을 사용하려면 user input placeholders를 실제 정보로 대체하세요.

aws s3api put-object --bucket amzn-s3-demo-bucket --key HappyFace.jpg --body c:\HappyFace.jpg --server-side-encryption "AES256" --profile AccountAadmin

예제 2: 복사 소스에 대한 제한이 있는 객체를 복사하기 위한 s3:PutObject 권한 부여

PUT 객체 요청에서 소스 객체를 지정하면 요청은 복사 작업에 해당합니다(CopyObject 참조). 따라서 버킷 소유자는 원본에 대한 제한이 있는 객체 복사 권한을 사용자에게 부여할 수 있습니다. 예를 들면 다음과 같습니다.

  • 지정한 소스 버킷에서만 객체 복사를 허용합니다(예: amzn-s3-demo-source-bucket).

  • 지정한 소스 버킷에서 객체를 복사할 수 있으며, public/처럼 키 이름 접두사가 특정 접두사로 시작하는 객체(예: amzn-s3-demo-source-bucket/public/*)만 복사할 수 있습니다.

  • 소스 버킷에서 특정 객체만 복사할 수 있습니다(예: amzn-s3-demo-source-bucket/example.jpg).

다음 버킷 정책은 사용자(Dave)에게 s3:PutObject 권한을 부여합니다. 이 정책은 요청에 s3:x-amz-copy-source 헤더를 포함하고 헤더 값으로 /amzn-s3-demo-source-bucket/public/* 키 이름 접두사를 지정하는 조건을 충족하는 객체만 복사하도록 허용합니다. 이 정책 예를 사용하려면 user input placeholders를 실제 정보로 바꾸세요.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "cross-account permission to user in your own account", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*" }, { "Sid": "Deny your user permission to upload object if copy source is not /bucket/prefix", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*", "Condition": { "StringNotLike": { "s3:x-amz-copy-source": "amzn-s3-demo-source-bucket/public/*" } } } ] }
AWS CLI에서 정책 테스트

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

aws s3api copy-object --bucket amzn-s3-demo-source-bucket --key HappyFace.jpg --copy-source amzn-s3-demo-source-bucket/public/PublicHappyFace1.jpg --profile AccountADave
특정 객체만 복사할 수 있는 권한 부여

앞서 다룬 정책에서는 StringNotLike 조건을 사용합니다. 특정 객체만 복사할 수 있는 권한을 부여하려면 StringNotLike에서 StringNotEquals로 조건을 변경한 뒤 다음 예제와 같이 정확한 객체 키를 지정합니다. 이 예 명령을 사용하려면 user input placeholders를 실제 정보로 대체하세요.

"Condition": { "StringNotEquals": { "s3:x-amz-copy-source": "amzn-s3-demo-source-bucket/public/PublicHappyFace1.jpg" } }

예시 3: 특정 버전의 객체에 대한 액세스 권한 부여

Account A에서 버전 관리가 활성화된 버킷을 소유하고 있다고 가정합니다. 버킷에는 몇 가지 버전의 HappyFace.jpg 객체가 있습니다. 이제 Account A 관리자는 사용자 Dave에게 특정 버전의 객체만 가져올 수 있는 권한을 부여하려고 합니다. 계정 관리자는 다음 예제와 같이 조건부로 사용자 Dave에게 s3:GetObjectVersion 권한을 부여하여 이 작업을 수행할 수 있습니다. Condition 블록의 키-값 페어는 s3:VersionId 조건 키를 지정합니다. 이 경우 지정된 버전 관리를 사용하는 버킷에서 객체를 가져오려면 Dave에서 정확한 객체 버전 ID를 알고 있어야 합니다. 이 정책 예를 사용하려면 user input placeholders를 실제 정보로 바꾸세요.

자세한 내용은 Amazon Simple Storage Service API 참조에서 GetObject를 참조하십시오.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/HappyFace.jpg" }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Dave" }, "Action": "s3:GetObjectVersion", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/HappyFace.jpg", "Condition": { "StringNotEquals": { "s3:VersionId": "AaaHbAQitwiL_h47_44lRO2DDfLlBO5e" } } } ] }
AWS CLI에서 정책 테스트

--version-id 파라미터와 함께 AWS CLI get-object 명령을 통해 가져올 특정 객체 버전을 식별하여 이 정책의 권한을 테스트할 수 있습니다. 이 명령은 지정된 버전의 객체를 가져와 OutputFile.jpg 파일에 저장합니다.

aws s3api get-object --bucket amzn-s3-demo-bucket --key HappyFace.jpg OutputFile.jpg --version-id AaaHbAQitwiL_h47_44lRO2DDfLlBO5e --profile AccountADave

예시 4: 객체 태그 기반 권한 부여

Amazon S3 작업에 객체 태그 지정 조건 키를 사용하는 방법에 대한 예제는 태그 지정 및 액세스 제어 정책 섹션을 참조하세요.

예시 5: 버킷 소유자의 AWS 계정 ID로 액세스 제한

aws:ResourceAccount 또는 s3:ResourceAccount 조건 키를 사용하여 특정 AWS 계정 ID가 소유한 Amazon S3 버킷에 대한 사용자, 역할 또는 애플리케이션 액세스를 제한하는 IAM 또는 가상 프라이빗 클라우드(VPC) 엔드포인트 정책을 작성할 수 있습니다. 이 조건 키를 사용하면 소유하지 않은 버킷에 VPC 내의 클라이언트가 액세스하는 것을 제한할 수 있습니다.

그러나 일부 AWS 서비스는 AWS 관리되는 버킷에 대한 액세스에 의존합니다. 따라서 IAM 정책에서 aws:ResourceAccount 또는 s3:ResourceAccount 키를 사용하면 이러한 리소스에 대한 액세스에도 영향을 미칠 수 있습니다. 자세한 정보는 다음 자료를 참조하십시오.

aws:ResourceAccounts3:ResourceAccount 조건 키에 대한 자세한 내용과 사용 방법을 보여주는 예제는 AWS 스토리지 블로그에서 특정 AWS 계정에서 소유한 Amazon S3 버킷에 대한 액세스 제한을 참조하세요.

예시 6: 최소 TLS 버전 요구

s3:TlsVersion 조건 키를 사용하면 IAM, 가상 프라이빗 클라우드 엔드포인트(VPCE) 또는 버킷 정책을 작성하여 클라이언트가 사용한 TLS 버전에 따라 Amazon S3 버킷에 대한 사용자 또는 애플리케이션의 액세스를 제한할 수 있습니다. 이 조건 키를 사용하여 최소 TLS 버전을 요구하는 정책을 작성할 수 있습니다.

다음 예제 버킷 정책은 TLS 버전이 1.2보다 낮은 클라이언트(예: 1.1 또는 1.0)의 PutObject 요청을 거부합니다. 이 정책 예를 사용하려면 user input placeholders를 실제 정보로 바꾸세요.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket1", "arn:aws:s3:::amzn-s3-demo-bucket1/*" ], "Condition": { "NumericLessThan": { "s3:TlsVersion": 1.2 } } } ] }

다음 버킷 정책 예제는 TLS 버전이 1.1보다 높은 클라이언트(예: 1.2, 1.3 이상)의 PutObject 요청을 허용합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket1", "arn:aws:s3:::amzn-s3-demo-bucket1/*" ], "Condition": { "NumericGreaterThan": { "s3:TlsVersion": 1.1 } } } ] }

예제 7: Deny 문에서 특정 보안 주체 제외

다음 버킷 정책은 123456789012 계정 번호가 있는 보안 주체를 제외하고 amzn-s3-demo-bucket에 대한 s3:GetObject 액세스를 거부합니다. 이 정책 예를 사용하려면 user input placeholders를 실제 정보로 바꾸세요.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyAccessFromPrincipalNotInSpecificAccount", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Effect": "Deny", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/*" ], "Condition": { "StringNotEquals": { "aws:PrincipalAccount": [ "123456789012" ] } } } ] }

예제: 버킷 작업을 위한 Amazon S3 조건 키

다음 정책 예제는 버킷 작업에 Amazon S3별 조건 키를 사용하는 방법을 보여줍니다.

예제 1: IP 주소를 조건으로 s3:GetObject 권한 부여

요청이 특정 범위의 IP 주소(예:192.0.2.*)에서 비롯된 경우 인증된 사용자가 s3:GetObject 작업을 사용하도록 권한을 부여합니다. 단, 제외하려는 IP 주소(예: 192.0.2.188)는 예외입니다. Condition 블록에서 IpAddressNotIpAddress가 조건에 해당하며, 각 조건에는 평가를 위한 키-값 페어가 제공됩니다. 이 예제에서의 키-값 페어는 모두 aws:SourceIp AWS 차원의 키를 사용합니다. 이 정책 예를 사용하려면 user input placeholders를 실제 정보로 바꾸세요.

참고

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

{ "Version": "2012-10-17", "Id": "S3PolicyId1", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": "*", "Action":"s3:GetObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition" : { "IpAddress" : { "aws:SourceIp": "192.0.2.0/24" }, "NotIpAddress" : { "aws:SourceIp": "192.0.2.188/32" } } } ] }

Amazon S3 정책에서 다른 AWS 전역 조건 키를 사용할 수도 있습니다. 예를 들어 VPC 엔드포인트에 대한 버킷 정책에서 aws:SourceVpceaws:SourceVpc 조건 키를 지정할 수 있습니다. 구체적인 예는 버킷 정책을 사용하여 VPC 엔드포인트에서 액세스 제어 섹션을 참조하십시오.

참고

일부 AWS 전역 조건 키의 경우, 특정 리소스 유형만 지원됩니다. 따라서 Amazon S3가 사용하려는 전역 조건 키 및 리소스 유형을 지원하는지 아니면 Amazon S3 관련 조건 키를 대신 사용해야 하는지 확인하세요. Amazon S3에 지원되는 리소스 유형과 조건 키의 전체 목록은 서비스 승인 참조에서 Amazon S3에 사용되는 작업, 리소스 및 조건 키를 참조하세요.

S3 리소스 유형별 S3 API 작업 권한에 대한 자세한 내용은 Amazon S3 API 작업에 필요한 권한 섹션을 참조하세요.

예제 2: 특정 접두사가 있는 버킷의 객체 목록 가져오기

s3:prefix 조건 키를 사용하여 ListObjectsV2 API 작업의 응답을 특정 접두사가 있는 키 이름으로 제한할 수 있습니다. 버킷 소유자인 경우 이 조건 키로 사용자가 버킷에 있는 특정 접두사의 내용을 나열하도록 제한할 수 있습니다. s3:prefix 조건 키는 버킷의 객체가 키 이름 접두사로 정리되어 있는 경우 유용합니다.

Amazon S3 콘솔은 키 이름 접두사를 사용하여 폴더 개념을 표시합니다. 콘솔만 폴더 개념을 지원하고 Amazon S3 API는 버킷과 객체만 지원합니다. 예를 들어, 키 이름이 public/object1.jpgpublic/object2.jpg인 2개의 객체가 있는 경우 콘솔에서는 public 폴더 아래에 객체가 표시됩니다. Amazon S3 API에서 이러한 객체는 폴더의 객체가 아니라 접두사가 있는 객체입니다. 접두사 및 구분 기호를 사용하여 액세스 권한을 필터링하는 방법에 대한 자세한 내용은 사용자 정책을 사용하여 버킷에 대한 액세스 제어 단원을 참조하십시오.

다음 시나리오에서 버킷 소유자와 사용자가 속한 상위 계정은 동일합니다. 따라서 버킷 소유자는 버킷 정책 또는 사용자 정책을 사용하여 액세스 권한을 부여할 수 있습니다. ListObjectsV2 API 작업에 사용할 수 있는 다른 조건 키에 대한 자세한 내용은 ListObjectsV2 섹션을 참조하세요.

참고

버킷에서 버전 관리가 활성화된 경우 버킷의 객체를 나열하려면 다음 정책에서 s3:ListBucket 권한 대신 s3:ListBucketVersions 권한을 부여해야 합니다. 또한, s3:ListBucketVersions 권한은 s3:prefix 조건 키를 지원합니다.

사용자 정책

다음 사용자 정책은 사용자에게 요청에서 값이 projects인 접두사를 지정하도록 요구하는 Condition 문을 통해 s3:ListBucket 권한을 부여합니다(ListObjectsV2 참조). 이 정책 예를 사용하려면 user input placeholders를 실제 정보로 바꾸세요.

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

Condition 문은 사용자가 projects 접두사가 있는 객체 키만 나열하도록 제한합니다. 추가된 명시적 Deny 문은 사용자가 다른 권한을 가지고 있든 없든 다른 접두사가 있는 키를 나열하는 것을 거부합니다. 예를 들어, 이전 사용자 정책 업데이트 또는 버킷 정책을 통해 사용자가 제한 없이 객체 키를 나열할 수 있는 권한을 얻을 수 있습니다. 명시적 Deny 문은 항상 Allow 문보다 우선하므로, 사용자가 projects 접두사가 있는 키 이외의 키를 나열하려고 하면 요청이 거부됩니다.

버킷 정책

사용자를 식별하는 Principal 요소를 위의 사용자 정책에 추가하는 경우, 다음 예제에서처럼 버킷 정책을 갖게 됩니다. 이 정책 예를 사용하려면 user input placeholders를 실제 정보로 바꾸세요.

{ "Version":"2012-10-17", "Statement":[ { "Sid":"statement1", "Effect":"Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/bucket-owner" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Condition" : { "StringEquals" : { "s3:prefix": "projects" } } }, { "Sid":"statement2", "Effect":"Deny", "Principal": { "AWS": "arn:aws:iam::123456789012:user/bucket-owner" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Condition" : { "StringNotEquals" : { "s3:prefix": "projects" } } } ] }
AWS CLI에서 정책 테스트

다음 list-object AWS CLI 명령을 사용하는 정책을 테스트할 수 있습니다. 이 명령에서 --profile 파라미터를 사용하여 사용자 자격 증명을 제공합니다. AWS CLI 사용 및 설정에 대한 자세한 내용은 Amazon S3 API 참조의 AWS CLI를 사용하여 Amazon S3에서 개발을 참조하세요.

aws s3api list-objects --bucket amzn-s3-demo-bucket --prefix projects --profile AccountA

예제 3: 최대 키 수 설정

s3:max-keys 조건 키를 사용하여 요청자가 ListObjectsV2 또는 ListObjectVersions 요청에서 반환할 수 있는 최대 키 수를 설정할 수 있습니다. 기본적으로 이러한 API 작업은 최대 1,000개의 키를 반환합니다. s3:max-keys와 함께 사용할 수 있는 숫자 조건 연산자 목록은 IAM 사용 설명서숫자 조건 연산자를 참조하십시오.