Quais são minhas opções para analisar os logs do AWS WAF armazenados no CloudWatch ou no Amazon S3?

7 minuto de leitura
0

Estou armazenando meus logs do AWS WAF no Amazon CloudWatch ou no Amazon Simple Storage Solution (Amazon S3) como destino do meu stream de entrega do Amazon Kinesis Data Firehose. Que opções eu tenho para analisar meus logs de acesso do AWS WAF?

Resolução

Para analisar e filtrar solicitações de log específicas, use os Amazon CloudWatch Logs Insights para logs do CloudWatch ou o Amazon Athena para logs do Amazon S3.

Análisar os logs de acesso do AWS WAF com CloudWatch Logs Insights

  1. Abra o console do Amazon CloudWatch.
  2. No painel de navegação, escolha Logs e, em seguida, escolha Log Insights.
  3. Em Select log group(s) (Selecionar grupo(s) de logs), escolha um ou mais grupos de logs para consulta que consistem em logs de acesso do AWS WAF.
  4. (Opcional) Escolha um intervalo de tempo para o período que deseja consultar.
  5. Use a sintaxe de consulta para criar consultas.
  6. Escolha Run (Executar) para visualizar os resultados do grupo de logs.

Estes são exemplos de consultas que você pode usar para filtrar informações específicas do CloudWatch Logs Insights:

Filtrar por uma string específica

Execute esta consulta para filtrar o log com base em uma string específica:
Observação: substitua a string {jndi:ldap. pela string que deseja pesquisar.

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

Filtrar por host

Execute esta consulta para filtrar por host:
Observação: substitua o valor do host www.example.com pelo host que deseja pesquisar.

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

Filtrar por solicitações POST

Execute esta consulta para isolar todas as solicitações 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

Filtrar por UserAgent

Execute esta consulta para filtrar por UserAgent:
Observação: substitua User-Agent-Value pelo seu valor de 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

Solicitações de filtro não provenientes de um país

Execute esta consulta para filtrar solicitações que não são provenientes de um país específico:

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

Filtrar por script entre sites ou injeção de SQL

Execute esta consulta para filtrar scripts entre sites ou injeção de 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"]

Série temporal baseada em uma regra de encerramento

Execute esta consulta para filtrar uma série temporal com base em uma regra de encerramento:

#Time Series by Terminating Rule
filter terminatingRuleId = "AWS-AWSManagedRulesCommonRuleSet"
| stats count(*) as requestCount by bin(30m)

Resumir solicitações bloqueadas por ClientIP, país, URI e regra

Execute esta consulta para resumir solicitações bloqueadas por ClientIP, país, URI e regra:

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

Principais IPs de clientes

Execute esta consulta para contar os principais IPs de clientes:

stats count(*) as RequestCount by httpRequest.clientIp as ClientIP
| sort RequestCount desc

Principais países

Execute esta consulta para contar os principais países:

stats count(*) as RequestCount by httpRequest.country as Country
| sort RequestCount desc

Principais hosts

Execute esta consulta para contar os principais hosts:

parse @message /\{"name":"[Hh]ost\",\"value":\"(?<Host>[^"}]*)/
| stats count(*) as RequestCount by Host
| sort RequestCount desc

Principais métodos

Execute essa consulta para contar os principais métodos:

stats count(*)as RequestCount by httpRequest.httpMethod as Method
| sort RequestCount desc

Principais regras de encerramento

Execute esta consulta para contar as principais regras de encerramento:

stats count(*) as RequestCount by terminatingRuleId
| sort RequestCount desc

Principais UserAgents

Execute esta consulta para contar os principais UserAgents:

parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<UserAgent>[^"}]*)/
| stats count(*) as RequestCount by UserAgent
| sort RequestCount desc

Solicitação não encerrada por Default_Action ou regras com a ação ALLOW

Execute esta consulta para filtrar por solicitações não encerradas por uma Default_Action ou regras com uma ação ALLOW:

fields @timestamp, terminatingRuleId, action, @message
| filter terminatingRuleId != 'Default_Action' and action != 'ALLOW'
| sort @timestamp desc

Solicitação com token Captcha inválido

Execute esta consulta para filtrar por solicitações com um token Captcha inválido:

fields @timestamp, httpRequest.clientIp, httpRequest.requestId, captchaResponse.failureReason, @message
|filter captchaResponse.failureReason ='TOKEN_MISSING'
| sort @timestamp desc

Solicitação bloqueada por regra baseada em taxa

Execute esta consulta para filtrar por solicitações bloqueadas por uma regra baseada em taxa:

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

Filtrar todas as solicitações detectadas pelo AWS Bot Control (ABC)

Execute esta consulta para filtrar todas as solicitações detectadas pelo ABC:

fields @timestamp, @message
|filter @message like 'awswaf:managed:aws:bot-control'
| parse @message '"labels":[*]' as Labels
| sort @timestamp desc

Analisar os logs de acesso do AWS WAF com o Amazon Athena

Você pode ativar o registro em log de acesso do AWS WAF diretamente em um bucket do Amazon S3. Ou você pode usar o stream de entrega do Amazon Kinesis Data Firehose para entregar seus logs de acesso do AWS WAF a um bucket do Amazon S3. Para saber como armazenar logs no Amazon S3, consulte Como configuro o log abrangente do AWS WAF para armazenar logs no Amazon S3?

Quando seus logs de acesso estiverem no bucket do Amazon S3, crie a tabela do AWS WAF para usar o Amazon Athena para consultar logs e filtrar vários detalhes.

Essas consultas são exemplos que você pode usar para consultar logs do AWS WAF com o Athena:

Informações sobres solicitações bloqueadas com regras do AWS WAF

Execute esta consulta do Athena para listar todas as solicitações bloqueadas com regras do AWS WAF:

SELECT timestamp,
    action,
    httpsourcename,
    httpsourceid,
    httprequest.requestID,
    httprequest.clientip,
    webaclid,
    terminatingruleid,
    terminatingruletype,
    rulegrouplist,
    terminatingrulematchdetails
FROM "wafv2"."waf_logs"
WHERE ("action" LIKE 'BLOCK')

Solicitar agente do usuário

Execute esta consulta do Athena para solicitar o UserAgent:
Observação: substitua User-Agent por seu valor de 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 de solicitação

Execute esta consulta do Athena para verificar o URI da solicitação:

SELECT
"httprequest"."uri"
, "count"(*) "count"
FROM
  waf_logs
WHERE ("action" LIKE 'BLOCK')
GROUP BY "httprequest"."uri"
ORDER BY "count" DESC

Contar solicitações bloqueadas com base no ClientIP

Execute esta consulta do Athena para visualizar a contagem de solicitações bloqueadas com base no ClientIP e no país:

SELECT
  "httprequest"."clientip"
, "count"(*) "count"
, "httprequest"."country"
FROM
waf_logs
WHERE ("action" LIKE 'BLOCK')
GROUP BY "httprequest"."clientip", "httprequest"."country"
ORDER BY "count" DESC

Visualizar contagem de solicitações

Execute esta consulta do Athena para visualizar a contagem de solicitações:

SELECT 
  "httprequest"."clientip"
, "count"(*) "count"
,"httprequest"."country"
FROM
 waf_logs
WHERE ("action" LIKE
'BLOCK')
GROUP BY
"httprequest"."clientip", "httprequest"."country"
ORDER BY "count" DESC

Para obter exemplos adicionais de consulta do Athena, consulte Exemplos de consultas para logs do AWS WAF.


AWS OFICIAL
AWS OFICIALAtualizada há 2 anos