Salta al contenuto

Come posso analizzare i log di AWS WAF in CloudWatch?

7 minuti di lettura
0

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:

  1. Apri la console AWS WAF.
  2. Nel pannello di navigazione, scegli Pacchetti di protezione (ACL web).
  3. Scegli il pacchetto di protezione.
  4. Scegli Visualizza dashboard, log e richieste di esempio.
  5. Per Esploratore di log, scegli Visualizza in CloudWatch.
  6. 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).
  7. Scegli Esegui query.

Console CloudWatch

Completa i seguenti passaggi:

  1. Apri la console CloudWatch.
  2. Nel pannello di navigazione, alla voce Log, scegli Logs Insights.
  3. 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.
  4. (Facoltativo) Scegli un intervallo di tempo per la query.
  5. Utilizza la sintassi delle query per progettare le query.
  6. 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'