Quali sono le opzioni disponibili per analizzare i log di AWS WAF archiviati in CloudWatch o Amazon S3?

Ultimo aggiornamento: 11/07/2022

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

  1. Apri la console Amazon CloudWatch.
  2. Nel pannello di navigazione, scegli Logs (Log), quindi scegli Log Insights (Approfondimenti sui log).
  3. 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.
  4. (Facoltativo) Scegli un intervallo di tempo per il periodo in cui desideri eseguire la query.
  5. Utilizza la sintassi della query per progettare le query.
  6. 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.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?