본문으로 바로가기

s3 주소로는 접속을 못하게 막고, cloudfront 혹은 할당한 주소만 접근을 하게 했으면 좋겠다.

우선 퍼블릭으로 설정된 s3 보안 설정을 막고, origin access identity(OAI)를 설정해서 오리진 접속을 차단하도록하자.

 

OAI는 또 무엇인가? CloudFront가 제한된 S3 객체에 액세스 할 수 있도록 허용하는 CloudFront 관련 설정이다.

이는 인증된 사용자만 S3의 프라이빗 콘텐츠에 액세스 할 수 있도록 서명된 URL 또는 서명된 쿠키를 사용할 때 유용하다.

일반적으로 배포를 만들거나 오리진 내부를 수정할 때 OAI를 만듭니다.

 

 

1. S3 퍼블릭 우선 열기

정책 수정도 해야하고 일단 퍼블릭 액세스 모두 열어둡시다. 마지막 단계에서 확인 후 다시 닫을 겁니다.

 

OAI 생성 후 CloudFront Distribution 정책 수정하기

 

세팅하려는 CloudFront 좌측의 Origin access identity를 눌러 OAI를 설정해봅시다.

 

 

 

 

좀 허무하게 OAI가 생성되었습니다. 여기에 제공된 IDCanonical User ID 둘 다 필요합니다.

 

 

이 녀석을 기존의 CloudFront 설정은 Origin and Origin Group에서 설정해줄 수 있고, 새로 생성한다면 생성하면서 설정해줄 수 있습니다.

기본적으로 Origin Domain Name을 주면, Origin ID가 자동으로 주어지는데, 이 값을 지우고 생성한 OAI의 ID 를 넣어주어야 합니다.

 

 

S3 버킷 정책 수정하기

이제 s3 에 자체 정책을 설정을 해야 합니다.

Public 만 사용했다면 일단 기본 정책 먼저 만들도록 합시다.

 

ARN은 대상 버킷/[keyname] 꼴로 입력하여 어떤 버킷의 어떤 객체에 해당 정책을 적용할 것인지를 명시해주고

어차피 S3 웹에 들어오는 동작만 할 것이므로 action은 일단 "Action": "s3:GetObject",만 허용해주도록하겠다. 

 

아래와 같은 결과물을 받을 수 있다

{
    "Version": "2012-10-17",
    "Id": "Policy1618219234446",
    "Statement": [
        {
            "Sid": "Stmt1618219230742",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[bucket]/*"
        }
    ]
}

 

자, 여기서 principal을 수정해봅시다.

"Principal": {"CanonicalUser":"Amazon S3 Canonical User ID"} 로 수정합니다.

 

{
    "Version": "2012-10-17",
    "Id": "Policy1618226172547",
    "Statement": [
        {
            "Sid": "Stmt1618226168042",
            "Effect": "Allow",
            "Principal": {"CanonicalUser":"89d515b19beec07bc5220b2aa27717b5c2ffe8a7e7ed8e07eaafa74543ac277d838b939037ec75c57134c5b347df1d0f"},
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::serverless-kanban/*"
        }
    ]
}

 

등로하면 아래와 같은 정책으로 변경됩니다.

{
    "Version": "2012-10-17",
    "Id": "Policy1618219234446",
    "Statement": [
        {
            "Sid": "Stmt1618219230742",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E1WQAH3X6CKE22"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[bucket]/*"
        }
    ]
}

 

 

이제 S3 public 설정을 모두 닫습니다.

 

아래와 같이 S3의 퍼블릭 액세스를 모두 차단했다.

 

s3 정적 웹 호스팅 주소로 들어가면 이제 403 코드를 받을 것이다. 

 

반면 cloudfront로 접근하면 정상적인 접근이 된다!

 

 

 

reference)

 

cli로만 진행하고 싶다면 아래 글을 참고해보자.

dev.classmethod.jp/articles/aws-cli-cloudfront-oai-kr/

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체