본문 바로가기
AWS/S3

[AWS] S3 권한 관리, 접근 제한

by Ate1es 2022. 6. 26.

AWS에서 제공하는 스토리지인 S3에는 다양한 기능이 있다. 그 중 보안과 가장 큰 연관성이 있는 객체에 대한 권한 관리와 S3 버킷에 대한 접근 제한 기능을 이용해보겠다.

 

권한 관리는 파일을 전체 퍼블릭(인터넷)에 공개하거나, 특정 사용자에게만 공개할 때 사용한다.

그리고 정책의 설정에 따라 다양한 접근 제어가 가능하다. 

S3에 올라간 파일을 객체라고 하는데 이 각각의 객체에 대해 접근 권한을 설정할 수 있다.

 

권한 설정을 진행하기 전, S3버킷에 몇가지 설정을 풀어주어야 한다.(생성될 때 기본으로 넣어지는 설정)

 

1. 퍼블릭 액세스 차단 해제하기

해당 설정은 S3 버킷을 처음 만들 때 설정될 수 있다. 해당 버킷에 대한 모든 객체에 대한 퍼블릭 접근을 차단하겠다는 설저이다. 해제해주자.

 

퍼블릭 액세스 차단 해제

2. ACL 사용안함 해제하기

S3 버킷을 생성할 때 생성한 사용자만 접근하게 하는 설정이 있다. 해당 설정이 걸려있으면 객체에 대한 권한 관리 실습이 어렵기 때문에 ACL 사용으로 바꿔준다. - 다른 계정(사용자)에게 권한 부여가능.

ACL 설정 - 다른 계정에 권한 부여 가능

 

S3 객체 권한 관리

S3 객체 콘솔에서,

자신의 S3 버킷 내에 권한을 바꾸고 싶은 객체를 선택한 후 [작업] - [ACL을 사용하여 퍼블릭으로 설정]을 클릭한다.

(해당 버튼이 비활성화 되어있으면, 위의 두 설정이 제대로 안되어있는 것이다.)

객체에 대한 권한 설정

퍼블릭으로 변경은 바로 이루어진다. 해당 설정을 클릭만 하면, 바로 객체가 퍼블릭 액세스가 가능하게 바뀐다.

퍼블릭 엑세스로 변경

원래 퍼블릭 엑세스로 바꾸기전에 해당 객체에 대한 URL을 접속하면, 권한에 걸려 리소스에 접근이 불가하다.

접근 불가

하지만 우리는 방금 퍼블릭 엑세스가 가능한 상태로 우리의 객체의 권한을 수정했기 때문에, URL을 통해 리소스를 요청하면, 아래와 같이 해당 사진이 보여진다.

퍼블릭으로 객체 접근 가능

반대로 해당 객체에 대해 퍼블릭에서 접근하는 것을 막고 싶을 때에는, 

 

S3 콘솔의 해당 객체를 클릭해 들어가서 ACL 목록에서 모든사람(퍼블릭 액세스)의 읽기 권한을 삭제하고 저장해주면 된다.

 

ACL에서 모든사용자(퍼블릭액세스)의 권한 확인

아래 페이지에서 권한을 수정(위의 예에서는 퍼블릭 액세스의 권한 삭제) 후 확인을 눌러주면 된다.

S3 버킷 권한 관리

 

위 에서는 S3 버킷 안의 객체 하나하나에 권한을 다루고, 수정하는 방법을 알아보았다. 

이제 버킷 전체에 대한 권한을 관리하는 방법에 대해 다뤄보자.

 

먼저 S3 콘솔에서 원하는 버킷 클릭 후 , [권한] 탭으로 이동. 버킷 정책 편집을 클릭한다.

버킷 정책 편집 클릭

 

버킷 정책은 JSON 데이터로 관리되며, 해당 데이터 각각의 뜻을 알고 있어야 편하다. (해석도 빠름)

우측 상단의 정책 생성기를 통해서도 생성할 수 있지만, 하나하나 뜻을 알아보기위해 수동으로 작성할 것이다.

 

먼저 오른쪽의 작업 추가에서 S3 서비스를 선택한다. (S3 버킷에 대한 권한 정책이기 때문)

S3 서비스 선택

다음은 "S3 서비스에서 무슨 권한을 설정할건데?" 라는 것에 대한 부분을 추가해야 한다. 

 

나의 경우 내가 업로드한 객체에 대한 접근을 원하기 때문에, GetObject 를 선택해주었다.

체크하면 해당 JSON 데이터의 "Action" 키의 Value 부분에 S3:GetObject 가 자동으로 입력됨을 확인할 수 있다.

Action 부분 추가

다음은 S3에서 "객체를 Get 할려는 정책이구나 ~ 근데 어떤 버킷인데?" 라는 부분에 대한 정의를 내려주어야 한다.

오른쪽의 2. 리소스 추가를 클릭하면, 리소스 ARN 입력 칸이 나온다. 리소스 유형은 Object 이며, ARN은 AWS에서 리소스를 판별하기 위해 만들어진 구문 형식이다.

 

{~~} 로 둘러 쌓인 부분만 나한테 해당하는 걸로 바꿔주면 된다.

나의 경우 내 버킷 아래 모든 Object에 대해 정책 적용을 할 것이므로, 각각 버킷 이름* 로 바꿔주었다.

리소스 설정

이제 내가 만든 정책은 아 "이 버킷에서 객체를 Get 하는 것을 허용하는 정책이구나. 근데 누구한테 허용할건데?"

만 남은 상태이다.

 

해당 설정은 Principal 의 Value 부분을 바꿔주면 된다.

나의 경우 모든 사용자(퍼블릭)으로 공개할 것이기 때문에, {"AWS":["*"]} 구문을 추가해줬다.

특정 AWS 계정들에게 권한을 주고 싶다면,(ex IAM) 콤마로 구별지어서 설정하면 된다. 이제 해당 정책을 적용 시키고, 

 

아래처럼 퍼블릭에서 접근이 잘 되는 것을 확인했다.