PrincipalAccount 를 활용한 S3 Bucket Policy

JIPA
5 min readFeb 25, 2022

--

이 포스팅에서는 S3 Bucket Policy 에 대한 내용을 한 번 살펴보려고 합니다.

이 포스팅에서 다루려고 하는 Bucket Policy 의 내용을 좀 더 쉽게 이해할 수 있도록 간단하게 기술적인 조건을 기술하고 이에 맞추어 설명을 해보도록 하겠습니다.

운영 환경

아래 그림과 같이 AWS 환경에 2개의 계정이 사용되고 있습니다.

이 중 계정 A(ID=012345678911) 는 “sharedbucket” 을 소유한 계정이고 계정 B(ID=012345678912)는 “sharedbucket” 을 접속하려고 하는 외부 계정입니다.

요구 사항

이러한 환경에서 계정 A 의 관리자는 자신이 관리하는 sharedbucket 에 대해 아래의 2가지 조건을 만족하는 Bucket Policy 를 작성하려고 합니다.

  1. 계정 A 의 모든 IAM User 와 IAM Role 에 대해 접근을 허용하려고 합니다.
  2. 계정 B 의 모든 IAM User 와 IAM Role 에 대해서도 해당 IAM User 나 IAM Role 이 sharedbucket 에 대한 접근 권한을 가지고 있다면 접근을 허용하려고 합니다.

이 요구 사항을 만족하기 위해 S3 Bucket Policy 를 작성한다면 어떻게 Bucket Policy 를 작성해야 할까요?

참고로 계정 A 의 모든 IAM User 나 IAM Role 은 sharedbucket 에 대해 별도로 명시적인 Allow 권한을 갖지 않은 상태를 가정합니다.

먼저 계정 A 의 관리자는 아래와 같은 Bucket Policy 를 작성해 보았습니다.

이 Bucket Policy 는 2가지 요구 사항을 모두 만족할 수 있을까요?

Resource 는 sharedbucket 의 모든 객체를 포함하고 있고, Action 에는 업로드와 다운로드가 지정되어 있습니다. 그리고 Principal 부분에는 계정 A 와 계정 B 가 지정이 되어 있습니다.

아마도 관리자가 이렇게 Bucket Policy 를 지정한 이유는 Principal 에 지정한 계정 정보가 각 계정의 모든 IAM User 와 IAM Role 을 포함하기 때문일 것이라고 생각하는데요.

결과를 말씀드리면 이 Bucket Policy 는 2가지 요구 사항 중 두번째 조건은 만족할 수 있지만 첫번째 조건은 만족할 수 없습니다.

즉, “AWS”: “arn:aws:iam::123456789022:root” 를 지정함으로써 계정 B 에서 권한을 가진 모든 자격증명에 대해 허용하는 것이 가능하지만 “AWS”: “arn:aws:iam::123456789011:root” 을 지정하는 것으로는 계정 A 의 모든 IAM User 와 IAM Role 이 sharedbucket 으로 접속하는 것을 허용할 수는 없습니다.

그 이유는 “AWS”: “arn:aws:iam::123456789011:root” 과 같이 계정을 지정하는 Principal 의 경우 지정하는 계정이 다른 계정을 지칭하는 경우는 해당 계정에 포함된 모든 자격증명(IAM User 와 IAM Role)을 의미하지만 동일 계정에 대해서는(계정 A 의 Bucket Policy 가 계정 A 를 Principal 로 갖는 경우) 모든 IAM User 와 IAM Role 을 지정하는 것이 아니라 Root 자격증명 그 자체를 의미하기 때문입니다.

따라서, 이 Bucket Policy 는 사용할 수 없기 때문에 수정해야합니다.

이번에는 관리자가 위 과정에서 사용할 수 없음을 확인한 “AWS”: “arn:aws:iam::123456789011:root” 대신에 아래와 같이 다른 방식으로 Bucket Policy 를 작성하였습니다.

“arn:aws:iam::123456789011:user/*”
“arn:aws:iam::123456789011:role/*”

이 Bucket Policy 는 2가지 요구 사항을 모두 만족할 수 있을까요?

이 Policy 역시 2가지 요구 사항 중 첫번째 요구 사항을 만족할 수 없습니다.

관리자는 모든 IAM User 와 모든 IAM Role 을 포함하겠다는 의미로 “*” 를 Bucket Policy 에 지정하였지만 IAM Policy 의 Principal 에서는 이처럼 User 나 Role 을 “*” 로 지정할 수 없습니다. 따라서, 이와 같은 Bucket Policy 는 S3 Bucket 에 적용조차 할 수 없습니다.

자세한 사항은 아래의 문서를 참고하세요.

그럼 과연 어떻게 Bucket Policy 를 작성하여야 할까요?

AWS IAM 에서 제공하는 “aws:PrincipalAccount” 와 같은 Global Condition 을 사용하여 아래와 같은 Bucket Policy 를 작성하면 위에서 요구하는 2가지 조건을 모두 만족할 수 있습니다.

이 Bucket Policy 를 보시면 Condition 에 “aws:PrincipalAccount” 을 사용하여 계정 ID “123456789011" 과 “123456789022" 를 지정하였습니다.

이렇게 “aws:PrincipalAccount” 을 통해 계정 ID 를 지정하게 되면 Bucket 에 접속하는 IAM 자격증명의 Account ID 를 기반으로 하여 접근을 허용하거나 차단하는 것이 가능합니다.

따라서, 결과적으로 이 Bucket Policy 는 계정 A 와 계정 B 에 대해 허용하는 정책을 포함하고 있기 때문에 위에서 언급된 2가지 요구사항을 모두 만족하는 Bucket Policy 라고 볼 수 있습니다.

IAM 에는 “aws:PrincipalAccount” 이외에도 “aws:SourceAccount” 라는 Account 를 지정하는 Condition 이 존재하는데요. 이 두가지 Condition 의 차이점은 다른 포스팅에서 다루도록 하겠습니다.

감사합니다.

--

--

JIPA
JIPA

Written by JIPA

Always Day 1. Security is job zero.

No responses yet