CloudWatch에서 AWS WAF 로그를 분석하려면 어떻게 해야 합니까?

5분 분량
0

AWS WAF 로그를 Amazon CloudWatch에 저장합니다. 이 로그를 분석하고 필터링하고 싶습니다.

해결 방법

CloudWatch에서 특정 로그 요청을 분석 및 필터링하려면 CloudWatch Logs Insights 또는 CloudWatch 쿼리 생성기를 사용하십시오.

CloudWatch Logs Insights를 사용하여 AWS WAF 액세스 로그 분석

CloudWatch 콘솔 또는 AWS WAF 콘솔CloudWatch Logs Insights 탭에서 CloudWatch Logs Insights를 사용할 수 있습니다.

AWS WAF에서

다음 단계를 완료하십시오.

  1. AWS WAF 콘솔을 엽니다.
  2. 탐색 창의 AWS WAF에서 웹 ACL을 선택합니다.
  3. 리전에서 웹 액세스 제어 목록(웹 ACL)이 포함된 AWS 리전을 선택합니다.
    참고: 웹 ACL이 Amazon CloudFront용으로 설정되어 있는 경우 Global(전역)을 선택합니다.
  4. 웹 ACL을 선택합니다.
  5. 페이지 상단의 탭에서 CloudWatch Logs Insights로 이동합니다.
  6. 쿼리 편집기에 쿼리를 입력합니다. 쿼리 구문을 사용하여 쿼리를 만듭니다. Most frequently used queries(가장 자주 사용하는 쿼리) 목록에서 쿼리를 선택할 수도 있습니다.
  7. **Run query(쿼리 실행)**를 선택합니다.
  8. 결과를 보려면 탐색 창에서 **Logs(로그)**를 선택합니다.

CloudWatch에서

다음 단계를 완료하십시오.

  1. CloudWatch 콘솔을 엽니다.
  2. 탐색 창의 로그에서 Logs Insights를 선택합니다.
  3. 로그 그룹 선택에서 쿼리할 로그 그룹을 하나 이상 선택합니다. 또는 로그 그룹 찾아보기를 선택한 다음 쿼리를 선택합니다.
  4. (선택 사항) 쿼리하려는 기간의 시간 범위를 선택합니다.
  5. 쿼리 구문을 사용하여 쿼리를 만듭니다.
  6. 결과를 보려면 쿼리 실행을 선택합니다.

특정 정보를 필터링하려면 다음 예시 쿼리를 사용하십시오.

상위 클라이언트 IP 주소

보호된 리소스에 요청을 보내는 상위 클라이언트 IP 주소의 수를 계산하려면 다음 쿼리를 실행합니다.

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

상위 국가

보호된 리소스에 요청을 보내는 상위 국가의 수를 계산하려면 다음 쿼리를 실행합니다.

stats count(*) as RequestCount by httpRequest.country as Country
| sort RequestCount desc

상위 호스트

보호된 리소스에 요청을 보내는 상위 호스트 헤더의 수를 계산하려면 다음 쿼리를 실행합니다.

parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/
| stats count(*) as RequestCount by Host
| sort RequestCount desc

상위 방법

보호된 리소스에 요청을 보내는 데 사용된 상위 HTTP 메서드의 수를 계산하려면 다음 쿼리를 실행합니다.

stats count(*)as RequestCount by httpRequest.httpMethod as Method
| sort RequestCount desc

상위 사용자 에이전트

보호된 리소스에 요청을 보내는 상위 사용자 에이전트의 수를 계산하려면 다음 쿼리를 실행합니다.

parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/
| stats count(*) as RequestCount by UserAgent
| sort RequestCount desc

상위 URI 경로

보호된 리소스에서 가장 많이 방문한 URI 경로를 나열하려면 다음 쿼리를 실행합니다.

fields httpRequest.uri
| stats count(*) as uriVisits by httpRequest.uri
| sort uriVisits desc
| limit 50

상위 종료 규칙

로그에서 상위 종료 규칙을 계산하려면 다음 쿼리를 실행합니다.

stats count(*) as RequestCount by terminatingRuleId
| sort RequestCount desc

차단된 요청 필터링

차단된 모든 요청과 해당 종료 규칙, URI 경로 및 클라이언트 IP 주소를 필터링하려면 다음 쿼리를 실행합니다.

fields @timestamp, httpRequest.clientIp as ClientIP, httpRequest.uri as URI, terminatingRuleId as rule
| filter action = "BLOCK"
| sort @timestamp desc

호스트로 필터링

특정 호스트로 로그를 필터링하려면 다음 쿼리를 실행합니다.

fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI
| parse @message /\{"name":"[Hh]ost\",\"value":\"(?Host[^\"]*)\"/
| filter Host = "www.example.com"

참고: ** 호스트 이름으로 바꾸십시오.

특정 사용자 에이전트로 필터링

특정 사용자 에이전트로 로그를 필터링하려면 다음 쿼리를 실행합니다.

fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.httpMethod as Method,httpRequest.uri as URI
| parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/
| parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/
| filter @message like "Postman"
| display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent
| sort action, URI desc

참고: Postman을 사용자 에이전트로 교체하십시오.

POST 요청으로 필터링

POST 요청으로 필터링하려면 다음 쿼리를 실행합니다.

fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.httpMethod as Method, httpRequest.uri as URI
| parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/
| parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/
| filter httpRequest.httpMethod ="POST"
| display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent
| sort @timestamp desc

국가로 필터링

특정 국가에서 출발하지 않은 요청을 필터링하려면 다음 쿼리를 실행합니다.

fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI
| parse @message /\"name\":\"[Hh]ost\",\"value\":\"(?Host[^\"]*)\"/
| parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/
| filter Country != "US"
| sort Country, action desc

참고: US를 필터링하려는 국가 코드로 바꾸십시오.

속도 기반 규칙으로 차단된 요청 필터링

속도 기반 규칙으로 차단된 요청으로 필터링하려면 다음 쿼리를 실행합니다.

fields @timestamp, httpRequest.clientIp as ClientIP, httpRequest.uri as URI, terminatingRuleId as rule, httpRequest.country as Country
| filter action = "BLOCK"
| filter terminatingRuleType = "RATE_BASED"
| sort @timestamp desc

크로스 사이트 스크립팅(XSS) 또는 SQL 명령어 삽입

사용자 지정 규칙 또는 AWS 관리형 규칙 그룹의 종료 규칙에 대한 XSS 또는 SQL 인젝션을 발생시키는 패턴을 찾으려면 다음 쿼리를 실행합니다. 쿼리는 타임스탬프, 클라이언트 IP 주소, 출발 국가, 일치하는 세부 정보 및 요청 ID가 포함된 항목을 반환합니다.

fields @timestamp
| parse @message ',"terminatingRuleMatchDetails":[*],' as terminatingRuleMatchData
| filter (terminatingRuleMatchData like /XSS/ or terminatingRuleMatchData like /SQL/)
| display @timestamp, httpRequest.clientIp, httpRequest.country, terminatingRuleMatchData, httpRequest.requestId

규칙 그룹의 특정 규칙으로 카운트된 요청 필터링

규칙 그룹의 특정 규칙으로 카운트된 후 기본 작업으로 종료된 요청을 필터링하려면 다음 쿼리를 실행합니다.

fields @timestamp
| filter (@message like 'excludedRules":[{"exclusionType":"EXCLUDED_AS_COUNT","ruleId":"NoUserAgent_HEADER"}]}' and @message like 'terminatingRuleId":"Default_Action"')
| parse @message '"ruleId":*}]}' as ruleMatchDetails
| display @timestamp, httpRequest.clientIp, httpRequest.country, ruleMatchDetails, httpRequest.requestId

참고:****ruleId를 규칙 ID로 바꾸십시오.

유효하지 않은 CAPTCHA가 있는 요청 필터링

유효하지 않은 CAPTCHA가 포함된 상위 100개 요청을 필터링하려면 다음 쿼리를 실행하십시오. 이 쿼리는 요청이 이루어진 시간, IP 주소, 요청 ID, 응답 코드 및 전체 메시지를 반환합니다.

fields @timestamp, httpRequest.clientIp, httpRequest.requestId, captchaResponse.failureReason, @message
| filter captchaResponse.failureReason ='TOKEN_MISSING'
| sort @timestamp desc
| limit 100

참고:****100을 필터링하려는 요청의 숫자로 바꿉니다.

CloudWatch 쿼리 생성기를 사용하여 AWS WAF 액세스 로그 분석

생성형 AI를 사용하여 액세스 로그를 분석하려면 CloudWatch에서 쿼리 생성기를 실행합니다.

AWS 공식
AWS 공식업데이트됨 4달 전