사용자 및 역할 정책 예시 - Amazon Simple Storage Service

사용자 및 역할 정책 예시

이 섹션에서는 Amazon S3에 대한 액세스를 제어하는 몇 가지 예시 AWS Identity and Access Management(IAM) 사용자 및 역할 정책을 보여줍니다. 예제 버킷 정책버킷 정책 사용 섹션을 참조하십시오. IAM 정책 언어에 대한 정보는 버킷 정책 및 사용자 정책 섹션을 참조하십시오.

다음 정책 예제는 프로그래밍 방식으로 사용하는 경우 작동합니다. 그러나 Amazon S3 콘솔을 통해 정책을 사용하기 위해서는 콘솔에 필요한 추가 권한을 부여해야 합니다. Amazon S3 콘솔에서 이와 같은 정책을 사용하는 방법에 대한 자세한 내용은 사용자 정책을 사용하여 버킷에 대한 액세스 제어 단원을 참조하십시오.

버킷 중 하나에 대한 IAM 사용자 액세스 허용

이 예제에서는 AWS 계정의 IAM 사용자에게 버킷 중 하나인 DOC-EXAMPLE-BUCKET1에 대한 액세스 권한을 부여하고, 이 사용자에게 객체를 추가, 업데이트, 삭제하도록 허용하려 합니다.

이 정책에서는 s3:PutObject, s3:GetObjects3:DeleteObject 권한을 사용자에게 부여할 뿐만 아니라 s3:ListAllMyBuckets, s3:GetBucketLocations3:ListBucket 권한도 부여합니다. 이러한 권한은 콘솔에 필요한 추가 권한입니다. 또한 콘솔에서 객체를 복사, 자르기 및 붙여넣기를 할 수 있으려면 s3:PutObjectAcls3:GetObjectAcl 작업이 필요합니다. 콘솔을 사용하여 사용자에게 권한을 부여하고 테스트하는 방법에 대한 예는 사용자 정책을 사용하여 버킷에 대한 액세스 제어을 참조하십시오.

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action": "s3:ListAllMyBuckets", "Resource":"*" }, { "Effect":"Allow", "Action":["s3:ListBucket","s3:GetBucketLocation"], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1" }, { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" } ] }

버킷의 폴더에 대한 각 IAM 사용자의 액세스 허용

이 예제에서는 2명의 IAM 사용자인 Mary와 Carlos에게 DOC-EXAMPLE-BUCKET1 버킷에 대한 액세스 권한을 부여하여 이들이 객체를 추가, 업데이트, 삭제할 수 있게 하려 합니다. 그러나 각 사용자의 액세스 권한을 버킷의 단일 접두사(폴더)로 제한하려 합니다. 이 경우, 사용자 이름과 일치하는 이름으로 폴더를 만들 수 있습니다.

DOC-EXAMPLE-BUCKET1 Mary/ Carlos/

각 사용자에게 각자의 폴더에 대해서만 액세스 권한을 부여하려면 각 사용자에 대한 정책을 작성하고 이를 개별적으로 연결하면 됩니다. 예를 들어, 다음 정책을 사용자 중 Mary에게 연결하여 DOC-EXAMPLE-BUCKET1/Mary 폴더에 대한 특정 Amazon S3 권한을 허용할 수 있습니다.

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/Mary/*" } ] }

그런 다음 사용자 Carlos에게 유사한 정책을 연결하여 Resource 값의 Carlos 폴더를 지정할 수 있습니다.

정책을 개별 사용자에게 연결하는 대신 정책 변수를 사용하는 단일 정책을 작성하여 이 정책을 그룹에 연결할 수도 있습니다. 우선 그룹을 하나 만들어 Mary와 Carlos을 모두 이 그룹에 추가합니다. 다음 정책 예제에서는 DOC-EXAMPLE-BUCKET1/${aws:username} 폴더의 Amazon S3 권한 집합을 허용합니다. 정책이 평가될 때 정책 변수 ${aws:username}은 요청자의 사용자 이름으로 대체됩니다. 예를 들어, Mary가 요청을 보내 객체를 배치하는 경우 이 작업은 Mary가 객체를 DOC-EXAMPLE-BUCKET1/Mary 폴더에 업로드하는 경우에만 허용됩니다.

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/${aws:username}/*" } ] }
참고

정책 변수를 사용하는 경우 정책에 명시적으로 버전 2012-10-17을 지정해야 합니다. IAM 정책 언어의 기본 버전인 2008-10-17은 정책 변수를 지원하지 않습니다.

앞서 다룬 정책을 Amazon S3 콘솔에서 테스트하려는 경우 콘솔에서는 다음 정책에서와 같이 추가 권한을 요구합니다. 콘솔에서 이와 같은 정책을 사용하는 방법에 대한 자세한 내용은 사용자 정책을 사용하여 버킷에 대한 액세스 제어 단원을 참조하십시오.

{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": "arn:aws:s3:::*" }, { "Sid": "AllowRootLevelListingOfTheBucket", "Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1", "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } }, { "Sid": "AllowListBucketOfASpecificUserPrefix", "Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1", "Condition":{ "StringLike":{"s3:prefix":["${aws:username}/*"] } } }, { "Sid": "AllowUserSpecificActionsOnlyInTheSpecificUserPrefix", "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/${aws:username}/*" } ] }
참고

2012-10-17 버전의 정책에서, 정책 변수는 $로 시작합니다. 이러한 구문상의 변경은 객체 키(객체 이름)에 $가 포함된 경우 잠재적으로 충돌을 야기할 수 있습니다.

이 충돌을 방지하려면 ${$} 기호를 사용하여 $ 문자를 지정하십시오. 예를 들어, 객체 키 my$file을 정책에 포함하려면 my${$}file로 지정하면 됩니다.

IAM 사용자 이름은 익숙하고 읽기 쉬운 식별자여야 하되, 고유한 전역 이름일 필요는 없습니다. 예를 들어, Carlos라는 사용자가 조직을 떠난 후 또 다른 Carlos가 조직에 합류하는 경우 새로 온 Carlos는 이전 Carlos의 정보에 액세스할 수도 있습니다.

사용자 이름을 이용하는 대신 IAM 사용자 ID를 기반으로 한 폴더를 만들 수 있습니다. 각 IAM 사용자 ID는 고유합니다. 이 경우, ${aws:userid} 정책 변수를 사용하여 앞서 다룬 정책을 수정해야 합니다. 사용자 ID에 대한 자세한 내용은 IAM 사용 설명서IAM 식별자 단원을 참조하십시오.

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/home/${aws:userid}/*" } ] }

버킷의 폴더에 대한 비 IAM 사용자(모바일 앱 사용자)의 액세스 허용

S3 버킷에 사용자 데이터를 저장하는 모바일 게임 앱을 개발하려 한다고 가정합니다. 각 앱 사용자에 대해 버킷에 폴더를 만들려고 합니다. 또한 각 사용자의 액세스 권한을 각자의 폴더로 제한하려고 하는데, 누군가 앱을 다운로드하여 게임 플레이를 시작하기 전에는 사용자 ID가 없으므로 폴더를 만들 수 없습니다.

이 경우 사용자에게 Login with Amazon, Facebook 또는 Google과 같은 퍼블릭 ID 공급자를 사용하여 앱에 로그인하도록 요구할 수 있습니다. 사용자가 이들 공급자 중 하나를 통해 앱에 로그인한 후에는 런타임 시 사용자별 폴더 생성에 사용할 수 있는 사용자 ID를 갖게 됩니다.

그런 뒤 AWS Security Token Service의 웹 자격 증명 연동을 사용하여 ID 공급자에게 받은 정보를 앱과 통합하고 각 사용자에 대한 임시 보안 자격 증명을 얻을 수 있습니다. 그런 뒤에는 앱에서 버킷에 액세스할 수 있도록 허용하고 사용자별 폴더를 만들고 데이터를 업로드하는 등의 작업을 수행하는 IAM 정책을 만들 수 있습니다. 웹 아이덴티티 페더레이션에 대한 자세한 내용은 IAM 사용 설명서웹 아이덴티티 페더레이션 정보를 참조하십시오.

Amazon S3에 공유 폴더를 보유할 수 있도록 그룹을 허용

다음 정책을 그룹에 연결하면 그룹 내 모두에게 Amazon S3의 DOC-EXAMPLE-BUCKET1/share/marketing 폴더에 대한 액세스 권한이 부여됩니다. 그룹 멤버는 정책에 나와 있는 특정 Amazon S3 권한과 지정된 폴더의 객체에 대해서만 액세스할 수 있도록 허용됩니다.

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/share/marketing/*" } ] }

모든 사용자가 버킷의 일부로 객체를 읽을 수 있도록 허용

이 예제에서는 AWS 계정에서 소유한 전체 IAM 사용자를 포함하는 AllUsers라는 그룹을 만듭니다. 그런 뒤 그룹에 GetObjectGetObjectVersion에 대해서만 DOC-EXAMPLE-BUCKET1/readonly 폴더의 객체에 대한 액세스 권한을 부여하는 정책을 연결합니다.

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject", "s3:GetObjectVersion" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/readonly/*" } ] }

파트너가 버킷의 특정 부분에 파일을 둘 수 있도록 허용

이 예제에서는 파트너사를 나타내는 AnyCompany라는 그룹을 만듭니다. 파트너사에서 액세스 권한을 필요로 하는 사람이나 애플리케이션을 위해 IAM 사용자를 만든 다음 그 사용자를 그룹에 넣습니다.

그런 뒤 그룹에 버킷의 다음 폴더에 대한 PutObject 액세스 권한을 부여하는 정책을 연결합니다.

DOC-EXAMPLE-BUCKET1/uploads/anycompany

AnyCompany 그룹이 버킷을 사용하여 다른 작업을 수행하지 못하도록 하려면 AWS 계정의 Amazon S3 리소스에 대한 PutObject를 제외하고 모든 Amazon S3 작업에 대한 권한을 명시적으로 거부하는 문을 추가하면 됩니다.

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"s3:PutObject", "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/uploads/anycompany/*" }, { "Effect":"Deny", "Action":"s3:*", "NotResource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/uploads/anycompany/*" } ] }

특정 AWS 계정의 Amazon S3 버킷에 대한 액세스 제한

Amazon S3 보안 주체가 신뢰할 수 있는 AWS 계정 내에 있는 리소스에만 액세스하고 있는지 확인하려면 액세스를 제한하면 됩니다. 예를 들어, 이 자격 증명 기반 IAM 정책에서는 액세스 중인 Amazon S3 리소스가 222222222222 계정에 있지 않으면 Deny 효과를 사용하여 Amazon S3 작업에 대한 액세스를 차단합니다. AWS 계정의 IAM 보안 주체가 계정 외부의 Amazon S3 객체에 액세스하지 못하게 하려면 다음 IAM 정책을 연결하십시오.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyS3AccessOutsideMyBoundary", "Effect": "Deny", "Action": [ "s3:*" ], "Resource": "*", "Condition": { "StringNotEquals": { "aws:ResourceAccount": [ "222222222222" ] } } } ] }
참고

이 정책은 액세스 권한을 부여하지 않으므로 기존 IAM 액세스 제어를 대체하지 않습니다. 대신 이 정책은 다른 IAM 정책을 통해 부여된 권한에 관계없이 다른 IAM 권한에 대한 추가 가드레일 역할을 합니다.

정책의 222222222222 계정 ID를 본인의 AWS 계정로 대체해야 합니다. 이 제한을 유지하면서 여러 계정에 정책을 적용하려면 계정 ID를 aws:PrincipalAccount 조건 키로 바꾸면 됩니다. 이 조건에서는 보안 주체와 리소스가 동일한 계정에 있어야 합니다.

조직 단위(OU) 내의 Amazon S3 버킷에 대한 액세스 제한

조직 단위(OU)를 AWS Organizations에 설정한 경우 조직의 특정 부분으로 Amazon S3 버킷 액세스를 제한할 수 있습니다. 이 예제에서는 aws:ResourceOrgPaths 키를 사용하여 조직의 OU로 Amazon S3 버킷 액세스를 제한합니다. 이 예제에서 OU IDou-acroot-exampleou입니다. 자체 정책에서 이 값을 자체 OU ID로 바꿔야 합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowS3AccessOutsideMyBoundary", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": "*", "Condition": { "ForAllValues:StringNotLike": { "aws:ResourceOrgPaths": [ "o-acorg/r-acroot/ou-acroot-exampleou/" ] } } } ] }
참고

이 정책은 어떤 액세스 권한도 부여하지 않습니다. 대신 이 정책은 다른 IAM 권한에 대한 백스톱 역할을 하므로, 보안 주체가 OU 정의 경계 외부의 Amazon S3 객체에 액세스할 수 없습니다.

액세스 중인 Amazon S3 객체가 조직의 ou-acroot-exampleou OU에 없는 한 정책은 Amazon S3 작업에 대한 액세스를 거부합니다. IAM 정책 조건은 나열된 OU 경로를 포함하는 데 다중 값 조건 키인 aws:ResourceOrgPaths를 필요로 합니다. 이 정책은 ForAllValues:StringNotLike 연산자를 사용하여 대소문자를 구분하지 않고 aws:ResourceOrgPaths의 값을 나열된 OU와 비교합니다.

조직 내의 Amazon S3 버킷에 대한 액세스 제한

조직 내의 Amazon S3 객체에 대한 액세스를 제한하려면 IAM 정책을 조직의 루트에 연결하여 조직의 모든 계정에 적용합니다. IAM 보안 주체가 이 규칙을 따르도록 요구하려면 서비스 제어 정책(SCP)을 사용하면 됩니다. SCP를 사용하기로 선택한 경우 조직 루트에 정책을 연결하기 전에 SCP를 철저히 테스트해야 합니다.

다음 예제 정책에서 액세스 중인 Amazon S3 객체가 액세스 중인 IAM 보안 주체와 동일한 조직에 있지 않으면 Amazon S3 작업에 대한 액세스가 거부됩니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyS3AccessOutsideMyBoundary", "Effect": "Deny", "Action": [ "s3:*" ], "Resource": "arn:aws:s3:::*/*", "Condition": { "StringNotEquals": { "aws:ResourceOrgID": "${aws:PrincipalOrgID}" } } } ] }
참고

이 정책은 어떤 액세스 권한도 부여하지 않습니다. 대신 이 정책은 다른 IAM 권한에 대한 백스톱 역할을 하므로, 보안 주체가 조직 외부의 모든 Amazon S3 객체에 액세스할 수 없습니다. 이 정책은 정책이 적용된 후에 생성된 Amazon S3 리소스에도 적용됩니다.

이 예제의 IAM 정책 조건에서는 서로 동일해지려면 aws:ResourceOrgIDaws:PrincipalOrgID를 필요로 합니다. 이 요구 사항에서는 요청을 수행하는 보안 주체와 액세스 중인 리소스가 동일한 조직에 있어야 합니다.