Come posso analizzare i log di AWS WAF in CloudWatch?
Desidero analizzare e filtrare i miei log di AWS WAF che memorizzo in Amazon CloudWatch.
Risoluzione
Per analizzare e filtrare richieste di log specifiche in CloudWatch, utilizza CloudWatch Logs Insights o il generatore di query di CloudWatch.
CloudWatch Log Insights
Puoi utilizzare CloudWatch Log Insights dalla console CloudWatch o dalla console AWS WAF.
Console AWS WAF
Completa i seguenti passaggi:
- Apri la console AWS WAF.
- Nel pannello di navigazione, scegli Pacchetti di protezione (ACL web).
- Scegli il pacchetto di protezione.
- Scegli Visualizza dashboard, log e richieste di esempio.
- Per Esploratore di log, scegli Visualizza in CloudWatch.
- In Editor di query, inserisci la query. Utilizza la sintassi delle query per progettare le query. Puoi anche scegliere query dall'elenco Most frequently used queries (Query utilizzate più spesso).
- Scegli Esegui query.
Console CloudWatch
Completa i seguenti passaggi:
- Apri la console CloudWatch.
- Nel pannello di navigazione, alla voce Log, scegli Logs Insights.
- Per Selection criteria (Criteri di selezione), seleziona uno o più gruppi di log su cui eseguire query. In alternativa, vai su Scegli i gruppi di log e seleziona i gruppi di log.
- (Facoltativo) Scegli un intervallo di tempo per la query.
- Utilizza la sintassi delle query per progettare le query.
- Per visualizzare i risultati, scegli Esegui una query.
Utilizza il generatore di query di CloudWatch
Per generare le query e analizzare i log degli accessi utilizzando il linguaggio naturale, esegui il generatore di query di CloudWatch.
Esempio di query
Per filtrare informazioni specifiche con CloudWatch Logs Insights, utilizza i seguenti esempi di query.
Principali indirizzi IP dei client
Per contare i principali indirizzi IP dei client che accedono all'applicazione, esegui questa query:
stats count(*) as requestCount by httpRequest.clientIp | sort requestCount desc
Principali Paesi
Per contare i principali Paesi di origine che inviano richieste all'applicazione, esegui questa query:
stats count(*) as RequestCount by httpRequest.country as Country | sort RequestCount desc
Principali metodi HTTP
Per contare i principali metodi HTTP (httpmethods) che accedono all'applicazione, esegui questa query:
stats count(*)as RequestCount by httpRequest.httpMethod as Method | sort RequestCount desc
Principali regole di terminazione
Per contare le principali regole di terminazione dei log, esegui questa query:
stats count(*) as RequestCount by terminatingRuleId | sort RequestCount desc
Principali host
Per contare i principali host che accedono all'applicazione, esegui questa query:
parse @message /\{"name":"[Hh]ost","value":"(?<Host>[^"]*)"/ | stats count(*) as RequestCount by Host | sort RequestCount desc
Principali agenti utente
Per contare i principali agenti utente che accedono all'applicazione, esegui questa query:
parse @message /\{"name":"[Uu]ser\-[Aa]gent","value":"(?<UserAgent>[^"]*)"/ | stats count(*) as RequestCount by UserAgent | sort RequestCount desc
Principali indirizzi IP XFF
Per contare i principali indirizzi IP XFF (X-forwarded-Ips) che inviano richieste all'applicazione, esegui questa query:
parse @message /\{"name":"[Xx]-[Ff]orwarded-[Ff]or","value":"(?<XFF_IP>[^"}]*)/ | stats count(*) as RequestCount by XFF | sort RequestCount desc
Principali indirizzi IP bloccati dalla regola basata sulla frequenza
Per trovare gli indirizzi IP che superano la soglia e in caso di DDoS HTTP Flood, esegui questa query:
fields httpRequest.clientIp | filter terminatingRuleType = "RATE_BASED" ## and webaclId = "<Webacl ARN>" ## uncomment to filter for specific WebACL| | stats count(*) as requestCount by httpRequest.clientIp, httpRequest.country | sort requestCount desc | limit 100
Filtra sulla base delle richieste bloccate
Per filtrare tutte le richieste bloccate con le regole di terminazione, i percorsi URI e gli indirizzi IP dei client corrispondenti, esegui questa query:
fields @timestamp, httpRequest.clientIp as ClientIP, httpRequest.uri as URI, terminatingRuleId as rule | filter action = "BLOCK" | sort @timestamp desc
Filtra sulla base dell'host
Per filtrare i log sulla base di un host specifico, esegui questa query:
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"
Nota: sostituisci www.example.com con il nome del tuo host.
Filtra sulla base di una stringa specifica
Per filtrare i log sulla base di una stringa specifica, esegui questa query:
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 "{jndi:ldap" | sort action, URI desc
Nota: sostituisci {jndi:ldap con la tua stringa.
Filtra sulla base delle richieste POST
Per filtrare le richieste POST, esegui questa query:
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":"(?<UserAgent>[^"]*)"/ | parse @message /\{"name":"[Hh]ost","value":"(?<Host>[^"]*)"/ | filter httpRequest.httpMethod ="POST" | display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent | sort Rule, action desc
NOTA: puoi utilizzare la query precedente per filtrare sulla base di altri metodi HTTP. Sostituisci POST con GET, Head o altri metodi HTTP.
Iniezione SQL o XSS
Per trovare modelli che causano cross-site scripting (XSS) o iniezione SQL nella regola di terminazione per una regola personalizzata o gruppi di regole gestiti da AWS, esegui questa query:
fields @timestamp | parse @message ',"terminatingRuleMatchDetails":[*],' as terminatingRuleMatchData | filter (terminatingRuleMatchData like /XSS/ or terminatingRuleMatchData like /SQL/) | display @timestamp, httpRequest.clientIp, httpRequest.country, terminatingRuleMatchData, httpRequest.requestId
La query mostra voci con timestamp, indirizzo IP del client, Paese di origine, dettagli sulla corrispondenza e ID della richiesta.
Filtra per Paese
Per escludere tramite filtro le richieste che non provengono da un Paese specifico, esegui questa query:
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI | parse @message /\{"name":"[Uu]ser\-[Aa]gent","value":"(?<UserAgent>[^"]*)"/ | parse @message /\{"name":"[Hh]ost","value":"(?<Host>[^"]*)"/ | filter Country != "US" | sort Country, action desc
Nota: sostituisci US con il prefisso internazionale che desideri escludere tramite filtro.
Filtra sulla base delle richieste identificate da una regola specifica di un gruppo di regole
Per filtrare le voci di log sulla base delle richieste identificate da una regola specifica di un gruppo di regole e terminate per impostazione predefinita, esegui questa query:
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
Nota: sostituisci ruleId con l'ID della tua regola.
Filtra sulla base delle richieste con un CAPTCHA non valido
Per filtrare le prime 100 richieste con un CAPTCHA non valido, esegui questa query:
fields @timestamp, httpRequest.clientIp, httpRequest.requestId, captchaResponse.failureReason, @message | filter captchaResponse.failureReason ='TOKEN_MISSING' | sort @timestamp desc| limit 100
Nota: sostituisci 100 nella clausola limit con il numero di richieste che desideri filtrare.
La query mostra il momento della richiesta, l'indirizzo IP, l'ID della richiesta, il codice di risposta e l'intero messaggio.
Filtra tutte le richieste rilevate dalle Regole gestite da AWS ABC, ATP, ACFP, AntiDDoS
Per filtrare le prime 100 richieste che corrispondono alle etichette delle Regole gestite da AWS ABC, ATP, ACFP o AntiDDoS, esegui questa query:
fields @timestamp | filter @message like 'awswaf:managed:aws:bot-control' | display @timestamp,httpRequest.clientIp, httpRequest.uri,Labels, @message | sort @timestamp desc | limit 100
Nota: sostituisci 100 nella clausola limit con il numero di richieste che desideri filtrare. Sostituisci awswaf:managed:aws:bot-control con l'etichetta del gruppo di regole.Per il gruppo di regole ATP, utilizza awswaf:managed:aws:atp. Per il gruppo di regole ACFP, utilizza awswaf:managed:aws:acfp. Per il gruppo di regole AntiDDOS AMR, utilizza awswaf:managed:aws:anti-ddos.
Per filtrare i log con un'etichetta specifica, includi la seguente riga nella query precedente:
| filter @message like 'awswaf:managed:aws:bot-control:signal:non_browser_user_agent'
- Lingua
- Italiano

Contenuto pertinente
AWS UFFICIALEAggiornata un anno fa