Network Firewall을 사용하여 아웃바운드 트래픽의 서버 이름 표시 (SNI) 에서 DNS 도메인 이름을 캡처합니다. - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Network Firewall을 사용하여 아웃바운드 트래픽의 서버 이름 표시 (SNI) 에서 DNS 도메인 이름을 캡처합니다.

작성자: 키란쿠마르 찬드라셰카르 () AWS

환경: PoC 또는 파일럿

기술: 보안, ID, 규정 준수, 네트워킹, 웹 및 모바일 앱

워크로드: 기타 모든 워크로드

AWS서비스: AWS Lambda, 네트워크 AWS 방화벽, 아마존, 아마존 로그 VPC CloudWatch

요약

이 패턴은 Amazon Web Services (AWS) Network Firewall을 사용하여 아웃바운드 네트워크 트래픽의 HTTPS 헤더에 있는 서버 이름 표시 (SNI) 에서 제공하는 DNS 도메인 이름을 수집하는 방법을 보여줍니다. Network Firewall은 Amazon Virtual Private Cloud (AmazonVPC) 에 대한 중요한 네트워크 보호 기능을 쉽게 배포할 수 있게 해주는 관리형 서비스입니다. 여기에는 특정 보안 요구 사항을 충족하지 못하는 패킷을 차단하는 방화벽으로 아웃바운드 트래픽을 보호하는 기능이 포함됩니다. 특정 DNS 도메인 이름으로의 아웃바운드 트래픽을 보호하는 것을 이그레스 필터링이라고 하며, 이는 한 네트워크에서 다른 네트워크로의 아웃바운드 정보 흐름을 모니터링하고 잠재적으로 제한하는 방법입니다.

Network Firewall을 통과하는 SNI 데이터를 캡처한 후에는 Amazon CloudWatch Logs 및 AWS Lambda를 사용하여 이메일 알림을 생성하는 Amazon 단순 알림 서비스 (SNSAmazon) 주제에 데이터를 게시할 수 있습니다. 이메일 알림에는 서버 이름 및 기타 관련 SNI 정보가 포함됩니다. 또한 이 패턴의 출력을 사용하여 방화벽 규칙을 사용하여 도메인 이름별로 아웃바운드 트래픽을 허용하거나 제한할 수 있습니다. SNI 자세한 내용은 Network Firewall 설명서의 AWSNetwork Firewall의 상태 저장 규칙 그룹 사용을 참조하십시오.

사전 조건 및 제한 사항

사전 조건 

참고: Network Firewall은 다음 VPC 구성 중 하나를 사용할 수 있습니다.

아키텍처

다음 다이어그램은 Network Firewall을 사용하여 아웃바운드 네트워크 트래픽에서 SNI 데이터를 수집한 다음 CloudWatch Logs and Lambda를 사용하여 해당 데이터를 SNS 주제에 게시하는 방법을 보여줍니다.

네트워크 방화벽, CloudWatch 로그, Lambda, Amazon 간의 워크플로 SNS

이 다이어그램은 다음 워크플로를 보여줍니다.

  1. Network Firewall은 아웃바운드 네트워크 트래픽의 HTTPS 헤더에 있는 SNI 데이터에서 도메인 이름을 수집합니다.

  2. CloudWatch 로그는 아웃바운드 네트워크 트래픽이 Network Firewall을 통과할 때마다 SNI 데이터를 모니터링하고 Lambda 함수를 호출합니다.

  3. Lambda 함수는 SNI Logs에서 CloudWatch 캡처한 데이터를 읽은 다음 해당 데이터를 주제에 게시합니다. SNS

  4. SNS주제는 데이터가 포함된 이메일 알림을 보냅니다. SNI

자동화 및 규모 조정

기술 스택

  • 아마존 CloudWatch 로그

  • 아마존 SNS

  • 아마존 VPC

  • AWS람다 

  • AWS Network Firewall

도구

AWS서비스

  • Amazon CloudWatch Logs — Amazon CloudWatch Logs를 사용하여 Amazon Elastic Compute Cloud (AmazonEC2) 인스턴스, AWS CloudTrail Amazon Route 53 및 기타 소스에서 로그 파일을 모니터링, 저장 및 액세스할 수 있습니다.

  • Amazon SNS — Amazon 단순 알림 서비스 (AmazonSNS) 는 게시자로부터 구독자 (생산자 및 소비자라고도 함) 에게 메시지를 전달하는 관리형 서비스입니다.

  • Amazon VPC — Amazon Virtual Private Cloud (AmazonVPC) 는 논리적으로 격리된 AWS 클라우드 섹션을 프로비저닝하여 사용자가 정의한 가상 네트워크에서 AWS 리소스를 시작할 수 있습니다. 이 가상 네트워크는 확장 가능한 인프라를 사용할 수 있다는 점을 제외하면 자체 데이터 센터에서 운영하는 기존 네트워크와 매우 유사합니다. AWS

  • AWSLambda AWS — Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있는 컴퓨팅 서비스입니다.

  • AWSNetwork Firewall — AWS Network Firewall은 모든 VPCs Amazon에 필수적인 네트워크 보호 기능을 쉽게 배포할 수 있게 해주는 관리형 서비스입니다.

에픽

작업설명필요한 기술

CloudWatch 로그 그룹 생성.

  1. AWS관리 콘솔에 로그인하고 CloudWatch 콘솔을 엽니다.

  2. 탐색 창에서 로그 그룹을 선택합니다.

  3. 작업을 선택한 후 로그 그룹 생성을 선택합니다.

  4. 로그 그룹의 이름을 입력한 다음 로그 그룹 생성을 선택합니다.

자세한 내용은 CloudWatch 설명서의 로그 그룹 및 로그 스트림 작업을 참조하십시오.

클라우드 관리자
작업설명필요한 기술

SNS 주제를 만듭니다.

SNS주제를 생성하려면 Amazon SNS 설명서의 지침을 따르십시오.

클라우드 관리자

SNS주제에 대한 엔드포인트를 구독하십시오.

생성한 SNS 주제의 엔드포인트로 이메일 주소를 구독하려면 Amazon SNS 설명서의 지침을 따르십시오. 프로토콜에서 이메일/이메일-을 선택합니다. JSON 참고: 요구 사항에 따라 다른 엔드포인트를 선택할 수도 있습니다.

클라우드 관리자
작업설명필요한 기술

방화벽 로깅을 활성화합니다.

  1. AWS관리 콘솔에 로그인하고 Amazon VPC 콘솔을 엽니다.

  2. 탐색 창의 아래에서 NETWORKFIREWALL방화벽을 선택합니다.

  3. 방화벽 섹션에서 아웃바운드 SNI 트래픽용 서버 이름을 캡처하려는 방화벽을 선택합니다.

  4. 방화벽 세부 정보 탭을 선택한 다음 로깅 섹션에서 편집을 선택합니다. 

  5. 로그 유형에서 알림을 선택합니다. 경고의 로그 대상으로 CloudWatch 로그 그룹을 선택합니다. 

  6. CloudWatch 로그 그룹의 경우 이전에 만든 로그 그룹을 검색하여 선택한 다음 [Save] 를 선택합니다.

Network Firewall의 CloudWatch 로그 대상으로 Logs를 사용하는 방법에 대한 자세한 내용은 Network Firewall 설명서의 Amazon CloudWatch Logs를 참조하십시오. 

클라우드 관리자
작업설명필요한 기술

상태 저장 규칙을 생성합니다.

  1. AWS관리 콘솔에 로그인하고 Amazon VPC 콘솔을 엽니다.

  2. 탐색 창의 Network Firewall 규칙 그룹에서 Network Firewall 규칙 그룹을 선택합니다. NETWORKFIREWALL

  3. Network Firewall 규칙 그룹 생성을 선택합니다.

  4. Network Firewall 규칙 그룹 생성 페이지에서 규칙 그룹 유형으로 상태 저장 규칙 그룹을 선택합니다. 참고: 자세한 내용은 AWSNetwork Firewall에서 상태 저장 규칙 그룹 사용을 참조하십시오.

  5. 상태 저장 규칙 그룹 섹션에서 규칙 그룹의 이름과 규칙 그룹의 설명을 입력합니다.

  6. 용량에서 상태 저장 규칙 그룹에 허용하려는 최대 용량(최대 30,000개)을 설정합니다. 참고: 규칙 그룹을 생성한 후에는 이 설정을 변경할 수 없습니다. 용량을 계산하는 방법에 대한 자세한 내용은 AWSNetwork Firewall에서 규칙 그룹 용량 설정을 참조하십시오. 최대 설정에 대한 자세한 내용은 AWSNetwork Firewall 할당량을 참조하십시오.

  7. 상태 저장 규칙 그룹 옵션에서 5-tuple을 선택합니다.

  8. 상태 저장 규칙 순서 섹션에서 기본값을 선택합니다.

  9. 규칙 변수 섹션에서 기본값을 유지합니다.

  10. 규칙 추가 섹션에서 프로토콜을 선택합니다 TLS. 소스에서 모두를 선택합니다. 소스 포트의에서 모든 포트를 선택합니다. 대상에서 모두를 선택합니다. 대상 포트에서 모든 포트를 선택합니다. 트래픽 방향에서 전달을 선택합니다. 작업에서 알림을 선택합니다. 규칙 추가를 선택합니다.

  11. 상태 저장 규칙 그룹 생성을 선택합니다.

클라우드 관리자

상태 저장 규칙을 Network Firewall에 연결합니다.

  1. AWS관리 콘솔에 로그인하고 Amazon VPC 콘솔을 엽니다.

  2. 탐색 창의 아래에서 NETWORKFIREWALL방화벽을 선택합니다.

  3. 아웃바운드 SNI 트래픽용 에서 서버 이름을 캡처하려는 방화벽을 선택합니다.

  4. 상태 저장 규칙 그룹 섹션에서 작업을 선택한 다음 비관리형 상태 저장 규칙 그룹 추가를 선택합니다. 

  5. 비관리형 상태 저장 규칙 그룹 추가 페이지에서 이전에 생성한 상태 저장 규칙 그룹을 선택한 다음 상태 저장 규칙 그룹 추가를 선택합니다.

클라우드 관리자
작업설명필요한 기술

Lambda 함수의 코드를 생성합니다.

아웃바운드 트래픽에 대해 Network Firewall에서 CloudWatch Logs 이벤트를 읽을 수 있는 통합 개발 환경 (IDE) 에서 다음 Python 3 코드를 붙여넣고 원하는 값으로 <SNS-topic-ARN> 바꿉니다.

import json import gzip import base64 import boto3 sns_client = boto3.client('sns') def lambda_handler(event, context): decoded_event = json.loads(gzip.decompress(base64.b64decode(event['awslogs']['data']))) body = ''' {filtermatch} '''.format( loggroup=decoded_event['logGroup'], logstream=decoded_event['logStream'], filtermatch=decoded_event['logEvents'][0]['message'], ) print(body) filterMatch = json.loads(body) data = [] if 'http' in filterMatch['event']: data.append(filterMatch['event']['http']['hostname']) elif 'tls' in filterMatch['event']: data.append(filterMatch['event']['tls']['sni']) result = 'Domain accessed ' + 1*' ' + (data[0]) + 1*' ' 'via AWS Network Firewall ' + 1*' ' + (filterMatch['firewall_name']) print(result) message = {'ServerName': result} send_to_sns = sns_client.publish( TargetArn=<SNS-topic-ARN>, #Replace with the SNS topic ARN Message=json.dumps({'default': json.dumps(message), 'sms': json.dumps(message), 'email': json.dumps(message)}), Subject='Server Name passed through the Network Firewall', MessageStructure='json' )

이 코드 샘플은 CloudWatch 로그 콘텐츠를 파싱하고 헤더에 SNI 에서 제공하는 서버 이름을 캡처합니다. HTTPS

앱 개발자

Lambda 함수를 생성합니다.

Lambda 함수를 생성하려면 Lambda 설명서의 지침을 따르고 런타임을 위한 Python 3.9를 선택하십시오.

클라우드 관리자

Lambda 함수에 코드를 추가합니다.

이전에 생성한 Lambda 함수에 Python 코드를 추가하려면 Lambda 설명서의 지침을 따르십시오.

클라우드 관리자

Lambda 함수에 CloudWatch 로그를 트리거로 추가합니다.

  1. AWS관리 콘솔에 로그인하고 Lambda 콘솔을 엽니다.

  2. 탐색 창에서 함수를 선택한 후, 앞서 생성한 함수를 선택합니다.

  3. 함수 개요 섹션에서 트리거 추가를 선택합니다.

  4. 트리거 추가 페이지의 트리거 구성 섹션에서 CloudWatch 로그를 선택한 다음 추가를 선택합니다.

  5. 로그 그룹의 경우 이전에 만든 CloudWatch 로그 그룹을 선택합니다.

  6. 필터 이름에 필터 이름을 입력합니다.

  7. 추가를 선택합니다.

  8. 함수 페이지의 구성 탭에 있는 트리거 섹션에서 방금 추가한 트리거를 선택한 다음 활성화를 선택합니다.

자세한 내용은 Lambda 설명서의 CloudWatch 로그와 함께 Lambda 사용을 참조하십시오.

클라우드 관리자

게시 권한을 추가하십시오. SNS

Lambda가 메시지를 게시하기 위한 호출을 할 수 있도록 Lambda 실행 역할에 SNS:publish 권한을 추가합니다. API SNS  

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSNSPublish", "Effect": "Allow", "Action": [ "sns:GetTopicAttributes", "sns:Subscribe", "sns:Unsubscribe", "sns:Publish" ], "Resource": "*" } ] }
클라우드 관리자
작업설명필요한 기술

Network Firewall을 통해 트래픽을 전송합니다.

  1. HTTPS트래픽이 Network Firewall을 통과할 때까지 전송하거나 기다립니다.

  2. 트래픽이 Network Firewall을 AWS 통과할 때 수신되는 SNS 알림 이메일을 확인하십시오. 이메일에는 아웃바운드 트래픽에 대한 SNI 세부 정보가 포함되어 있습니다. 예를 들어, 액세스한 도메인 이름이 https://aws.amazon.com이고 구독 프로토콜이 -인 경우 위의 Lambda 코드에서 생성된 이메일에는 다음과 같은 콘텐츠가 포함됩니다. EMAIL JSON

{ "Type": "Notification", "MessageId": "<messageID>", "TopicArn": "arn:aws:sns:us-west-2:123456789:testSNSTopic", "Subject": "Server Name passed through the Network Firewall", "Message": "{\"ServerName\": \"Domain 'aws.amazon.com' accessed via AWS Network Firewall 'AWS-Network-Firewall-Multi-AZ-firewall\"}", "Timestamp": "2022-03-22T04:10:04.217Z", "SignatureVersion": "1", "Signature": "<Signature>", "SigningCertURL": "<SigningCertUrl>", "UnsubscribeURL": "<UnsubscribeURL>" }

그런 다음 Amazon CloudWatch 설명서의 지침에 CloudWatch 따라 Amazon의 Network Firewall 알림 로그를 확인하십시오. 알림 로그는 다음 오류를 보여줍니다.

{ "firewall_name": "AWS-Network-Firewall-Multi-AZ-firewall", "availability_zone": "us-east-2b", "event_timestamp": "<event timestamp>", "event": { "timestamp": "2021-03-22T04:10:04.214222+0000", "flow_id": <flow ID>, "event_type": "alert", "src_ip": "10.1.3.76", "src_port": 22761, "dest_ip": "99.86.59.73", "dest_port": 443, "proto": "TCP", "alert": { "action": "allowed", "signature_id": 2, "rev": 0, "signature": "", "category": "", "severity": 3 }, "tls": { "subject": "CN=aws.amazon.com", "issuerdn": "C=US, O=Amazon, OU=Server CA 1B, CN=Amazon", "serial": "<serial number>", "fingerprint": "<fingerprint ID>", "sni": "aws.amazon.com", "version": "TLS 1.2", "notbefore": "2020-09-30T00:00:00", "notafter": "2021-09-23T12:00:00", "ja3": {}, "ja3s": {} }, "app_proto": "tls" } }
테스트 엔지니어