오리진 클로킹
개요
오리진 클로킹은 웹 애플리케이션의 공격 표면을 줄이는 것을 목표로 하는 일련의 기법입니다. 모범 사례는 DDoS 공격 및 원치 않는 봇에 대한 보호와 같은 보안 제어가 적용되는 웹 애플리케이션에 대한 단일 진입점으로 CloudFront를 사용하는 것입니다. 오리진 클로킹은 방화벽 규칙을 사용하여 CloudFront 진입점에서 오지 않는 트래픽을 차단함으로써 악의적인 공격자가 CloudFront와 CloudFront의 보안 제어를 우회하여 오리진을 직접 공격하는 것을 방지합니다. 오리진 클로킹은 OSI 모델의 여러 계층에서 구현될 수 있습니다.
애플리케이션 계층
네트워크 계층의 오리진 클로킹은 오리진을 직접적으로 표적으로 삼는 모든 공격으로부터 오리진을 보호합니다. 하지만 공격자는 검색된 오리진 도메인 이름으로 CloudFront 배포를 구성하고 CloudFront 배포를 통해 애플리케이션 계층 공격으로 오리진을 표적으로 삼아 자체 CloudFront 배포에 구성된 보안 제어를 효과적으로 우회할 수 있습니다.
오리진 도메인 이름을 난독화하는 것 외에도(예: origin.example.com은 피하세요!) CloudFront와 오리진 간에 애플리케이션 계층 액세스 제어를 추가하여 위와 같은 위험을 완화할 수 있습니다. 이는 오리진 유형과 보안 요구 사항에 따라 다양한 방식으로 구현될 수 있습니다.
서명 요청에 따른 액세스 제어
OAC는 IAM 정책을 기반으로 AWS Signature Version 4 알고리즘(sigv4)을 기본적으로 사용하여 특정 유형의 오리진에 대한 요청에 서명할 수 있도록 해주는 CloudFront의 기능입니다. 현재 OAC는 S3, MediaStore , MediaPackage, Lambda 함수 URL 및 S3 Object Lambda와 호환됩니다. OAC를 S3와 함께 사용하면 S3 버킷 정책에 따라 CloudFront에 독점적으로 액세스하여 S3 버킷을 비공개로 유지할 수 있습니다.
OAC에서 오리진 유형을 지원하지 않는 경우 엣지 함수를 사용하여 오리진에 대한 요청에 서명할 수 있습니다. 예시 구현은 다음 블로그에 설명되어 있습니다.
액세스 제어 기반 공유 비밀 키
오리진에서 요청 서명을 지원하지 않거나 애플리케이션에 이 수준의 액세스 제어가 필요하다고 생각하지 않는 경우, 오리진에 공유 암호가 포함된 사용자 지정 헤더를 전송하도록 CloudFront를 구성할 수 있습니다. 그러면 오리진에서 이를 검증하여 요청을 처리할 수 있습니다. 다음 예시 구현을 살펴보세요.
- ALB 기반 오리진. ALB 규칙을 사용하거나 ALB가 이미 AWS WAF WebACL과 연결되어 있는 경우 AWS WAF 규칙을 사용하여 ALB 기반 오리진의 보안 헤더를 검증할 수 있습니다.
- API Gateway 기반 오리진. API 키를 사용하여 API Gateway에서 보안 헤더를 검증할 수 있습니다.
- NGINX 기반 오리진. CloudFront에서 값이 abc123인 사용자 지정 헤더 X-CloudFront를 전송한다고 가정하면, /etc/nginx/nginx.conf Nginx 구성 파일의 서버 태그에 다음 코드를 추가하여 Nginx 기반 웹 서버(클라우드 기반 또는 온프레미스 기반)에서 보안 헤더를 검증할 수 있습니다.
if ($http_x_cloudfront != "abc123") {
return 403;
} - Apache 기반 오리진. CloudFront에서 값이 abc123인 사용자 지정 헤더 X-CloudFront를 전송한다고 가정하면, httpd.conf 구성 파일(및 사용되는 경우 ssl.conf 파일)에 다음 코드를 추가하여 Apache 기반 웹 서버(클라우드 기반 또는 온프레미스 기반)에서 보안 헤더를 검증할 수 있습니다.
RewriteEngine On
RewriteCond %{HTTP:x-cloudfront} !^abc123$ [NC]
RewriteRule ^ - [F]
모든 경우에 이 공유 비밀을 정기적으로 교체하여 비밀 유출 위험을 줄이는 것이 좋습니다. 위에서 공유한 샘플 구현에서 API Gateway와 ALB를 사용한 구현에는 모두 비밀 교체 자동화가 포함되어 있습니다.
네트워크 계층에서
CloudFront는 서비스 필드의 CLOUDFRONT_ORIGIN_FACING 값을 사용하여 오리진과의 TCP 연결을 설정하는 데 사용되는 IP 주소를 게시합니다. 오리진 방화벽에 ACL을 구현하여 CloudFront 오리진 지향 IP에서 발생하지 않는 트래픽을 차단할 수 있습니다. 이 접근 방식에서는 ACL을 업데이트하려면 IP 변경을 구독해야 합니다. 타사 방화벽을 사용하여 온프레미스 웹 서버에 오리진 클로킹을 구현하는 방법을 알아보려면 이 블로그 게시물을 확인하세요.
오리진이 amazon VPC에서 호스팅되는 경우, Amazon CloudFront의 AWS 관리형 접두사 목록을 오리진에 연결된 보안 그룹(EC2, NLB, ALB 등)에 추가하여 간단히 오리진 클로킹을 구현할 수 있습니다.
두 경우 모두 CloudFront와 오리진 간에 TLS를 통한 보안 연결을 설정하는 것이 좋습니다.
물리 계층에서
오리진이 온프레미스에 있는 경우 Direct Connect 연결에서 퍼블릭 가상 인터페이스를 사용하여 온프레미스 인프라와 AWS 간에 AWS Direct Connect를 설정하는 것을 고려해 보세요. 이렇게 하면 오리진과 CloudFront 간의 트래픽이 인터넷을 통해 연결할 수 없는 사설 관리 네트워크를 통해 전송됩니다.