내용으로 건너뛰기

일반적인 공격으로부터 리소스를 보호하도록 AWS WAF를 구성하려면 어떻게 해야 합니까?

7분 분량
0

리소스에서 AWS WAF를 사용하여 일반적인 공격으로부터 보호하고 싶습니다.

간략한 설명

리소스에서 AWS WAF를 사용하여 일반적인 공격으로부터 보호하려면 다음 작업 중 하나 이상을 수행하십시오.

  • AWS WAF 클래식에서 AWS WAF로 마이그레이션합니다.
  • 리소스를 AWS WAF의 웹 액세스 제어 목록(웹 ACL)에 연결합니다.
  • 들어오는 요청을 검토하여 규칙을 최적화합니다.
  • 일반적인 공격으로부터 보호할 수 있도록 AWS 관리형 규칙을 사용합니다.
  • 정상적 요청 비율을 사용하여 AWS WAF의 기준을 지정합니다.
  • AWS WAF의 보안 자동화를 사용하여 일반적인 공격을 방지합니다.
  • SQL 인젝션 및 크로스 사이트 스크립팅(XSS) 공격 규칙 문을 사용합니다.
  • Amazon CloudFront에서 액세스를 제한합니다.
  • 분산 서비스 거부(DDoS) 공격으로부터 보호합니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

AWS WAF 클래식에서 AWS WAF로 마이그레이션

AWS WAF 클래식을 사용하는 경우 AWS WAF로 마이그레이션하는 것이 가장 좋습니다. 자세한 내용은 AWS WAF로 마이그레이션하는 이유는 무엇입니까?를 참조하십시오.

리소스를 웹 ACL에 연결

먼저 AWS WAF에서 웹 ACL을 만듭니다. 그런 다음, AWS WAF가 들어오는 요청을 모니터링할 수 있도록 리소스를 해당 웹 ACL에 연결합니다. 리소스를 AWS WAF와 직접 통합할 수 없는 경우 다음 대안을 검토하십시오. 자세한 내용은 AWS WAF로 보호할 수 있는 리소스를 참조하십시오.

AWS WAF와 통합할 수 있는 리소스

AWS WAF와 통합할 수 있는 리소스의 경우 다음 옵션 중 하나를 사용하여 리소스를 통합하십시오.

AWS WAF와 통합할 수 없는 리소스

AWS WAF와 직접 통합할 수 없는 리소스의 경우 다음 옵션 중 하나를 사용하여 리소스를 통합하십시오.

들어오는 요청을 검토하여 규칙 최적화

리소스를 보호하려면 Application Load Balancer 또는 CloudFront 액세스 로그와 같은 애플리케이션 로그를 사용하여 일반적인 요청 패턴을 확인하십시오.

참고: AWS WAF 로그를 사용하여 HTTP 요청 로그를 저장, 쿼리 및 분석하는 것이 가장 좋습니다.

일반적인 요청 패턴을 확인한 후 Amazon Simple Storage Service(Amazon S3) 또는 Amazon CloudWatch에 로그를 저장합니다. 로그를 쿼리하고 패턴을 식별하려면 Amazon Athena 또는 CloudWatch Logs Insights를 사용하십시오.

마지막으로, 들어오는 요청을 확인하는 카운트 모드에서 AWS WAF 규칙을 생성한 다음, 규칙을 차단으로 설정합니다.

  1. example.com의 호스트 헤더에 NOT 규칙 문을 만듭니다.
    참고: example.com을 호스트 헤더로 바꾸십시오.
  2. 작업차단으로 설정합니다. AWS WAF는 지정한 호스트 헤더가 없는 요청을 차단합니다.

참고: 또한 이 규칙은 AWS에서 제공한 FQDN(완전히 정규화된 도메인 이름)에 대한 요청을 차단합니다.

다음 예는 발생할 수 있는 일반적인 요청 패턴입니다.

존재하지 않는 URI에 대한 요청

이 패턴을 인식하려면 사용자 환경에서 지원되는 모든 URI를 알아야 합니다. 다음은 각 URI에 대한 요청을 계산하는 AWS WAF 로그의 Athena 쿼리 예제입니다.

SELECT COUNT("httprequest"."uri") AS URIcount, "httprequest"."uri"
  FROM waf_logs
 GROUP BY "httprequest"."uri"
 ORDER BY URIcount DESC

다음은 각 URI에 대한 요청을 계산하는 AWS WAF 로그의 CloudWatch 쿼리 예제입니다.

fields httpRequest.uri
| stats count(*) as requestCount by httpRequest.uri
| sort requestCount desc

다른 호스트 헤더 값을 포함하는 요청

이 패턴에는 웹 서버가 지원하지 않는 HTTP 호스트 헤더가 있는 요청이 포함됩니다. 이 패턴에는 웹 사이트의 도메인 이름 대신 IP 주소가 있는 요청도 포함됩니다.

다음은 호스트 헤더 값이 다른 요청을 계산하는 AWS WAF 로그의 Athena 쿼리 예제입니다.

SELECT header.value as HostHeader, count(header) as count
  FROM waf_logs, UNNEST(httprequest.headers) AS x(header)
 WHERE "header"."name" = 'Host'
 GROUP BY  header
 ORDER BY count DESC

다음은 호스트 헤더 값이 다른 요청을 계산하는 AWS WAF 로그의 CloudWatch 쿼리 예제입니다.

fields @timestamp, @message
| parse @message '{"name":"Host","value":"*"}' as host
| stats count(*) as requestCount by host
| sort requestCount desc

일반적인 공격으로부터 보호할 수 있도록 AWS 관리형 규칙 사용

AWS 관리형 규칙을 사용하려면 보호하려는 일반적인 요청 패턴과 공격을 식별하십시오. 그런 다음, 관련 AWS 관리형 규칙 그룹을 추가합니다. 특수 작업으로부터 보호하기 위해 추가 요금으로 다음 규칙 그룹을 사용할 수 있습니다.

카운트 모드에서 웹 ACL에 관련 규칙 그룹을 추가합니다. 그런 다음, AWS WAF 로그와 CloudWatch 지표를 검토하여 관리형 규칙이 합법적인 트래픽과 일치하는지 확인합니다. 규칙이 합법적인 트래픽과 일치하지 않는 경우 규칙 그룹의 카운트 모드 활성화를 비활성화하여 트래픽을 차단하십시오. AWS 관리형 규칙 그룹에서 특정 규칙을 비활성화하려면 해당 규칙의 규칙 재정의 작업을 선택합니다.

참고: 사용자 환경에 정상적 요청이 수신되면 AWS 관리형 규칙이 시작될 수 있습니다. 자세한 내용은 AWS WAF용 AWS 관리형 규칙의 동작을 사용자 지정하는 방법을 참조하십시오.

정상적 요청 비율을 사용하여 AWS WAF의 기준 지정

볼륨 공격으로부터 보호하려면 트래픽을 분석하여 정상적 클라이언트 IP 주소에서 전송된 요청 수를 파악하십시오. 트래픽을 분석하려면 AWS WAF 로그에서 CloudWatch Logs Insights, Athena 쿼리 또는 Amazon Quick Sight를 사용하십시오. 분석 정보를 사용하여 AWS WAF의 기준을 지정합니다. 그런 다음, 속도 기반 규칙 문을 구성하여 요청 임계값을 설정합니다.

다음은 특정 기간 내에 단일 IP 주소에서 발생한 요청을 계산하는 AWS WAF 로그의 Athena 쿼리 예제입니다.

SELECT  "httprequest"."clientip", "count"(*) "count", "httprequest"."country"
  FROM waf_logs
 WHERE httprequest.clientip LIKE '10.0.0.0' and date_format(from_unixtime("timestamp"/1000), '%Y-%m-%d %h:%i:%s') between '2020-11-16 09:00:00' and '2020-11-16 10:00:00'
 GROUP BY "httprequest"."clientip", "httprequest"."country"

참고: 10.0.0.0을 IP 주소로 바꾸고, 2020-11-16 09:00:002020-11-16 10:00:00을 해당 시간대로 바꾸십시오.

다음은 단일 IP 주소에서 발생한 요청을 계산하는 AWS WAF 로그의 CloudWatch Insights 쿼리 예제입니다.

fields httpRequest.clientIp, httpRequest.country
| stats count(*) as requestCount by httpRequest.clientIp, httpRequest.country
| filter httpRequest.clientIp = "10.0.0.0"

참고: 10.0.0.0을 IP 주소로 바꾸십시오.

다음은 특정 기간 내에 IP 주소에서 발생한 모든 요청을 계산하는 AWS WAF 로그의 Athena 쿼리 예제입니다.

SELECT "httprequest"."clientip", "count"(*) "count", "httprequest"."country"
  FROM waf_logs
 WHERE date_format(from_unixtime("timestamp"/1000), '%Y-%m-%d %h:%i:%s') BETWEEN '2020-11-16 09:00:00' AND '2020-11-16 10:00:00'
 GROUP BY "httprequest"."clientip", "httprequest"."country"
 ORDER BY "count" DESC

참고: 2020-11-16 09:00:002020-11-16 10:00:00을 해당 시간대로 바꾸십시오.

다음은 특정 기간 내에 IP 주소에서 발생한 요청을 계산하는 AWS WAF 로그의 CloudWatch Insights 쿼리 예제입니다.

fields httpRequest.clientIp, httpRequest.country
| stats count(*) as requestCount by httpRequest.clientIp, httpRequest.country
| sort requestCount desc

AWS WAF의 보안 자동화를 사용하여 일반적인 공격 방지

일반적인 공격으로부터 추가 보호를 제공하기 위해 AWS WAF용 보안 자동화를 사용할 수 있습니다.

참고: 이 솔루션은 비용이 발생할 수 있는 다른 AWS 서비스를 사용합니다.

SQL 인젝션 및 XSS 공격 규칙 문 사용

SQL 인젝션 및 XSS 공격으로부터 애플리케이션을 보호하려면 SQL 인젝션XSS에 대한 기본 제공 공격 규칙 문을 사용하십시오. 공격은 HTTP 헤더, 쿼리 문자열 또는 URI와 같은 HTTP 요청의 여러 부분에서 발생할 수 있습니다. 공격 규칙 문과 비교하여 HTTP 요청의 여러 부분을 검사하도록 AWS WAF 규칙을 구성합니다.

참고: 사용자 환경에 정상적 요청이 수신되면 공격 규칙 문이 시작될 수 있습니다. 자세한 내용은 AWS 관리형 규칙으로 인한 오탐지를 감지하려면 어떻게 해야 합니까?를 참조하십시오.

CloudFront에서 액세스 제한

CloudFront IP 주소를 기반으로 액세스를 제한할 수 있습니다. 그런 다음, CloudFront에서 오리진 요청에 대한 사용자 지정 헤더를 추가합니다. 오리진에서는 사용자 지정 헤더와 값이 있는 경우에만 액세스를 허용합니다. 오리진이 Application Load Balancer 또는 API Gateway인 경우 오리진에서 AWS WAF를 사용하십시오. 이 작업을 수행하면 사용자 지정 헤더와 값을 포함한 요청이 허용됩니다.

DDoS 공격으로부터 보호

DDoS 공격으로부터 보호하려면 DDoS 복원력에 대한 AWS 모범 사례AWS Shield 기능을 참조하십시오.

관련 정보

공동 책임 모델

AWS WAF에서 오탐지 관리