본문 바로가기

🧑🏻‍💻 Dev/Infra

[AWS] Application Load Balancer에 Cloud Front의 요청만 허가하기

Client에서 EC2까지 가는 아키텍처 (RDS, S3 등 제외)

 

최근 아키텍처를 설계해야 하는 일이 있어서 위와 같이 Cloud Front를 앞단에 두고, ELB에 요청을 전달해서 EC2로 가는 방향으로 설계를 했습니다.

 

예상했던 결과대로 서버 도메인을 입력하면 API 서버에 접근할 수 있었습니다. 하지만, 원하는 결과와는 조금 다르게 ELB의 DNS 서버로도 아무나 접근이 가능했습니다.

 

누구나 ELB의 DNS를 알면 접근이 가능

 

서버에 접근하는 경로는 단 하나만 있는 게 보안상으로도 좋을 거 같아서 ELB(Origin)에서는 내가 배포한 Cloud Front에서 오는 요청만 받고, 나머지 요청은 모두 403 Forbbiden으로 처리하도록 하고자 했습니다.

 

 

 

1. Cloud Front에 등록된 Origin(ELB)로 보내는 요청에 헤더 추가하기


Cloud Front 콘솔 -> 배포 -> 원본 -> 내 ELB 체크 -> 편집
헤더 추가 -> 헤더 이름, 값 입력 -> 변경 사항 저장

위에서는 헤더 이름을 "X-Custom-Access-Token"이라고 했지만, 본인이 원하는 이름으로 하면 됩니다.

기존에 사용되는 통상적인 헤더 이름은 피해 주시는 것이 좋습니다.

값도 본인이 원하는 값으로 입력합니다. 값을 정하기 어렵다면 여기를 눌러서 한번 Random한 Key 값을 만들어보세요.

모두 입력했으면 이제 변경 사항 저장을 눌러서 저장해 줍니다.

 

 

 

2. ELB(Elastic Load Balancer) 리스너 및 규칙 추가하기


EC2 -> 로드밸런서 -> 내 로드 밸런서 선택 -> HTTP:80 또는 본인이 설정한 규칙 선택 -> 규칙 편집

 

이제 Cloud Front에서 보내는 커스텀 헤더를 받아서 내 Cloud Front에서 온 요청이구나를 알 수 있도록 로드 밸런서(ELB)의 리스너 규칙을 편집해줘야 합니다. 위에 파란 부분은 최종 결과물입니다. 저는 이미 설정을 해뒀었기 때문에 저렇게 뜨니 참고만 해주시면 될 거 같습니다.

 

들어와서 아래로 내린 후 "규칙 추가"를 눌러줍니다.
규칙의 이름을 입력해줍니다. 아무 거나 입력하셔도 됩니다. Ex) "Listener Rule"
"조건 추가"를 클릭해서 조건을 추가해줍니다.
저희는 HTTP 헤더를 이용할 것이기 때문에 HTTP 헤더를 선택해줍니다.
헤더의 이름과 헤더의 값을 입력해줍니다.

 

여기서 입력할 때는 1번에서 Cloud Front 원본(Origin)에 설정했던 헤더의 이름과 값을 입력해줘야 합니다.

이제 확인을 누르고 쭉쭉쭉 넘겨서 대상 그룹(EC2 인스턴스 그룹)을 선택하고, 규칙을 저장합니다.

 

규칙을 저장을 한 후의 화면

 

규칙을 저장하면 이제 내가 만든 규칙이 뜨는 것을 확인할 수 있습니다. 이제 거의 다 왔습니다.

처음 ELB를 만들면 "기본값"으로 규칙이 하나 추가됩니다. 

보면 "다른 규칙이 적용되지 않는 경우"에는 대상 그룹으로 전달된다고 되어 있습니다.

이렇게 되면 내가 정해둔 조건 이외의 어떤 요청이 오더라도 대상 그룹으로 전달되어 처음과 달라지는 것이 없습니다.

그렇기 때문에 기본값의 작업 내용을 바꿔줘야 합니다.

기본값 규칙 체크 -> 규칙 편집 클릭
고정 응답 반환 선택 -> 응답 코드 입력 -> 응답 본문 입력

 

기존에 "대상 그룹으로 전달"로 되어 있는 선택지를 "고정 응답 반환"으로 변경합니다.

응답 코드는 어떤 걸로 입력해도 상관없습니다. 저는 Forbidden으로 사용하기 위해서 403을 입력해 줬습니다.

응답 본문은 선택 내용입니다. 저는 "Access denied"라고 뜰 수 있도록 설정해 뒀습니다.

이제 변경 내용 저장을 눌러줍니다.

 

이제 서버 도메인으로 한번 접근을 해보겠습니다. (Cloud Front을 통해서 접근하는 방법)

200 OK를 응답하면서 접근에 성공했습니다.

 

이 부분도 사실 추후에 Client가 완성되면 Cors에 등록해서 외부 접근은 막아 주는 것이 좋습니다.

 

이제 ELB의 DNS로 접근을 한번 해보겠습니다. (Elastic Load Balancer에 직접 접근하는 방법)

의도했던 대로 403 에러를 발생하며, "Access denied"라는 문구가 출력됩니다.

 

모두 의도한 대로 설정에 성공했습니다!

 

 

 

🔗 참고


https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/restrict-access-to-load-balancer.html#restrict-alb-route-based-on-header

 

Application Load Balancer에 대한 액세스 제한 - Amazon CloudFront

이 사용 사례에서는 사용자 지정 헤더의 이름과 값을 기밀로 유지해야 합니다. 헤더 이름과 값을 기밀로 유지하지 않으면 다른 HTTP 클라이언트에서 Application Load Balancer로 직접 보내는 요청에 헤

docs.aws.amazon.com