cloudfront custom origin(s3)사용시 origin 서버 직접 엑세스 방지하기

앞에 글에서 언급했던 CF와 s3를 custom origin으로 연동하였을 경우 s3버킷에 직접 엑세스하는걸 방지하는 구성을 만들어 봅시다.
지난번에 만든 CF배포 설정을 변경할 수도 있겠지만 처음 만들때를 가정하여 새로운 CF배포를 생성하여 구성해 보겠습니다.

앞에 포스팅했던 cloudfront custom origin(S3) 사용 글과 다른점은 CF배포를 생성할때 Origin Domain Name에 넣는 s3주소와, CF의 Origin Access Identity 라는 걸 생성하는 점, s3버킷 정책 정도가 되겠습니다.

그럼 만들어 보겠습니다.

s3 설정 — A계정에 cforigintestbucket 이름의 버킷을 생성하고 버킷정책을 설정한다.
버킷정책은 다음과 같습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::cforigintestbucket/*"
        }
    ]
}

일단 위와 같이 설정을 하게 되면 버킷에 퍼블릭 엑세스 권한이 생겨 웹브라우져로 업로드한 파일에 접근이 가능하게 된다. 이 부분을 확인한 후…

CF설정 — B계정에 다음과 같이 CF배포를 생성합니다.

위에서 간략하게 설명 했듯이

  • Origin Domain Name 필드에 들어가는 주소는 기존에 정적 웹 사이트 호스팅의 endpoint 주소가 아니라 “bucketname.s3.amazonaws.com” 형태의 주소를 입력해 준다. 현재 셋팅에서 bucketname이 cforigintestbucket이기 때문에 “cforigintestbucket.s3.amazonaws.com”을 입력하면 된다.

  • 다음 Restrict Bucket AccessYes체크
    Origin Access Identity에 “Origin Access Identity”를 새로 만들어야 하니 “Create a New Identity”를 선택

  • 나머지 cache 설정이나 배포에 대한 설정은 편의상 디폴트로 진행한다.(추가 구성이 필요한 경우는 적절하게 셋팅해도 무방합니다.)

  • CF생성을 완료 하고 CF콘솔화면의 좌측 하단에 Origin Access Identity 메뉴에 진입하면 생성한 Identity가 보이고 이를 체크한 후 “Edit”버튼을 눌러 Amazon S3 Canonical User ID 부분의 값을 메모해 놓습니다.

그림에 붉은색 사각형 부분입니다.

s3설정 — s3콘솔로 돌아와 생성했던 버킷의 버킷정책을 다시한번 열고 다음과 같이 수정합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": {
                "CanonicalUser": "e4ca493b874185ebbd9b6b8d47f556263c666b3bb7babf6d1d89448d417ce0afeb60d2bb8bf88ea0dd2b025aeedd54aa"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::cforigintestbucket/*"
        }
    ]
}

위와 같이 수정하고 저장합니다.

테스트 — 버킷에 이미지 파일 하나를 업로드 하고 업로드한 파일의 s3주소와 cf주소를 각각 호출해 테스트 합니다.

s3 주소를 호출 하게 되면 다음과 같이 당연하게 Access Denied 가 뜰 것이고

CF주소로 접근하면 업로드한 이미지가 보일것입니다.

이상…

댓글 남기기