AWS WAF, AWS Firewall Manager 및 AWS Shield Advanced
개발자 가이드 (API 버전 2015-08-24)

자습서: 잘못된 요청을 제출하는 IP 주소 차단

AWS Lambda를 사용하여 웹 애플리케이션이 특정 IP 주소에 허용하는 분당 잘못된 요청 수의 임계값을 설정할 수 있습니다. 잘못된 요청은 CloudFront 오리진이 다음 HTTP 40x 상태 코드 중 하나를 반환하는 요청입니다.

  • 400, 잘못된 요청

  • 403, 사용할 수 없음

  • 404, 찾을 수 없음

  • 405, 메서드 허용 안 함

사용자(IP 주소 기준)가 이 오류 코드 임계값을 초과할 경우 Lambda는 IP 주소를 차단하도록 AWS WAF 규칙을 자동으로 업데이트하고 해당 IP 주소의 요청이 차단되는 기간을 지정합니다.

이 자습서에서는 AWS CloudFormation 템플릿을 사용하여 요청 임계값과 요청을 차단할 시간을 지정하는 방법을 보여 줍니다. 또한 이 자습서에서는 CloudFront 액세스 로그(Amazon S3에 저장됨)를 사용하여 CloudFrontAmazon CloudWatch 지표를 기준으로 서비스되는 요청을 계산합니다.

솔루션 개요

다음 그림에서는 AWS WAF를 AWS Lambda와 함께 사용하여 특정 IP 주소의 요청을 차단하는 방법을 보여 줍니다.


          솔루션 개요: 잘못된 요청을 제출하는 IP 주소 차단
  1. CloudFront는 웹 애플리케이션을 대신하여 요청을 수신할 때 요청에 대한 세부 정보가 포함되어 있는 Amazon S3 버킷에 액세스 로그를 전송합니다.

  2. 새로운 액세스 로그가 Amazon S3 버킷에 저장될 때마다 Lambda 함수가 트리거됩니다. Lambda 함수는 로크 파일을 구문 분석하고 400, 403, 404, 405 등의 오류 코드가 발생하는 요청을 찾습니다. 그런 다음 이 함수는 잘못된 요청 수를 계산하고 액세스 로그에 사용하는 Amazon S3 버킷의 current_outstanding_requesters.json에 결과를 임시로 저장합니다.

  3. Lambda 함수는 지정한 기간 동안 current_outstanding_requesters.json에 나열된 IP 주소를 차단하도록 AWS WAF 규칙을 업데이트합니다. 이 차단 기간이 만료된 후 AWS WAF는 해당 IP 주소가 애플리케이션에 다시 액세스할 수 있도록 허용하지만 해당 IP 주소의 요청을 계속 모니터링합니다.

  4. Lambda 함수는 분석된 요청 수 및 차단된 IP 주소와 같은 실행 지표를 CloudWatch에 게시합니다.

자습서를 진행하는 동안 구성하는 설정에 따라 AWS CloudFormation 템플릿은 AWS WAF에서 웹 ACL(웹 액세스 제어 목록)을 생성하고 IP 주소의 요청을 차단 및 모니터링하는 별도의 규칙 두 개를 생성합니다. 두 가지 규칙이 여기에서 정의됩니다.

  • 자동 차단 – 이 규칙은 분당 요청 수 제한을 초과하는 IP 주소를 추가합니다. 지정된 만료 기간 후 Lambda이 해당 IP 주소를 차단 목록에서 제거할 때까지 해당 IP 주소의 새로운 요청이 차단됩니다. 기본값은 4시간입니다.

  • 수동 차단 – 이 규칙은 IP 주소를 자동 차단 목록에 수동으로 추가합니다. IP 주소는 영구적으로 차단되며, 사용자가 차단 목록에서 제거하는 경우에만 웹 애플리케이션에 액세스할 수 있습니다. 이 목록을 사용하여 알려진 불량 IP 주소 또는 자동 차단 규칙에 자주 추가되는 IP 주소를 차단할 수 있습니다.

요구 사항: 이 자습서에서는 웹 애플리케이션용 콘텐츠를 제공하는 데 사용하는 CloudFront 배포가 있다고 가정합니다. CloudFront 배포가 없는 경우 Amazon CloudFront 개발자 안내서CloudFront 콘솔을 사용하여 웹 배포 생성 또는 업데이트 단원을 참조하십시오. 이 자습서에서는 AWS CloudFormation을 사용하여 프로비저닝 프로세스를 간소화합니다. 자세한 내용은 AWS CloudFormation 사용 설명서 단원을 참조하십시오.

예상 시간: CloudFront 배포가 이미 있는 경우 15분 또는 CloudFront 배포를 생성해야 하는 경우 30분입니다.

추정 비용:

  • AWS WAF

    • 웹 ACL당 매월 5.00 USD(자습서에서는 웹 ACL 하나를 생성함)

    • 규칙당 매월 1.00 USD(x2, 이 자습서의 경우 AWS CloudFormation에서 두 개의 규칙을 생성하기 때문)

    • 호출 1백만 건당 0.60 USD

  • AWS Lambda – 각각의 새 CloudFront 액세스 로그는 새 요청을 나타내며 이 자습서에서 생성되는 Lambda 함수를 트리거합니다. Lambda 요금에는 다음이 포함됩니다.

    • 요청 – 처음 백만 건의 요청은 무료이며 이후 Lambda은 요청 백만 건당 0.20 USD를 청구합니다. CloudFront는 한 시간에 수 차례까지 배포에 대한 액세스 로그를 전송합니다.

    • 초당 사용된 메모리 – 초당 사용한 메모리의 GB당 0.00001667 USD

  • Amazon S3 – Amazon S3는 CloudFront 액세스 로그 저장에 대한 요금을 청구합니다. 로그의 크기 따라서 저장 요금은 CloudFront에서 객체에 대해 수신하는 요청의 수에 따라 다릅니다. 자세한 내용은 Amazon S3 요금을 참조하십시오.

  • CloudFront – 이 솔루션에 대해서는 추가 CloudFront 요금이 발생하지 않습니다. 자세한 내용은 Amazon CloudFront 요금을 참조하십시오.

1단계: 잘못된 요청을 제출하는 IP 주소를 차단하기 위한 AWS CloudFormation 스택 생성

다음 절차에서는 AWS CloudFormation 템플릿을 사용하여 Lambda, CloudFront, Amazon S3, AWS WAF 및 CloudWatch에 필요한 AWS 리소스를 시작하는 스택을 생성합니다.

중요

이 솔루션을 배포하는 AWS CloudFormation 스택을 생성하면 다른 서비스에 대한 요금이 발생하기 시작합니다. 요금은 AWS CloudFormation 스택을 삭제할 때까지 계속 누적됩니다. 자세한 내용은 5단계: (선택 사항) AWS CloudFormation 스택 삭제 단원을 참조하십시오.

잘못된 요청을 제출하는 IP 주소를 차단하기 위한 AWS CloudFormation 스택을 생성하려면

  1. AWS CloudFormation 스택을 생성하는 프로세스를 시작하려면 AWS 리소스를 생성하려는 리전에 대한 링크를 선택합니다.

  2. AWS Management 콘솔에 아직 로그인하지 않았다면 메시지가 표시될 때 로그인합니다.

  3. 템플릿 선택 페이지의 Specify an Amazon S3 template URL( 템플릿 URL 지정)에 선택한 URL이 자동으로 표시됩니다. [Next]를 선택합니다.

  4. [Specify Details] 페이지에서 다음 값을 지정합니다.

    [Stack Name ]

    기본 이름(BadBehavingIP)을 사용할 수도 있고 이름을 변경할 수도 있습니다. 스택 이름에는 공백이 포함될 수 없으며 AWS 계정 내에서 고유해야 합니다.

    CloudFront 액세스 로그 버킷 생성

    를 선택하여 CloudFront 액세스 로그에 대한 새 Amazon S3 버킷을 생성하거나, CloudFront 액세스 로그에 대한 Amazon S3 버킷이 이미 있는 경우 아니오를 선택합니다.

    CloudFront 액세스 로그 버킷 이름

    CloudFront에서 액세스 로그를 입력할 Amazon S3 버킷의 이름을 입력합니다. Create CloudFront Access Log Bucket( 액세스 로그 버킷 생성)에 대해 아니오를 선택한 경우 이 상자를 비워 둡니다.

    요청 임계값

    차단되지 않고 IP 주소에서 분당 수행할 수 있는 최대 요청 수를 입력합니다. 기본값은 400입니다.

    WAF 차단 기간

    임계값을 넘어선 후 IP 주소가 차단될 기간(분)을 지정합니다. 기본값은 240분(4시간)입니다.

  5. [Next]를 선택합니다.

  6. (선택 사항) [Options] 페이지에서 태그와 고급 설정을 입력하거나 입력란을 공백으로 둡니다.

  7. [Next]를 선택합니다.

  8. [Review] 페이지에서 [I acknowledge] 확인란을 선택한 다음 [Create]를 선택합니다.

    생성을 선택하면 AWS CloudFormation은 솔루션을 실행하는 데 필요한 AWS 리소스를 생성합니다.

    • Lambda 함수

    • 필요한 규칙이 구성되어 있는 AWS WAF 웹 ACL(Malicious Requesters로 명명됨)

    • CloudWatch 사용자 정의 지표

    • Create CloudFront Access Log Bucket(CloudFront 액세스 로그 버킷 생성)에 대해 를 선택한 경우, 6단계에서 CloudFront Access Log Bucket Name(CloudFront 액세스 로그 버킷 이름) 필드에 지정한 이름의 Amazon S3 버킷

2단계: CloudFront 배포와 웹 ACL 연결

AWS CloudFormation에서 스택을 생성한 후 CloudFront 배포를 연결하여 AWS WAF를 활성화하고 Amazon S3 버킷을 업데이트하여 이벤트 알림을 활성화해야 합니다.

참고

이미 AWS WAF를 사용하여 CloudFront 요청을 모니터링하고 있고 모니터링하는 배포에 대해 로깅이 이미 활성화되어 있는 경우 첫 번째 절차를 건너뛸 수 있습니다.

참고

웹 ACL 한 개를 원하는 개수 만큼의 배포와 연결할 수 있지만, 특정 배포에는 웹 ACL 한 개만 연결할 수 있습니다.

웹 ACL을 CloudFront 배포에 연결하려면

  1. AWS Management Console에 로그인한 다음 https://console.aws.amazon.com/wafv2/에서 AWS WAF 콘솔을 엽니다.

  2. Go to AWS WAF(AWS WAF로 이동)를 선택합니다.

  3. 탐색 창에서 [Web ACLs]를 선택합니다.

  4. CloudFront 배포와 연결할 웹 ACL을 선택합니다.

  5. [Rules] 탭의 [AWS resources using this web ACL]에서 [Add association]을 선택합니다.

  6. 메시지가 표시되면 Resource(리소스) 목록을 사용하여 이 웹 ACL을 연결할 배포를 선택합니다.

  7. 추가를 선택합니다.

  8. 이 웹 ACL을 추가 CloudFront 배포와 연결하려면 4~6단계를 반복합니다.

CloudFront 액세스 로그에 대한 Amazon S3 버킷이 이미 있는 경우(이전 절차의 [Create CloudFront Access Log Bucket]에서 [no]를 선택한 경우), Amazon S3 이벤트 알림 기능을 활성화하여 새 로그 파일이 버킷에 추가되면 Lambda 함수가 트리거되도록 합니다. 자세한 내용은 Amazon Simple Storage Service 콘솔 사용 설명서이벤트 알림 활성화를 참조하십시오.

참고

AWS CloudFormation이 버킷을 생성하도록 선택한 경우, AWS CloudFormation에서는 버킷에 대한 이벤트 알림도 활성화되어 있습니다.

Amazon S3 이벤트 알림을 활성화하려면

  1. https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. CloudFront 액세스 로그에 사용할 버킷을 선택합니다.

  3. [Properties]를 선택한 후 [Events]를 펼칩니다.

  4. 다음 값을 지정합니다.

    이름

    [LambdaNotificationsForWAFBadRequests]와 같은 이벤트 이름을 입력합니다. 이름에는 공백이 있어서는 안 됩니다.

    이벤트

    [ObjectCreated (All)]를 선택합니다.

    접두사

    이 필드는 비워둡니다.

    접미사

    [gz]를 입력합니다.

    전송 대상

    [Lambda function]을 선택합니다.

    Lambda 함수

    [BadBehavingIP]를 선택하거나 AWS CloudFormation 스택에 지정한 이름을 선택합니다.

  5. Save를 선택합니다.

3단계: (선택 사항) AWS CloudFormation 파라미터 값 편집

AWS CloudFormation 스택을 생성한 후 파라미터를 변경하려는—경우(예: 임계값 또는 IP 차단—기간을 변경하려는 경우) AWS CloudFormation 스택을 업데이트할 수 있습니다.

AWS CloudFormation 파라미터 값을 편집하려면

  1. https://console.aws.amazon.com/cloudformation에서 AWS CloudFormation 콘솔을 엽니다.

  2. 스택 목록에서 업데이트할 실행 중인 스택을 선택합니다. 스택을 생성할 때 기본값을 그대로 사용한 경우 이 스택은 [BadBehavingIP]입니다.

  3. [Actions]를 선택한 다음 [Update Stack]을 선택합니다.

  4. [Select Template] 페이지에서 [Use current template]을 선택한 다음 [Next]를 선택합니다.

  5. [Specify Details] 페이지에서 [Error Code Blacklisting Parameters]의 값을 적절히 변경합니다.

    요청 임계값

    차단되지 않고 분당 수행할 수 있는 최대 새 요청 수를 입력합니다.

    WAF 차단 기간

    IP 주소의 요청 수가 Request Threshold(요청 임계값)의 값을 초과한 후 AWS WAF에서 IP 주소를 차단할 기간(분)의 새 값을 지정합니다.

  6. [Options] 페이지에서 [Next]를 선택합니다.

  7. [Review] 페이지에서 [I acknowledge] 확인란을 선택한 다음 [Update]를 선택합니다.

    AWS CloudFormation은 파라미터의 새 값을 반영하여 스택을 업데이트합니다.

4단계: (선택 사항) 임계값 및 IP 규칙 테스트

솔루션을 테스트하려면 CloudFront에서 새로운 액세스 로그 파일이 생성될 때까지 기다리거나 로그 파일을 수신하기 위해 지정한 Amazon S3 버킷으로 샘플 액세스 로그를 업데이트하여 이 프로세스를 시뮬레이션할 수 있습니다.

임계값 및 IP 규칙을 테스트하려면

  1. AWS 웹 사이트에서 샘플 CloudFront 액세스 로그 파일을 다운로드합니다.

  2. https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  3. 이 자습서에서 CloudFront 액세스 로그에 사용하고 있는 Amazon S3 버킷을 선택합니다.

  4. Upload를 선택합니다.

  5. [Add Files]를 선택하고 샘플 액세스 로그 파일을 선택한 다음 [Start Upload]를 선택합니다.

업로드가 끝난 후 다음 절차를 수행하여 IP 주소가 AWS WAF Auto Block(자동 차단) 규칙에 자동으로 입력되었는지 확인합니다. Lambda가 로그 파일을 처리하고 규칙을 업데이트하려면 몇 초 정도 걸립니다.

[Auto Block] 규칙에서 IP 주소를 검토하려면

  1. https://console.aws.amazon.com/wafv2/에서 AWS WAF 콘솔을 엽니다.

  2. 탐색 창에서 [Rules]를 선택합니다.

  3. [Auto Block] 규칙을 선택합니다.

  4. [Auto Block] 규칙에 IP 주소를 포함한 IP 일치 조건이 포함되어 있는지 확인합니다.

5단계: (선택 사항) AWS CloudFormation 스택 삭제

잘못된 요청을 제출하는 IP 주소 차단을 중지하려는 경우 1단계: 잘못된 요청을 제출하는 IP 주소를 차단하기 위한 AWS CloudFormation 스택 생성에서 생성한 AWS CloudFormation 스택을 삭제합니다. 이렇게 하면 AWS CloudFormation에서 생성한 AWS 리소스가 삭제되고 해당 리소스에 대한 AWS 요금 청구가 중단됩니다.

AWS CloudFormation 스택을 삭제하려면

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/cloudformation에서 AWS CloudFormation 콘솔을 엽니다.

  2. 스택에 대한 확인란을 선택합니다. 기본 이름은 BadBehavingIP입니다.

  3. [Delete Stack]을 선택합니다.

  4. 확인하려면 [Yes, Delete]를 선택합니다.

  5. 스택 삭제 진행률을 추적하려면 스택에 대한 확인란을 선택한 다음 하단 창에서 [Events] 탭을 클릭합니다.

관련 리소스

Lambda 함수, AWS CloudFormation 템플릿 및 SDK 사용 예를 포함한 AWS WAF 샘플은 https://github.com/awslabs/aws-waf-sample의 GitHub를 참조하십시오.