예제 3: 버킷 소유자가 소유하지 않은 객체에 권한 부여하기
예제 3: 버킷 소유자가 소유하지 않은 객체에 권한 부여하기 (Example 3: Bucket owner granting permissions to objects it does not own)
버킷 소유자가 객체에 접근할 권한을 부여하고 싶은데, 버킷 안의 모든 객체를 버킷 소유자가 소유하지 않는 상황을 다뤄볼게요. 이 예제에서 버킷 소유자는 자기 계정 안의 사용자에게 권한을 부여하려고 해요.
출처: 문서
본문
중요 — 개별 사용자에게 권한을 부여하는 것보다 IAM 역할에 권한을 부여하는 것이 더 좋은 방법이에요. 방법은 계정 간 권한 이해와 IAM 역할 사용을 참고하세요.
버킷 소유자는 다른 AWS 계정이 객체를 업로드하도록 허용할 수 있어요. 기본적으로 버킷 소유자는 다른 AWS 계정이 버킷에 쓴 객체를 소유하지 않아요. 객체는 버킷에 쓴 계정이 소유해요. 버킷 소유자가 버킷 안의 객체를 소유하지 않는다면, 객체 소유자가 먼저 객체 접근 제어 목록(ACL)을 사용해 버킷 소유자에게 권한을 부여해야 해요. 그런 다음 버킷 소유자가 소유하지 않은 객체에 권한을 부여할 수 있어요. 자세한 내용은 Amazon S3 버킷 및 객체 소유권을 참고하세요.
버킷 소유자가 버킷에 S3 Object Ownership의 버킷 소유자 적용(Bucket owner enforced) 설정을 적용하면, 다른 AWS 계정이 쓴 객체를 포함해 버킷 안의 모든 객체를 버킷 소유자가 소유해요. 이 방식은 객체가 버킷 소유자 소유가 아니라는 문제를 해결해요. 이제 자기 계정의 사용자나 다른 AWS 계정에 권한을 위임할 수 있어요.
참고 — S3 Object Ownership은 Amazon S3의 버킷 수준 설정으로, 버킷에 업로드된 객체의 소유권을 제어하고 ACL을 비활성화하거나 활성화하는 데 써요. 기본적으로 Object Ownership은 버킷 소유자 적용 설정이고, 모든 ACL은 비활성화돼 있어요. ACL이 비활성화되면 버킷 소유자가 버킷 안의 모든 객체를 소유하고 접근 관리 정책만으로 접근을 독점 관리해요. Amazon S3의 대부분의 현대 사용 사례는 더 이상 ACL이 필요 없어요. 객체마다 개별적으로 접근을 제어해야 하는 경우를 제외하고는 ACL을 비활성화해 두는 걸 권장해요. ACL이 비활성화되면 버킷에 누가 객체를 업로드했든 관계없이 정책으로 버킷의 모든 객체에 대한 접근을 제어할 수 있어요. 자세한 내용은 버킷의 객체 소유권 제어와 ACL 비활성화를 참고하세요.
이 예제에서는 버킷 소유자가 Object Ownership의 버킷 소유자 적용 설정을 적용하지 않았다고 가정해요. 버킷 소유자는 자기 계정의 사용자에게 권한을 위임해요. 이 연습의 단계를 요약하면 다음과 같아요.
- Account A 관리자 사용자가 두 개의 문이 있는 버킷 정책을 연결해요. 하나는 Account B에 객체 업로드 권한을 주고, 다른 하나는 자기 계정의 사용자에게 버킷 안 객체에 접근할 권한을 줘요.
- Account B 관리자 사용자가 Account A가 소유한 버킷에 객체를 업로드해요.
- Account B 관리자가 객체 ACL을 업데이트해 버킷 소유자에게 객체에 대한 전체 제어(full-control) 권한을 주는 grant를 추가해요.
- Account A의 사용자가 누가 소유했는지와 관계없이 버킷 안의 객체에 접근해 확인해요.
이 예제를 진행하려면 계정이 두 개 필요해요. 다음 표는 이 계정들과 그 안의 관리자 사용자를 어떻게 부를지 보여줘요. 이 연습에서는 권장 IAM 지침에 따라 계정 루트 사용자 자격 증명을 사용하지 않아요(리소스 생성과 권한 부여를 위한 관리자 사용자에 대해 참고). 대신 각 계정에 관리자를 만들고 그 자격 증명으로 리소스를 만들고 권한을 부여해요.
| AWS 계정 ID | 계정 표기 | 계정의 관리자 |
|---|---|---|
| 1111-1111-1111 | Account A | AccountAadmin |
| 2222-2222-2222 | Account B | AccountBadmin |
사용자 생성과 권한 부여의 모든 작업은 AWS Management Console에서 해요. 권한 확인에는 명령줄 도구인 AWS Command Line Interface(AWS CLI)와 AWS Tools for Windows PowerShell을 사용하니까, 코드를 작성할 필요는 없어요.
0단계: 연습 준비하기
두 개의 AWS 계정이 있고, 앞 절의 표처럼 각 계정에 관리자가 하나씩 있는지 확인하세요.
- 필요하면 AWS 계정에 가입해요.
- Account A 자격 증명으로 IAM 콘솔에 로그인해서 관리자 사용자를 만들어요.
- 사용자
AccountAadmin을 만들고 사용자 보안 자격 증명을 기록해 두세요. 사용자 추가에 대한 자세한 내용은 IAM User Guide의 AWS 계정에 IAM 사용자 만들기를 참고하세요. - 전체 액세스를 주는 사용자 정책을 연결해
AccountAadmin에게 관리자 권한을 부여해요. 자세한 방법은 IAM User Guide의 IAM 정책 관리를 참고하세요. - IAM 콘솔 대시보드에서 IAM 사용자 로그인 URL(Sign-In URL) 을 기록해 두세요. 이 계정의 사용자는 AWS Management Console에 로그인할 때 이 URL을 사용해야 해요. 자세한 내용은 IAM User Guide의 사용자가 계정에 로그인하는 방법을 참고하세요.
- 사용자
- Account B 자격 증명으로 앞의 단계를 반복해 관리자 사용자
AccountBadmin을 만들어요. - AWS CLI 또는 Tools for Windows PowerShell을 설정해요. 관리자 자격 증명을 다음과 같이 저장하세요.
- AWS CLI를 사용한다면 config 파일에
AccountAadmin과AccountBadmin두 개의 프로필을 만들어요. - Tools for Windows PowerShell을 사용한다면 세션에
AccountAadmin과AccountBadmin으로 자격 증명을 저장해요. - 자세한 방법은 연습을 위한 도구 설정을 참고하세요.
- AWS CLI를 사용한다면 config 파일에
1단계: Account A 작업 수행하기
Account A에 대해 다음 단계를 수행해요.
1.1단계: 콘솔에 로그인하기
Account A의 IAM 사용자 로그인 URL을 사용해 AWS Management Console에 AccountAadmin 사용자로 로그인해요. 이 사용자가 버킷을 만들고 정책을 연결할 거예요.
1.2단계: 버킷과 사용자를 만들고 권한을 부여하는 버킷 정책 추가하기
- Amazon S3 콘솔에서 버킷을 만들어요. 이 연습에서는 버킷이 미국 동부(버지니아 북부) AWS 리전에 만들어졌고 이름이
amzn-s3-demo-bucket1이라고 가정해요. 자세한 방법은 일반용 버킷 만들기를 참고하세요. - IAM 콘솔에서 사용자
Dave를 만들어요. 단계별 안내는 IAM User Guide의 IAM 사용자 만들기(콘솔)를 참고하세요. 사용자 Dave의 자격 증명을 기록해 두세요. - Amazon S3 콘솔에서
amzn-s3-demo-bucket1버킷에 다음 버킷 정책을 연결하세요. 자세한 방법은 Amazon S3 콘솔로 버킷 정책 추가를 참고하세요. 계정 ID를 찾는 방법은 AWS 계정 ID 찾기를 참고하세요.
이 정책은 Account B에 s3:PutObject와 s3:ListBucket 권한을 부여해요. 정책은 사용자 Dave에게도 s3:GetObject 권한을 부여해요.
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": [
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket1/*",
"arn:aws:s3:::amzn-s3-demo-bucket1"
]
},
{
"Sid": "Statement3",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/Dave"
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket1/*"
]
}
]
}
2단계: Account B 작업 수행하기
이제 Account B가 Account A의 버킷에서 작업을 수행할 권한을 얻었으니, Account B 관리자는 다음을 수행해요.
- Account A의 버킷에 객체를 업로드해요.
- 객체 ACL에 grant를 추가해 버킷 소유자인 Account A에게 전체 제어를 허용해요.
AWS CLI 사용하기
put-objectAWS CLI 명령으로 객체를 업로드해요. 명령의--body파라미터는 업로드할 소스 파일을 가리켜요. 예를 들어 Windows 머신의 C 드라이브에 파일이 있다면c:\HappyFace.jpg라고 지정해요.--key파라미터는 객체의 키 이름을 제공해요.
aws s3api put-object --bucket amzn-s3-demo-bucket1 --key HappyFace.jpg --body HappyFace.jpg --profile AccountBadmin
- 객체 ACL에 grant를 추가해 버킷 소유자에게 객체의 전체 제어를 허용해요. 정규 사용자 ID(canonical user ID)를 찾는 방법은 AWS Account Management Reference Guide의 AWS 계정의 정규 사용자 ID 찾기를 참고하세요.
aws s3api put-object-acl --bucket amzn-s3-demo-bucket1 --key HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBadmin
Tools for Windows PowerShell 사용하기
Write-S3Object명령으로 객체를 업로드해요.
Write-S3Object -BucketName amzn-s3-demo-bucket1 -key HappyFace.jpg -file HappyFace.jpg -StoredCredentials AccountBadmin
- 객체 ACL에 grant를 추가해 버킷 소유자에게 객체의 전체 제어를 허용해요.
Set-S3ACL -BucketName amzn-s3-demo-bucket1 -Key HappyFace.jpg -CannedACLName "bucket-owner-full-control" -StoredCreden
3단계: 권한 테스트하기
이제 Account A의 사용자 Dave가 Account B가 소유한 객체에 접근할 수 있는지 확인해요.
AWS CLI 사용하기
- 사용자 Dave의 자격 증명을 AWS CLI config 파일에 추가해 새 프로필
UserDaveAccountA를 만들어요. 자세한 내용은 연습을 위한 도구 설정을 참고하세요.
[profile UserDaveAccountA]
aws_access_key_id = access-key
aws_secret_access_key = secret-access-key
region = us-east-1
get-objectCLI 명령을 실행해HappyFace.jpg를 다운로드하고 로컬에 저장해요.--profile파라미터를 추가해 사용자 Dave의 자격 증명을 제공해요.
aws s3api get-object --bucket amzn-s3-demo-bucket1 --key HappyFace.jpg Outputfile.jpg --profile UserDaveAccountA
Tools for Windows PowerShell 사용하기
- 사용자 Dave의 AWS 자격 증명을
UserDaveAccountA로 영구 저장소에 저장해요.
Set-AWSCredentials -AccessKey UserDave-AccessKey -SecretKey UserDave-SecretAccessKey -storeas UserDaveAccountA
Read-S3Object명령을 실행해HappyFace.jpg객체를 다운로드하고 로컬에 저장해요.-StoredCredentials파라미터를 추가해 사용자 Dave의 자격 증명을 제공해요.
Read-S3Object -BucketName amzn-s3-demo-bucket1 -Key HappyFace.jpg -file HappyFace.jpg -StoredCredentials UserDaveAccountA
4단계: 정리하기
테스트가 끝나면 다음 단계로 정리할 수 있어요.
- Account A 자격 증명으로 AWS Management Console에 로그인해서 다음을 수행하세요.
- Amazon S3 콘솔에서
amzn-s3-demo-bucket1에 연결된 버킷 정책을 제거해요. 버킷 속성(Properties) 의 권한(Permissions) 섹션에서 정책을 삭제해요. - 이 연습을 위해 만든 버킷이라면 Amazon S3 콘솔에서 객체를 삭제한 다음 버킷을 삭제해요.
- IAM 콘솔에서
AccountAadmin사용자를 제거해요. 단계별 안내는 IAM User Guide의 IAM 사용자 삭제를 참고하세요.
- Amazon S3 콘솔에서
- Account B 자격 증명으로 AWS Management Console에 로그인해서 IAM 콘솔에서 사용자
AccountBadmin을 삭제해요.