Amazon Web Services 한국 블로그

Amazon CloudFront용 AWS 관리형 접두사 목록을 사용하여 오리진에 대한 액세스 제한하기

Amazon CloudFront는 전 세계의 엣지 로케이션 네트워크를 사용하여 짧은 지연 시간과 높은 데이터 전송 속도로 콘텐츠를 배포하는 쉽고 비용 효율적인 방법을 제공합니다. CloudFront의 요청이 오리진(콘텐츠 소스, 예를 들어 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스)에 액세스할 수 있도록 하려면 오리진의 보안 정책이 CloudFront에 속한 모든 IP 범위에 대해 액세스를 허용해야 합니다. AWS는 CloudFront를 포함한 현재 IP 주소를 JSON 형식로 발행하며, 이러한 IP 범위는 자주 변경될 수 있습니다. 따라서 보안 그룹에 허용된 IP 범위를 수동으로 지속적으로 업데이트하는 것은 번거로울 수 있습니다. 이를 방지하려면 오리진에서 인바운드 액세스를 개방하는 것을 고려할 수 있습니다. 그러나 이것은 DDoS 복원력을 위한 AWS 모범 사례에서는 권장하지 않습니다. 오리진을 모든 IP 주소에 열어 두면, CloudFront에서 제공하고 CloudFront에 배포된 보호 수단을 우회하여 공격자가 오리진 리소스에 대해 직접 공격을 시작할 수 있습니다.
이 블로그처럼 CloudFront IP 범위가 변경될 때 보안 그룹을 업데이트하는 프로세스를 자동화하여 CloudFront에서 오리진에 대한 액세스를 제한하는 몇 가지 해결 방법이 만들어졌습니다. 여기에는 추가 구성과 AWS Lambda 함수 실행 비용이 포함됩니다. 이를 간소화하기 위해, 이제 오리진으로의 인바운드 HTTP/HTTPS 트래픽을 CloudFront 오리진 연결 IP 주소로만 제한하는 CloudFront용 AWS 관리형 접두사 목록을 도입하였습니다. AWS에서 관리하는 접두사 목록은 AWS에서 생성 및 유지 관리하며 추가 비용 없이 사용할 수 있습니다. Amazon Virtual Private Cloud(Amazon VPC)의 보안 그룹 규칙, 서브넷 라우팅 테이블, AWS Firewall Manager의 공통 보안 그룹 규칙, 그리고 관리형 접두사 목록을 사용할 수 있는 기타 모든 AWS 리소스에서 CloudFront의 관리형 접두사 목록을 참조할 수 있습니다.

보안 그룹에서 관리형 접두사 목록 사용하기

EC2 인스턴스 또는 애플리케이션 로드 밸런서와 같은 오리진 리소스에 연결하는 보안 그룹에서 인바운드 규칙의 일부로 CloudFront용 관리형 접두사 목록을 사용할 수 있습니다.
CloudFront용 관리형 접두사 목록은 보안 그룹에서 55개 규칙으로 계산됩니다. 보안 그룹의 기본 할당량은 규칙 60개이며, 인바운드 규칙에 CloudFront용 관리형 접두사 목록 하나를 추가하면 5개의 추가 규칙만 사용할 수 있습니다. CloudFront용 관리형 접두사 목록을 사용하여 HTTP와 HTTPS 요청을 모두 제한하려면 총 110개의 규칙으로 계산되는 두 개의 개별 규칙을 추가해야 합니다. 필요한 경우 이 할당량에 대한 할당량 증가를 요청할 수 있습니다. 또는 오리진에 액세스하는 데 HTTPS만 사용하도록 CloudFront 오리진 프로토콜 정책을 구성하여 하나의 인바운드 포트 (가급적 HTTPS)만 열 수 있습니다.
AWS 콘솔을 사용하여 CloudFront용 관리형 접두사 목록을 추가하려면 이 보안 그룹을 사용할 원본 리소스가 있는 AWS 리전의 VPC 아래에 있는 보안 그룹 섹션으로 이동하십시오.
새 보안 그룹을 만들거나 기존 보안 그룹을 업데이트할 수 있습니다. 인바운드 규칙(Inbound rules) 섹션에서 요구 사항에 따라 유형(Type)을 HTTP 또는 HTTPS로 선택하고 소스(Source) 검색의 경우 global.cloudfront.origin-facing 문자열이 포함된 접두사 목록을 선택합니다. 접두사 목록 ID는 AWS 리전에 따라 다르므로 ID가 다음 스크린샷에 표시된 것과 다르게 보일 수 있습니다.

Amazon VPC 콘솔에서 AWS 리전의 접두사 목록 ID 값을 찾을 수 있습니다. 관리형 접두사 목록 섹션에서 접두사 목록 이름이 com.amazonaws.global.cloudfront.origin-facing으로 표시된 항목을 찾으십시오. 다음 스크린샷은 싱가포르 리전의 pl-31a34658 값을 보여줍니다.

또한 다음 명령을 실행하여 AWS 명령줄 인터페이스 (AWS CLI)를 사용하여 AWS 리전의 접두사 목록 ID를 조회할 수 있습니다.

aws ec2 describe-managed-prefix-lists --query 'PrefixLists[?PrefixListName==`com.amazonaws.global.cloudfront.origin-facing`]' --region <insert region name>

AWS CloudFormation을 사용하여 보안 그룹을 생성하려는 경우 이 샘플 템플릿을 사용하고 요구 사항에 따라 편집하여 CloudFront 관리형 접두사 목록을 포함할 수 있습니다.

# /*
# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
# * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
# * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# *
# * Change History:
# * 2022-02-09: Created. Supported in all regions except Jakarta (ap-southeast-3), Osaka (ap-northeast-3), # * China and GovCloud regions
# */

AWSTemplateFormatVersion: 2010-09-09
Description: |
  CloudFront HTTPS ingress only SG via managed prefix list
  (https://aws.amazon.com/about-aws/whats-new/2022/02/amazon-cloudfront-managed-prefix-list/).
  Prefix list may not be supported for some regions
  (Run aws ec2 describe-managed-prefix-lists to verify presence of "com.amazonaws.global.cloudfront.origin-facing" PrefixListName)

Parameters:
  securityGroupName:
    Type: String
    Description: Security Group Name
    Default: CloudFront ingress only
  vpcID:
    Type: AWS::EC2::VPC::Id
    Description: VPC

Mappings:
  # aws ec2 describe-managed-prefix-lists  --region <REGION> | jq -r '.PrefixLists[] | select (.PrefixListName == "com.amazonaws.global.cloudfront.origin-facing") | .PrefixListId'
  AWSRegions2PrefixListID:
    ap-northeast-1:
      PrefixList: pl-58a04531
    ap-northeast-2:
      PrefixList: pl-22a6434b
    #ap-northeast-3
    #
    ap-south-1:
      PrefixList: pl-9aa247f3
    ap-southeast-1:
      PrefixList: pl-31a34658
    ap-southeast-2:
      PrefixList: pl-b8a742d1
    #ap-southeast-3:
    #  PrefixList:
    ca-central-1:
      PrefixList: pl-38a64351
    eu-central-1:
      PrefixList: pl-a3a144ca
    eu-north-1:
      PrefixList: pl-fab65393
    eu-west-1:
      PrefixList: pl-4fa04526
    eu-west-2:
      PrefixList: pl-93a247fa
    eu-west-3:
      PrefixList: pl-75b1541c
    sa-east-1:
      PrefixList: pl-5da64334
    us-east-1:
      PrefixList: pl-3b927c52
    us-east-2:
      PrefixList: pl-b6a144df
    us-west-1:
      PrefixList: pl-4ea04527
    us-west-2:
      PrefixList: pl-82a045eb
Resources:
  securityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Ref securityGroupName
      GroupDescription: Only allow CloudFront ingress
      VpcId: !Ref vpcID
      SecurityGroupEgress:
        - Description: Allow all outbound traffic
          IpProtocol: "-1"
          CidrIp: 0.0.0.0/0
      SecurityGroupIngress:
        - Description: Allow HTTPS from com.amazonaws.global.cloudfront.origin-facing
          IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          SourcePrefixListId:  !FindInMap [AWSRegions2PrefixListID, !Ref 'AWS::Region', PrefixList]
      Tags:
        - Key: StackName
          Value: !Sub ${AWS::StackName}
        - Key: StackId
          Value: !Sub ${AWS::StackId}
        - Key: Name
          Value: !Ref securityGroupName
Outputs:
  SecurityGroup:
    Value: !Sub "https://console.aws.amazon.com/ec2/home?region=${AWS::Region}#SecurityGroups:search=${securityGroup}"

VPC 라우팅 테이블 안에서 관리형 접두사 목록 사용하기

VPC 라우팅 테이블에서 CloudFront용 관리형 접두사 목록을 사용할 수 있습니다. 예를 들어, CloudFront 오리진 리소스에서 나가는 다른 모든 인터넷 트래픽을 차단하기 위해 이 작업을 수행할 수 있습니다.
CloudFront용 관리형 접두사 목록은 라우팅 테이블에서 55개의 라우팅(또는 경로)으로 계산됩니다. 기본 할당량은 50개 라우팅(또는 경로)이므로 라우팅 테이블에 접두사 목록을 추가하려면 먼저 할당량 증가를 요청해야 합니다.
AWS 콘솔을 사용하여 CloudFront용 관리형 접두사 목록을 추가하려면 이 라우팅 테이블을 사용할 VPC가 있는 AWS 리전의 VPC 아래에 있는 라우팅 테이블 섹션으로 이동하십시오.
새 라우팅 테이블을 만들거나 기존 테이블에서 라우팅을 편집할 수 있습니다. 라우팅 편집(Edit routes) 섹션에서 라우팅 추가(Add route)를 선택합니다. 대상(Destination)의 경우 드롭다운 목록에서 global.cloudfront.origin-facing 문자열이 포함된 접두사 목록을 선택합니다. 대상(Target)에 대해 이러한 라우팅 규칙을 적용할 인터넷 게이트웨이를 선택한 다음 변경 사항을 저장합니다.

AWS Firewall Manager에서 관리형 접두사 목록 사용하기

AWS Firewall Manager를 사용하여 조직 전체의 여러 계정과 리소스에 대한 보안 그룹의 자동 연결을 중앙에서 제어할 수 있습니다. 예를 들어 CloudFront형 관리형 접두사에서만 인바운드 액세스가 허용되는 보안 그룹을 포함하는 공통 보안 그룹 정책을 정의할 수 있습니다. 그러면 Firewall Manager가 이 보안 그룹을 여러 AWS 계정에서 선택한 애플리케이션 로드 밸런서 및 EC2 인스턴스에 자동으로 적용할 수 있습니다.
AWS 콘솔을 사용하여 이를 생성하려면 관리자 계정에서 Firewall Manager로 이동하십시오. 이 게시물 앞부분의 보안 그룹에서 관리형 접두사 목록 사용하기 섹션에서 설명한 것과 동일한 단계에 따라 새 보안 그룹을 생성합니다. 보안 정책(Security policies)으로 이동하여 새 정책을 생성합니다. 정책 규칙(Policy rules) 섹션에서 방금 생성하여 정책에 추가한 보안 그룹을 선택합니다. 정책 조치(Policy action)에서 규정을 준수하지 않는 리소스를 자동으로 수정하여 Firewall Manager에서 다루는 모든 리소스에 새 보안 정책을 적용하거나 비준수 리소스를 식별하여 수동으로 업데이트하도록 선택할 수 있습니다.

Firewall Manager 정책 범위를 정의하여 애플리케이션 로드 밸런서, 클래식 로드 밸런서, EC2 인스턴스 및 엘라스틱 네트워크 인터페이스에 이 보안 그룹을 적용하여 이들 모두에 대한 인바운드 액세스를 CloudFront의 오리진을 바라보는(origin-facing) IP 범위로만 제한할 수 있습니다.

결론

CloudFront 관리형 접두사 목록을 사용하여 오리진에 대한 액세스를 CloudFront에서 들어오는 트래픽만으로 제한하는 방법을 배웠습니다. 관리형 접두사 목록은 GovCloud, 중국, 아시아 태평양 (자카르타) 및 아시아 태평양 (오사카) 을 제외한 모든 리전의 AWS SDK 뿐만 아니라 AWS 콘솔을 통해 즉시 사용할 수 있습니다.
CloudFront용 관리형 접두사 목록에는 CloudFront 엣지 서버의 위치 및 IP 주소 범위에 설명된 100개 이상의 접두사에 비해 접두사가 더 적다는 것을 눈치채셨을 것입니다. 이는 접두사 목록이 CloudFront의 엣지 및 리전 로케이션으로부터 AWS 오리진을 바라보는 서버를 포함하는 하위 집합이기 때문입니다. ip-ranges.json의 접두사를 각각 서비스 코드 값 CLOUDFRONT_ORIGIN_FACING 및 CLOUDFRONT로 필터링할 수 있습니다.
AWS에서 관리하는 이 접두사 목록은 네트워크 계층에서의 보호 기능을 제공하며 이는 전체 인프라 및 데이터 보안 전략의 일부일 뿐입니다. 더불어 클라우드에서 보안을 유지하는 데 도움이 되는 CloudFront의 다른 방법도 구현해야 합니다. 또한 포괄적인 보안 조치의 일환으로 AWS WAF를 사용하여 애플리케이션 계층에서 심층적인 방어를 수행하고 AWS Network Firewall과 Amazon GuardDuty를 사용하여 의심스러운 트래픽을 차단하는 것도 고려해 볼 수 있습니다. Firewall Manager를 사용하면 조직 전체에서 규모에 맞게 액세스를 관리할 수 있습니다. 자세한 내용은 Firewall Manager 관련 보안 게시물을 참조하십시오.

이 글은 AWS Networking & Content Delivery 블로그의 Limit access to your origins using the AWS-managed prefix list for Amazon CloudFront을 기반으로 김광영 AWS 솔루션즈 아키텍트가 한국어로 번역 및 편집하였습니다.