본문 바로가기
프로젝트/Recipository

[Dev] 23.04.06. S3 Bucket의 권한 (with. Public Access, Policy, ACL)

by 규글 2023. 4. 6.

 AWS S3 Bucket을 생성하고, local에 있는 Spring Boot project에서 S3 bucket으로 이미지를 업로드할 수 있도록 작업해두었다. 하지만 이미지가 업로드되는 것은 눈으로 확인했는데, client 측에는 이미지를 확인할 수 없었다. 무엇이 문제였을까?

 

 생성한 Bucket의 권한 탭을 가면 볼 수 있는 화면이다. 권한 개요에는 권한이 부여된 사용자만 액세스할 수 있다고 적혀있고, 그 아래에는 퍼블릭 액세스 차단(버킷 설정) 항목이 있다. 편집을 누르면 다음과 같이 Bucket을 생성할 때 잠깐 보고 지나쳤던 내용이 등장한다.

 

 퍼블릭 액세스와 관련하여 다음의 네 가지 선택 사항이 있고, 각각은 서로 독립적이다. Bucket을 생성할 때는 모든 퍼블릭 액세스 차단에 체크한 그대로 만들어졌지만, 그러면 바깥에서 업로드한 이미지에 접근하는 것이 불가능하다.

 

 퍼블릭 액세스 차단 항목에서 내리면서 버킷 정책 항목을 지나면 ACL (Access Control List : 액세스 제어 목록) 항목이 등장한다. 이미지에서 볼 수 있는 것처럼, 액세스를 허용받은 '피 부여자'에 대하여 객체나 버킷에 대한 요청자의 권한 범위를 간단하게 설정할 수 있다. 이 항목은 퍼블릭 액세스 차단의 모든 항목을 체크한 경우라면 편집을 하더라도 변경되지 않는다.

 

 필자의 경우는 버킷을 생성하는 시점에 객체 소유권 항목에서 권장하는대로 ACL을 비활성화 하여 이미지의 편집 버튼이 활성화되지 않았으나, 실제로 바로 위에 보이는 객체 소유권을 편집려고 한다면 왼쪽 이미지를 확인할 수 있다. 해당 편집 페이지에서도 ACL을 활성화하려고 했을 때 각 객체의 액세스 따로 제어하거나, 업로드 당사자가 객체를 소유하도록 하려는 경우가 아니라면 비활성화를 권장하고 있다.

 ACL을 활성화하여 ACL 편집을 누르면 오른쪽 이미지와 같이 간단히 나열, 쓰기, 읽기, 등에 대한 권한을 항목에 따라 부여할 수 있게 되어 있다.

 이와 관련하여 알아보기 위해 이미지에 보이는 자세히 알아보기를 누르면 다음과 같은 정보들을 얻을 수 있다.

 

 ACL로 Bucket과 객체에 대한 액세스를 관리하는데, 그 액세스에 대한 AWS 계정이나 그룹의 유형을 정의할 수 있다고 말하고 있다. 하지만 최신 사용 사례의 대부분은 더 이상 ACL을 사용할 필요가 없으며, 그렇기 때문에 사용하지 않는 것을 권장하는 것이었다고 생각할 수 있다. 이를 사용하지 않아도 되는 이유는 다음의 버킷 정책 항목 때문이지 않을까 싶은데, ACL은 액세스 권한을 부여하는 방식이 간단하여 상당히 제한적이다.

 

 위 버킷 정책은 전에 작성했던 게시글에서 잠시 등장한 적이 있다.[각주:1] 편집 버튼을 누르고, 이어서 정책 편집기를 눌러보자.

 

 버킷 정책 편집 > 정책 생성기 를 눌러서 허용하고자 하는 Action의 목록이 굉장히 많은 것을 볼 수 있는데, 이처럼 ACL에서보다 자세하게 Access를 허용할 수 있기 때문에 ACL을 권장하지 않는 것으로 보인다.

 필자는 Bucket을 생성할 때는 타 블로그에 작성된 대로 하고 넘어갔었지만, 그때와는 살짝 다른 방식으로 정책을 수정했다.

 

{
    "Version": "2012-10-17",
    "Id": "Policy1680196099998",
    "Statement": [
        {
            "Sid": "Stmt1680458276037",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::blahblah"
        },
        {
            "Sid": "Stmt1680195456255",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::blahblah"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::blahblah"
        }
    ]
}

 왼쪽 이미지는 Resource에 대하여 객체를 가져오는, 객체를 조회하는 Action을 모든 사용자 Principal에 대하여 Allow 해주겠다는 정책이다. 해당 정책을 설정하지 않는다면, 정책 설정을 무시하지 않는 퍼블릭 액세스 설정을 하더라도 프로젝트의 client에서 S3에 저장된 이미지의 url을 html img tag src 속성에 작성한다고 하더라도 이미지를 확인할 수 없게 된다.

 이어서 오른쪽 이미지는 Resource에 대하여 객체를 업로드하고 삭제하는 Action을 특정 IAM Principal에 대하여 Allow 해주겠다는 정책이다. 해당 정책은 프로젝트에서 S3 Bucket으로의 업로드를 위한 것으로, 정책이 존재하지 않는다면 IAM 계정의 access key를 활용해서 Bucket에 업로드할 수 없다.

 여기에서 Resource는 Bucket 자체가 될 수도 있고, 폴더가 될 수도 있고, 파일이 될 수도 있다. 그리고 Principal은 액세스를 허용할 대상으로, AWS 계정이 될 수도 있고 IAM 계정이 될 수도 있다.

 

 그럼 ACL와 정책에 대하여 잠시 살펴보았으니 다시 퍼블릭 액세스 차단 설정으로 돌아가보자.

 

  • 새 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
    S3은 새로 추가된 버킷 또는 객체에 적용되는 퍼블릭 액세스 권한을 차단하며, 기존 버킷 및 객체에 대한 새 퍼블릭 액세스 ACL 생성을 금지합니다. 이 설정은 ACL을 사용하여 S3 리소스에 대한 퍼블릭 액세스를 허용하는 기존 권한을 변경하지 않습니다.

    : 위 항목은 기존에 ACL을 활용하여 퍼블릭 액세스를 허용한 사항에 대해서는 그 설정을 유지한다. 다만 새롭게 퍼블릭 액세스를 추가하려고 하는 것은 불가능하다. 그래서 이 설정을 체크한 상태로 ACL의 퍼블릭 액세스를 허용하려고 할 때에는 그 설정을 변경할 수 없어서 다음과 같이 ACL 설정을 편집할 권한이 없다는 오류 메시지를 확인하게 된다. 따라서 ACL을 통해 퍼블릭 액세스를 새롭게 허용하고 싶다면 이 항목에 대한 체크를 해제해야 한다.

 

  • 임의의 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
    S3은 버킷 및 객체에 대한 퍼블릭 액세스를 부여하는 모든 ACL을 무시합니다.

    : 위 항목은 이미 부여된 ACL의 퍼블릭 액세스조차도 무시한다. 따라서 다음 이미지와 같이 읽기에 대한 액세스가 허용된 상태라고 하더라도, 이 항목에 체크를 하게 되면 액세스가 허용되지 않는 상태가 되어 읽기가 허용되었다는 마크를 볼 수 없게 된다.

 

  • 새 퍼블릭 '버킷 또는 액세스 지점' 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
    S3은 버킷 및 객체에 대한 퍼블릭 액세스를 부여하는 새 버킷 및 액세스 지점 정책을 차단합니다. 이 설정은 S3 리소스에 대한 퍼블릭 액세스를 허용하는 기존 정책을 변경하지 않습니다.

    : 위 항목은 필자가 없던 따옴표를 추가하였다. 앞선 두 항목이 ACL과 관련된 것이었다면, 남은 항목은 버킷 정책 및 액세스 지점 정책에 관련된 것이다. 새롭게 추가되는 버킷 정책이나 액세스 지점 정책으로 인한 퍼블릭 액세스를 차단한다. 그래서 정책을 통해 퍼블릭 액세스를 추가하려고 한다면 ACL에서와 유사하게 다음과 같은 오류 메시지를 확인하게 된다.

 

  • 임의의 퍼블릭 '버킷 또는 액세스 지점' 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 및 교차 계정 액세스 차단
    S3은 버킷 및 객체에 대한 퍼블릭 액세스를 부여하는 정책을 사용하는 버킷 또는 액세스 지점에 대한 퍼블릭 및 교차 계정 액세스를 무시합니다.

    : 위 항목은 ACL에서와 마찬가지로 이미 정책을 통해 부여된 퍼블릭 액세스조차도 무시한다. 작성된 정책이 지워지는 것은 아니지만, 작성한 정책이 제 기능을 발휘하지는 못하게 된다.

 

 필자는 이 항목들 중에 새 퍼블릭 '버킷 또는 액세스 지점' 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단항목을 체크 해제한 뒤에, 버킷 정책을 추가하고 다시 체크를 해주었다. 그리고 이어서 임의의 퍼블릭 '버킷 또는 액세스 지점' 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 및 교차 계정 액세스 차단항목을 체크 해제하였다.

 

 이렇게 설정하면 오른쪽처럼 액세스에 퍼블릭이라고 표기되는데, 모든 사람에 대한 액세스 정책을 지우면 왼쪽처럼 퍼블릭이 아니라는 표기를 볼 수 있다.

 

 

 이 게시글에 작성한 내용을 정리해보겠다.

  • ACL을 비활성화하는 것으로 해당 S3 Bucket에 대한 소유권을 다른 계정에 열지 않고 필자가 온전하게 가진다.
  • 정책을 입력하는 것으로 IAM 계정을 통한 업로드를 허용하고, 모든 사용자에 대한 파일 조회를 허용한다.
  • 퍼블릭 액세스 차단 옵션을 조정하여 새로운 퍼블릭 액세스 정책이 입력되는 것을 막고, 작성된 정책이 무시되지 않도록 한다.

 

 이렇게 프로젝트에서 local에 이미지를 저장하고 저장 위치에 대한 경로를 불러들여서 이미지를 client에 로딩하는 방식에서, S3 Bucket에 업로드하고 액세스 설정을 변경하여 이미지를 client에 로딩하는 방식으로 변경했다.

 

 앞으로 AWS에 대한 게시글을 몇 가지 더 써보고 코딩 테스트와 이력서 작성, 제출, 면접 준비에 집중하려고 한다. 우선 properties에 IAM access key 정보를 넣어서 업로드하는 방식을 바꾸는 것이다. 현재 방식을 알아보는 중이다. 그리고 github와 연동하여 EC2 인스턴스에 직접 build하는 방식에 대한 작업을 할 것이다.

 

 

Reference

댓글