cloudfront OAI 설정으로 원본 오리진인 S3에 직접 액세스 금지시키기
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가 생성되었습니다. 여기에 제공된 ID와 Canonical 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/