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

Application Load Balancer에 대한 액세스 제한

CloudFront는 Elastic Load Balancing에서 인터넷 경계 Application Load Balancer를 통해 제공되는 웹 애플리케이션 또는 기타 콘텐츠의 객체를 캐싱하고 사용자(최종 사용자)에게 직접 제공하여 Application Load Balancer의 로드를 줄입니다. 인터넷 경계 로드 밸런서는 공개적으로 확인 가능한 DNS 이름이 있으며 인터넷을 통해 클라이언트의 요청을 대상으로 라우팅합니다.

CloudFront는 지연 시간을 줄이고 일부 분산 서비스 거부(DDoS) 공격을 완화하는 데 도움이 됩니다.

그러나 사용자가 CloudFront를 우회하여 Application Load Balancer에 직접 액세스할 수 있다면 이러한 이점을 얻을 수 없습니다. 하지만 사용자가 Application Load Balancer에 직접 액세스할 수 없도록 Amazon CloudFront 및 Application Load Balancer를 구성할 수 있습니다. 이렇게 하면 사용자가 CloudFront를 통해서만 Application Load Balancer에 액세스할 수 있으므로 CloudFront를 사용할 때의 이점을 실현할 수 있습니다.

사용자가 Application Load Balancer에 직접 액세스할 수 없고 CloudFront를 통해서만 액세스할 수 있도록 하려면 간단한 다음 단계를 완료합니다.

  1. Application Load Balancer로 보내는 요청에 사용자 지정 HTTP 헤더를 추가하도록 CloudFront를 구성합니다.

  2. 사용자 지정 HTTP 헤더가 포함된 요청만 전달하도록 Application Load Balancer를 구성합니다.

  3. (선택 사항) HTTPS를 사용하도록 하여 이 솔루션의 보안을 강화합니다.

자세한 내용은 다음 항목을 참조하십시오. 이 단계를 완료하면 사용자가 CloudFront를 통해서만 Application Load Balancer에 액세스할 수 있습니다.

사용자 지정 HTTP 헤더를 요청에 추가하도록 CloudFront 구성

오리진(이 경우 Application Load Balancer)으로 보내는 요청에 사용자 지정 HTTP 헤더를 추가하도록 CloudFront를 구성할 수 있습니다.

중요

이 사용 사례에서는 사용자 지정 헤더의 이름과 값을 기밀로 유지해야 합니다. 헤더 이름과 값을 기밀로 유지하지 않으면 다른 HTTP 클라이언트에서 Application Load Balancer로 직접 보내는 요청에 헤더 이름과 값을 포함할 수 있습니다. 그러면 Application Load Balancer가 CloudFront의 요청이 아닌 것을 CloudFront의 요청처럼 처리할 수 있습니다. 이를 방지하려면 사용자 정의 헤더의 이름과 값을 기밀로 유지해야 합니다.

CloudFront 콘솔, AWS CloudFormation 또는 CloudFront API를 사용하여 오리진 요청에 사용자 지정 HTTP 헤더를 추가하도록 CloudFront를 구성할 수 있습니다.

사용자 지정 HTTP 헤더를 추가하려면(CloudFront 콘솔)

CloudFront 콘솔에서 오리진 설정오리진 사용자 지정 헤더 설정을 사용합니다. 헤더 이름 및 해당 을 입력합니다.

참고

프로덕션 환경에서는 무작위로 생성된 헤더 이름과 값을 사용합니다. 헤더 이름과 값은 사용자 이름 및 암호와 같은 보안 자격 증명으로 취급합니다.

기존 CloudFront 배포에 대한 오리진을 생성 또는 편집할 때와 새 배포를 생성할 때 오리진 사용자 지정 헤더 설정을 편집할 수 있습니다. 자세한 내용은 배포 업데이트배포 생성 단원을 참조하세요.

사용자 지정 HTTP 헤더 추가(AWS CloudFormation)

AWS CloudFormation 템플릿에서 다음 예제와 같이 OriginCustomHeaders 속성을 사용합니다.

참고

이 예제에서 헤더 이름과 값은 데모용입니다. 프로덕션 환경에서는 무작위로 생성된 값을 사용합니다. 헤더 이름과 값은 사용자 이름 및 암호와 같은 보안 자격 증명으로 취급해야 합니다.

AWSTemplateFormatVersion: '2010-09-09' Resources: TestDistribution: Type: 'AWS::CloudFront::Distribution' Properties: DistributionConfig: Origins: - DomainName: app-load-balancer.example.com Id: Example-ALB CustomOriginConfig: OriginProtocolPolicy: https-only OriginSSLProtocols: - TLSv1.2 OriginCustomHeaders: - HeaderName: X-Custom-Header HeaderValue: random-value-1234567890 Enabled: 'true' DefaultCacheBehavior: TargetOriginId: Example-ALB ViewerProtocolPolicy: allow-all CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6 PriceClass: PriceClass_All ViewerCertificate: CloudFrontDefaultCertificate: 'true'

자세한 내용은 AWS CloudFormation사용 설명서의 오리진OriginCustomHeader 속성을 참조합니다.

사용자 지정 HTTP 헤더를 추가하려면(CloudFront API)

CloudFront API에서 Origin 안에 CustomHeaders 객체를 사용합니다. 자세한 내용은 Amazon CloudFront API 참조의 CreateDistributionUpdateDistribution과 SDK 또는 기타 API 클라이언트 설명서를 참조합니다.

오리진 사용자 지정 헤더로 지정할 수 없는 헤더 이름이 몇 개 있습니다. 자세한 내용은 CloudFront에서 오리진 요청에 추가할 수 없는 사용자 지정 헤더 단원을 참조하십시오.

특정 헤더가 포함된 요청만 전달하도록 Application Load Balancer 구성

Application Load Balancer로 보내는 요청에 사용자 지정 HTTP 헤더를 추가하도록 CloudFront를 구성(이전 섹션 참조)한 후 이 사용자 지정 헤더가 포함된 요청만 전달하도록 로드 밸런서를 구성할 수 있습니다. 새 규칙을 추가하고 로드 밸런서의 리스너에서 기본 규칙을 수정하면 됩니다.

사전 조건

다음 절차를 사용하려면 리스너가 하나 이상인 Application Load Balancer가 필요합니다. 아직 생성하지 않았다면 Application Load Balancer 사용 설명서에서 Application Load Balancer 만들기를 참조합니다.

다음 절차에서는 HTTPS 수신기를 수정합니다. 동일한 프로세스를 사용하여 HTTP 수신기를 수정할 수 있습니다.

Application Load Balancer 수신기의 규칙을 업데이트하려면
  1. 새 규칙을 추가합니다. 규칙 추가의 지침을 따르고 다음과 같이 수정하세요.

    • CloudFront 배포의 오리진인 로드 밸런서에 규칙을 추가합니다.

    • 조건 추가에서 Http 헤더를 선택합니다. CloudFront에서 오리진 사용자 지정 헤더로 추가한 HTTP 헤더 이름과 값을 지정합니다.

    • 작업 추가에서 다음으로 전달:을 선택합니다. 요청을 전달할 대상 그룹을 선택합니다.

  2. 로드 밸런서의 리스너에서 기본 규칙을 편집합니다. 규칙 편집의 지침을 따르고 다음과 같이 수정하세요.

    • CloudFront 배포의 오리진인 로드 밸런서의 기본 규칙을 편집합니다.

    • 기본 작업을 삭제한 다음 작업 추가에서 고정 응답 반환을 선택합니다.

    • 응답 코드403을 입력합니다.

    • 응답 본문Access denied를 입력합니다.

이 단계를 완료하면 2개의 규칙이 로드 밸런서 리스너에 추가됩니다. 한 규칙은 HTTP 헤더가 포함된 요청(CloudFront에서 오는 요청)을 전달합니다. 또 다른 규칙은 다른 모든 요청(CloudFront에서 오지 않은 요청)에 고정 응답을 보냅니다.

CloudFront 배포와 Application Load Balancer로 요청을 보내 솔루션이 작동하는지 확인할 수 있습니다. CloudFront에 대한 요청은 웹 애플리케이션 또는 콘텐츠를 반환하고 Application Load Balancer로 직접 전송된 요청은 일반 텍스트 메시지 Access denied와 함께 403 응답을 반환합니다.

(선택 사항) 이 솔루션의 보안 강화

이 솔루션의 보안을 강화하려면 Application Load Balancer로 요청을 보낼 때 항상 HTTPS를 사용하도록 CloudFront 배포를 구성할 수 있습니다. 이 솔루션이 작동하려면 사용자 지정 헤더 이름과 값을 기밀로 유지해야 합니다. HTTPS를 사용하면 도청자가 헤더 이름과 값을 검색할 수 없습니다. 또한 헤더 이름과 값을 주기적으로 교체하는 것이 좋습니다.

오리진 요청에 HTTPS 사용

오리진 요청에 HTTPS를 사용하도록 CloudFront를 구성하려면 오리진 프로토콜 정책 설정을 HTTPS 전용으로 설정합니다. 이 설정은 CloudFront 콘솔, AWS CloudFormation 및 CloudFront API에서 사용할 수 있습니다. 자세한 내용은 프로토콜(사용자 지정 오리진만 해당) 단원을 참조하십시오.

오리진 요청에 HTTPS를 사용하도록 CloudFront를 구성하는 경우에도 다음이 적용됩니다.

  • 오리진 요청 정책에 따라 Host 헤더를 오리진에 전달하도록 CloudFront를 구성해야 합니다. AllViewer 관리형 오리진 요청 정책을 사용할 수 있습니다.

  • Application Load Balancer에 HTTPS 리스너가 있는지 확인합니다 (이전 섹션 참조). 자세한 내용은 Application Load Balancer 사용 설명서에서 HTTPS 리스너 생성을 참조합니다. HTTPS 리스너를 사용하려면 Application Load Balancer로 라우팅된 도메인 이름과 일치하는 SSL/TLS 인증서가 있어야 합니다.

  • CloudFront용 SSL/TLS 인증서는 AWS Certificate Manager(ACM)의 us-east-1 AWS 리전 에서만 요청(또는 가져오기)할 수 있습니다. CloudFront는 글로벌 서비스이므로 해당 지역의 인증서를 CloudFront 배포와 관련된 모든 us-east-1 리전에 자동으로 배포합니다.

    • 예를 들어 ap-southeast-2 리전에 Application Load Balancer(ALB)가 있는 경우 ap-southeast-2 리전(CloudFront와 ALB 오리진 간 HTTPS 사용)과 us-east-1 리전(최종 사용자와 CloudFront 간 HTTPS 사용) 모두에서 SSL/TLS 인증서를 구성해야 합니다. 두 인증서는 Application Load Balancer로 라우팅되는 도메인 이름과 일치해야 합니다. 자세한 내용은 AWS Certificate Manager용 AWS 리전 단원을 참조하십시오.

  • 웹 애플리케이션의 최종 사용자(최종 사용자 또는 클라이언트라고도 함)가 HTTPS를 사용할 수 있는 경우 최종 사용자의 HTTPS 연결을 기본적으로 사용하거나 요구하도록 CloudFront를 구성할 수도 있습니다. 이렇게 하려면 뷰어 프로토콜 정책 설정을 사용 합니다. 최종 사용자를 HTTP에서 HTTPS로 리디렉션하거나 HTTP를 사용하는 요청을 거부하도록 설정할 수 있습니다. 이 설정은 CloudFront 콘솔, AWS CloudFormation 및 CloudFront API에서 사용할 수 있습니다. 자세한 내용은 뷰어 프로토콜 정책 단원을 참조하십시오.

헤더 이름과 값 교체

HTTPS를 사용하는 것에 더해 헤더 이름과 값을 주기적으로 교체하는 것이 좋습니다. 이 작업을 수행하는 간략한 단계는 다음과 같습니다.

  1. Application Load Balancer로 보내는 요청에 추가 사용자 지정 HTTP 헤더를 추가하도록 CloudFront를 구성합니다.

  2. 추가 사용자 지정 HTTP 헤더가 포함된 요청만 전달하도록 Application Load Balancer 리스너 규칙을 업데이트합니다.

  3. Application Load Balancer로 보내는 요청에 원래 사용자 지정 HTTP 헤더를 추가하지 않도록 CloudFront를 구성합니다.

  4. 원래 사용자 지정 HTTP 헤더가 포함된 요청을 전달하지 않도록 Application Load Balancer 리스너 규칙을 업데이트합니다.

이러한 단계를 수행하는 방법에 대한 자세한 내용은 이전 섹션을 참조하세요.

(선택 사항) CloudFront의 AWS-managed 접두사 목록을 사용하여 오리진에 대한 액세스를 제한합니다.

Application Load Balancer에 대한 액세스를 더욱 제한하려면 서비스가 AWS-managed 접두사 목록을 사용할 때만 CloudFront의 트래픽을 수락하도록 Application Load Balancer와 연결된 보안 그룹을 구성할 수 있습니다. 이렇게 하면 CloudFront에서 시작되지 않은 트래픽이 네트워크 계층(계층 3) 또는 전송 계층(계층 4)의 Application Load Balancer에 도달하는 것을 방지할 수 있습니다.

자세한 내용은 Amazon CloudFront의 AWS-managed 접두사 목록을 사용하여 오리진에 대한 액세스 제한 블로그 게시물을 참조합니다.