Quali sono le opzioni disponibili per analizzare i log di AWS WAF archiviati in CloudWatch o Amazon S3?
Sto archiviando i miei log AWS WAF in Amazon CloudWatch, Amazon Simple Storage Solution (Amazon S3) o Amazon S3 come destinazione per il flusso di distribuzione Amazon Kinesis Data Firehose. Quali sono le opzioni disponibili per analizzare i log di accesso di AWS WAF?
Risoluzione
Per analizzare e filtrare richieste di log specifiche, utilizza gli approfondimenti sui file di log Amazon CloudWatch per i log di CloudWatch o Amazon Athena per i log di Amazon S3.
Analisi dei log di accesso di AWS WAF con gli approfondimenti sui file di log Amazon CloudWatch
- Apri la console Amazon CloudWatch.
- Nel pannello di navigazione, scegli Logs (Log), quindi scegli Log Insights (Approfondimenti sui log).
- Per Select log group(s) (Seleziona gruppi di flussi di log), scegli uno o più gruppi di flussi di log costituiti da log di accesso di AWS WAF su cui eseguire query.
- (Facoltativo) Scegli un intervallo di tempo per il periodo in cui desideri eseguire la query.
- Utilizza la sintassi della query per progettare le query.
- Scegli Run (Esegui) per visualizzare i risultati per il gruppo di flussi di log.
Di seguito sono riportati esempi di query che è possibile utilizzare per filtrare informazioni specifiche per gli approfondimenti sui file di log Amazon CloudWatch:
Filtra per una stringa specifica
Esegui questa query per filtrare il log in base a una stringa specifica:
Nota: sostituisci la stringa {jndi:ldap. con la stringa che desideri cercare.
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
Filtra per host
Esegui questa query per filtrare in base all'host:
Nota: sostituisci il valore host www.example.com con l'host che desideri cercare.
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.uri as URI
Filtra per richieste POST
Esegui questa query per isolare le richieste POST:
parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<UserAgent>[^"}]*)/ | parse @message /\{"name":"[Hh]ost\",\"value":\"(?<Host>[^"}]*)/ | fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.httpMethod as Method, httpRequest.uri as URI, httpRequest.requestId as RequestID | filter httpRequest.httpMethod ="POST" | display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent, RequestID | sort Rule, action desc
Filtra per UserAgent
Esegui questa query per filtrare per UserAgent:
Nota: sostituisci User-Agent-Value con il tuo valore UserAgent**.**
parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<UserAgent>[^"}]*)/ | filter UserAgent like "<User-Agent-Value>" | fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI
Filtra le richieste che non provengono da un Paese specifico
Esegui questa query per filtrare le richieste che non provengono da un Paese specifico:
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
Filtra per scripting cross-site o iniezione SQL
Esegui questa query per filtrare in base allo scripting cross-site o all'iniezione SQL:
fields @timestamp, terminatingRuleId, action, httpRequest.clientIp as ClientIP, httpRequest.country as Country, terminatingRuleMatchDetails.0.conditionType as ConditionType, terminatingRuleMatchDetails.0.location as Location, terminatingRuleMatchDetails.0.matchedData.0 as MatchedData | filter ConditionType in["XSS","SQL_INJECTION"]
Serie temporali basate su una regola di terminazione
Esegui questa query per filtrare una serie temporale in base a una regola di terminazione:
#Time Series by Terminating Rule filter terminatingRuleId = "AWS-AWSManagedRulesCommonRuleSet" | stats count(*) as requestCount by bin(30m)
Riepiloga le richieste bloccate per ClientIP, Paese, URI e regola
Esegui questa query per riepilogare le richieste bloccate per ClientIP, Paese, URI e regola:
fields httpRequest.clientIp as ClientIP, httpRequest.country as Country, httpRequest.uri as URI, terminatingRuleId as Rule | filter action = "BLOCK" | stats count(*) as RequestCount by Country, ClientIP, URI, Rule | sort RequestCount desc
Principali IP client
Esegui questa query per conteggiare i principali IP client:
stats count(*) as RequestCount by httpRequest.clientIp as ClientIP | sort RequestCount desc
Principali Paesi
Esegui questa query per conteggiare i principali Paesi:
stats count(*) as RequestCount by httpRequest.country as Country | sort RequestCount desc
Principali host
Esegui questa query per conteggiare i principali host:
parse @message /\{"name":"[Hh]ost\",\"value":\"(?<Host>[^"}]*)/ | stats count(*) as RequestCount by Host | sort RequestCount desc
Principali metodi
Esegui questa query per conteggiare i principali metodi:
stats count(*)as RequestCount by httpRequest.httpMethod as Method | sort RequestCount desc
Principali regole di terminazione
Esegui questa query per conteggiare le principali regole di terminazione:
stats count(*) as RequestCount by terminatingRuleId | sort RequestCount desc
Principali UserAgent
Esegui questa query per conteggiare i principali UserAgent:
parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<UserAgent>[^"}]*)/ | stats count(*) as RequestCount by UserAgent | sort RequestCount desc
Richiesta non terminata da Default_Action o da regole con azione ALLOW
Esegui questa query per filtrare in base a richieste non terminate da Default_Action o da regole con un'azione ALLOW:
fields @timestamp, terminatingRuleId, action, @message | filter terminatingRuleId != 'Default_Action' and action != 'ALLOW' | sort @timestamp desc
Richiesta con token Captcha non valido
Esegui questa query per filtrare in base alle richieste con un token Captcha non valido:
fields @timestamp, httpRequest.clientIp, httpRequest.requestId, captchaResponse.failureReason, @message |filter captchaResponse.failureReason ='TOKEN_MISSING' | sort @timestamp desc
Richiesta bloccata da una regola basata sulla frequenza
Esegui questa query per filtrare in base alle richieste bloccate da una regola basata sulla frequenza:
fields @timestamp, httpRequest.clientIp, terminatingRuleId, httpRequest.country,@message | filter terminatingRuleType ="RATE_BASED" ## and webaclId = "arn:aws:wafv2:us-east-1:xxxxxxxx:regional/webacl/waf-test/abcdefghijkl" ## uncomment to filter for specific WebACL | sort requestCount desc
Filtra tutte le richieste rilevate da AWS Bot Control (ABC)
Esegui questa query per filtrare tutte le richieste rilevate da ABC:
fields @timestamp, @message |filter @message like 'awswaf:managed:aws:bot-control' | parse @message '"labels":[*]' as Labels | sort @timestamp desc
Analisi dei log di accesso di AWS WAF con Amazon Athena
Puoi attivare la registrazione degli accessi di AWS WAF direttamente su un bucket Amazon S3. In alternativa, puoi utilizzare il flusso di distribuzione di Amazon Kinesis Data Firehose per distribuire i tuoi log di accesso AWS WAF a un bucket Amazon S3. Per archiviare i log in Amazon S3, consulta la pagina How do I configure AWS WAF comprehensive logging to store logs in Amazon S3?
Quando i log di accesso si trovano nel bucket Amazon S3, crea la tabella AWS WAF per utilizzare Amazon Athena al fine di eseguire query sui log e filtrare vari dettagli.
Queste query sono esempi che è possibile utilizzare per eseguire query sui log di AWS WAF con Athena:
Informazioni sulle richieste bloccate con le regole di AWS WAF
Esegui questa query Athena per elencare tutte le richieste bloccate con la regola AWS WAF:
SELECT timestamp, action, httpsourcename, httpsourceid, httprequest.requestID, httprequest.clientip, webaclid, terminatingruleid, terminatingruletype, rulegrouplist, terminatingrulematchdetails FROM "wafv2"."waf_logs" WHERE ("action" LIKE 'BLOCK')
Richiedi l'agente utente
Esegui questa query Athena per richiedere l'agente utente:
Nota: sostituisci User-Agent con il tuo valore UserAgent.
select n.value, count(n.value) as count from waf_logs cross join unnest( cast( httprequest.headers as ARRAY(ROW(name VARCHAR, value VARCHAR)) ) ) as x(n) where n.name = 'User-Agent' group by n.value ORDER BY count(n.value) DESC
URI della richiesta
Esegui questa query Athena per controllare l'URI della richiesta:
SELECT "httprequest"."uri" , "count"(*) "count" FROM waf_logs WHERE ("action" LIKE 'BLOCK') GROUP BY "httprequest"."uri" ORDER BY "count" DESC
Conteggia le richieste bloccate in base a ClientIP
Esegui questa query Athena per visualizzare il conteggio delle richieste bloccate in base a ClientIP e Paese:
SELECT "httprequest"."clientip" , "count"(*) "count" , "httprequest"."country" FROM waf_logs WHERE ("action" LIKE 'BLOCK') GROUP BY "httprequest"."clientip", "httprequest"."country" ORDER BY "count" DESC
Visualizza il conteggio delle richieste
Esegui questa query Athena per visualizzare il conteggio delle richieste:
SELECT "httprequest"."clientip" , "count"(*) "count" ,"httprequest"."country" FROM waf_logs WHERE ("action" LIKE 'BLOCK') GROUP BY "httprequest"."clientip", "httprequest"."country" ORDER BY "count" DESC
Per ulteriori esempi di query Athena, consulta Esempio di query per i log di AWS WAF.

Contenuto pertinente
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata 6 mesi fa
- AWS UFFICIALEAggiornata un anno fa