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

사용자 정책 예제

이 단원에서는 Amazon S3에 대한 사용자 액세스를 제어하는 몇 가지 IAM 사용자 정책을 보여줍니다. 액세스 정책 언어에 대한 자세한 내용은 액세스 정책 언어 개요 단원을 참조하십시오.

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

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

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

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

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

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

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

Copy
examplebucket Alice/ Bob/

각 사용자에게 자신의 폴더에 대해서만 액세스 권한을 부여하기 위해 각 사용자에 대한 정책을 작성하고 이를 개별적으로 연결할 수 있습니다. 예를 들어 다음 정책을 사용자 중 Alice에게 연결하여 examplebucket/Alice 폴더에 대한 특정 Amazon S3 권한을 허용할 수 있습니다.

Copy
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::examplebucket/Alice/*" } ] }

그런 뒤 Bob 값의 Bob 폴더를 식별하는 유사한 정책을 사용자인 Resource에게 연결합니다.

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

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

참고

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

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

Copy
{ "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:::examplebucket"], "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } }, { "Sid": "AllowListBucketOfASpecificUserPrefix", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::examplebucket"], "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:::examplebucket/${aws:username}/*" } ] }

참고

2012-10-17 버전의 정책에서, 정책 변수는 $로 시작합니다. 이러한 구문상의 변경은 객체 키에 $가 포함된 경우 잠재적으로 충돌을 야기합니다. 예를 들어 객체 키 my$file을 정책에 포함하려면 $ 문자를 ${$}로 지정하여 my${$}file과 같이 나타내야 합니다.

IAM 사용자 이름은 읽기 쉬운 표시 이름 식별자이지만 고유한 전역 이름일 필요는 없습니다. 예를 들어 Bob이라는 사용자가 조직을 떠난 후 또 다른 Bob이 조직에 합류하는 경우, 새로 온 Bob이 이전 Bob의 정보에 액세스할 수도 있습니다. 사용자 이름을 사용하는 대신 사용자 ID를 기반으로 한 폴더를 만들 수 있습니다. 각 사용자 ID는 고유합니다. 이 경우, ${aws:userid} 정책 변수를 사용하여 앞서 다룬 정책을 수정해야 합니다. 사용자 ID에 대한 자세한 내용은 IAM 사용 설명서IAM 식별자 단원을 참조하십시오.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

WidgetCo 그룹이 버킷에 대한 다른 작업을 못하게 하려는 경우로, AWS 계정의 Amazon S3 리소스에 대한 PutObject를 제외하고 모든 Amazon S3 권한에 대한 권한을 명시적으로 거부하는 문을 추가합니다. 이 단계는 AWS 계정의 다른 위치에 사용자에게 Amazon S3 리소스에 대한 폭넓은 액세스 권한을 부여하는 사용 중인 광범위한 정책이 있는 경우에만 필요합니다.

Copy
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"s3:PutObject", "Resource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*" }, { "Effect":"Deny", "NotAction":"s3:PutObject", "Resource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*" }, { "Effect":"Deny", "Action":"s3:*", "NotResource":"arn:aws:s3:::my_corporate_bucket/uploads/widgetco/*" } ] }