Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
CloudWatch에서 AWS WAF 로그를 분석하려면 어떻게 해야 합니까?
Amazon CloudWatch에 저장한 AWS WAF 로그를 분석하고 필터링하고 싶습니다.
해결 방법
CloudWatch에서 특정 AWS WAF 로그 요청을 분석 및 필터링하려면 CloudWatch Logs Insights 또는 CloudWatch 쿼리 생성기를 사용하십시오.
CloudWatch Logs Insights
CloudWatch 콘솔 내 또는 AWS WAF의 로그 인사이트에서 CloudWatch Logs Insights를 사용할 수 있습니다.
AWS WAF
다음 단계를 완료하십시오.
- AWS WAF 콘솔을 엽니다.
- 탐색 창에서 AWS WAF를 선택합니다.
- 리소스 및 보호 팩을 선택합니다.
- 보호 팩을 선택합니다.
- 대시보드 보기를 선택합니다.
- 페이지 하단에서 로그 탐색기를 확장합니다.
- CloudWatch에서 보기를 선택합니다.
- 쿼리 편집기에 쿼리를 입력합니다. 쿼리 구문을 사용하여 쿼리를 만듭니다. 가장 자주 사용하는 쿼리 목록에서 쿼리를 선택할 수도 있습니다.
- 쿼리 실행을 선택합니다.
CloudWatch
다음 단계를 완료하십시오.
- CloudWatch 콘솔을 엽니다.
- 탐색 창에서 로그를 선택합니다.
- Log Insights를 선택합니다.
- Log Insights에서 선택 기준 드롭다운을 엽니다.
- 쿼리할 로그 그룹을 하나 이상 선택합니다. 또는 로그 그룹 찾아보기를 선택한 다음, 로그 그룹을 선택합니다.
- (선택 사항) 쿼리의 시간 범위를 선택합니다.
- 쿼리 구문을 사용하여 쿼리를 만듭니다.
- 결과를 보려면 쿼리 실행을 선택합니다.
CloudWatch 쿼리 생성기
생성형 AI를 사용하여 액세스 로그를 분석하려면 CloudWatch에서 쿼리 생성기를 실행하십시오.
데이터 검색을 위한 예제 쿼리
CloudWatch Logs Insights로 특정 정보를 필터링하려면 다음 예제 쿼리를 사용하십시오.
Top client IPs(상위 클라이언트 IP)
로그에 액세스하는 상위 클라이언트 IP를 계산하려면 다음 쿼리를 실행하십시오.
fields httpRequest.clientIp| stats count(*) as requestCount by httpRequest.clientIp | sort requestCount desc
Top countries(상위 국가)
로그에 액세스하는 상위 국가를 계산하려면 다음 쿼리를 실행하십시오.
stats count(*) as RequestCount by httpRequest.country as Country| sort RequestCount desc
Top hosts(상위 호스트)
로그에 액세스하는 상위 호스트를 계산하려면 다음 쿼리를 실행하십시오.
parse @message /\{"name":"[Hh]ost\",\"value":\"(?[^"}]*)/|stats count(*) as RequestCount by Host | sort RequestCount desc
Top methods(주요 방법)
로그에 액세스하는 상위 방법을 계산하려면 다음 쿼리를 실행하십시오.
stats count(*)as RequestCount by httpRequest.httpMethod as Method| sort RequestCount desc
Top user agents(상위 사용자 에이전트)
로그에 액세스하는 상위 사용자 에이전트를 계산하려면 다음 쿼리를 실행하십시오.
parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}]*)/| stats count(*) as RequestCount by UserAgent | sort RequestCount desc
Top terminating rules(상위 종료 규칙)
로그에서 상위 종료 규칙을 계산하려면 다음 쿼리를 실행하십시오.
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":\"(?[^"}]*)/ | filter Host = "www.example.com"
참고: 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":\"(?[^"}])/ | parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}])/ | filter @message like "{jndi:ldap" | sort action, URI desc
참고: {jndi:ldap을 문자열로 바꾸십시오.
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":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}]*)/| parse @message /\{"name":"[Hh]ost\",\"value":\"(?[^"}]*)/ | filter httpRequest.httpMethod ="POST" | display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent | sort Rule, action desc
국가로 필터링
특정 국가에서 출발하지 않은 요청을 필터링하려면 다음 쿼리를 실행합니다.
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI| parse @message /\{"name":"[Hh]ost\",\"value":\"(?[^"}]*)/ | parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}]*)/ | 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 인젝션을 유발하는 패턴을 찾으려면 다음 쿼리를 실행하십시오.
fields @timestamp| parse @message ',"terminatingRuleMatchDetails":[*],' as terminatingRuleMatchData | filter (terminatingRuleMatchData like /XSS/ or terminatingRuleMatchData like /SQL/) | display @timestamp, httpRequest.clientIp, httpRequest.country, terminatingRuleMatchData, httpRequest.requestId
쿼리는 타임스탬프, 클라이언트 IP 주소, 출발 국가, 일치 세부 정보 및 요청 ID가 포함된 항목을 표시합니다.
규칙 그룹의 특정 규칙으로 카운트된 요청별 필터링
규칙 그룹의 특정 규칙이 기본적으로 카운트하고 종료하는 요청에 대한 로그 항목을 필터링하려면 다음 쿼리를 실행하십시오.
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개 요청을 필터링하려면 다음 쿼리를 실행하십시오.
fields @timestamp, httpRequest.clientIp, httpRequest.requestId, captchaResponse.failureReason, @message| filter captchaResponse.failureReason ='TOKEN_MISSING' | sort @timestamp desc | limit 100
참고: limit 절의 100을 필터링하려는 요청 수로 바꾸십시오.
이 쿼리는 요청 시간, IP 주소, 요청 ID, 응답 코드 및 전체 메시지를 보여줍니다.
관련 콘텐츠
- 질문됨 일 년 전
