Ir para o conteúdo

Como analiso os logs do AWS WAF no CloudWatch?

6 minuto de leitura
0

Quero analisar e filtrar meus logs do AWS WAF que eu armazeno no Amazon CloudWatch.

Resolução

Para analisar e filtrar solicitações de log AWS WAF específicas no CloudWatch, use o CloudWatch Logs Insights ou o gerador de consultas do CloudWatch.

CloudWatch Log Insights

É possível usar o CloudWatch Log Insights no console do CloudWatch ou no Log Insights no AWS WAF.

AWS WAF

Conclua as seguintes etapas:

  1. Abra o console do AWS WAF.
  2. No painel de navegação, escolha AWS WAF.
  3. Selecione Pacotes de recursos e proteção.
  4. Selecione seu Pacote de proteção.
  5. Escolha visualizar painel.
  6. Expanda o explorador de log na parte inferior da página.
  7. Escolha Exibir no CloudWatch.
  8. No Editor de consultas, insira sua consulta. Use a sintaxe de consulta para criar suas consultas. Outra opção é selecionar consultas na lista Consultas frequentes.
  9. Escolha Executar consulta.

CloudWatch

Conclua as seguintes etapas:

  1. Abra o console do CloudWatch.
  2. No painel de navegação, selecione Logs.
  3. Selecione Log Insights.
  4. Em Log Insights, abra a lista suspensa Critérios de seleção.
  5. Selecione um ou mais grupos de logs para consultar. Ou selecione Procurar grupos de logs e, em seguida, selecione seu grupo de logs.
  6. (Opcional) Escolha um intervalo de tempo para sua consulta.
  7. Use a sintaxe de consulta para criar suas consultas.
  8. Para ver os resultados, selecione Executar consulta.

Gerador de consultas CloudWatch

Para usar a IA generativa para analisar os logs de acesso, execute o gerador de consultas no CloudWatch.

Exemplos de consultas para pesquisar seus dados

Para filtrar informações específicas com os insights do CloudWatch Logs, use os seguintes exemplos de consultas.

Principais IPs de clientes

Para contar os principais IPs de clientes que acessam seus logs, execute a seguinte consulta:

fields httpRequest.clientIp| stats count(*) as requestCount by httpRequest.clientIp
| sort requestCount desc

Principais países

Para contar os principais países que acessam seus logs, execute a seguinte consulta:

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

Principais hosts

Para contar os principais hosts que acessam seus logs, execute a seguinte consulta:

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

Principais métodos

Para contar os principais métodos que acessam seus logs, execute a seguinte consulta:

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

Principais atendentes de usuários

Para contar os principais agentes de usuário que acessam seus logs, execute a seguinte consulta:

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

Principais regras de encerramento

Para contar as principais regras de encerramento em seus logs, execute a seguinte consulta:

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

Filtrar por solicitações bloqueadas

Para filtrar todas as solicitações bloqueadas e a regra de encerramento, caminho do URI e endereço IP do cliente, execute a seguinte consulta:

fields @timestamp, httpRequest.clientIp as ClientIP, httpRequest.uri as URI, terminatingRuleId as rule| filter action = "BLOCK"
| sort @timestamp desc

Filtrar por host

Para filtrar seus logs por um host específico, execute a seguinte consulta:

fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI| parse @message /\{"name":"[Hh]ost\",\"value":\"(?[^"}]*)/
| filter Host = "www.example.com"

Observação: substitua www.exemplo.com pelo nome do host.

Filtrar por uma string específica

Para filtrar seus logs por uma string específica, execute a seguinte consulta:

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":\"(?[^"}])/
| parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}])/
| filter @message like "{jndi:ldap"  
| sort action, URI desc

Observação: Substitua {jndi:ldap pela sua string.

Filtrar por solicitações POST

Para filtrar por solicitações POST, execute a seguinte consulta:

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\"\:\"(?[^"}]*)/| parse @message /\{"name":"[Hh]ost\",\"value":\"(?[^"}]*)/
| filter httpRequest.httpMethod ="POST"
| display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent
| sort Rule, action desc

Filtrar por país

Para filtrar solicitações que não são originárias de um país específico, execute a seguinte consulta:

fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI| parse @message /\{"name":"[Hh]ost\",\"value":\"(?[^"}]*)/
| parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?[^"}]*)/
| filter Country != "US"
| sort Country, action desc

Observação: substitua US pelo código do país que você deseja filtrar.

Filtrar solicitações bloqueadas por regras baseadas em taxas

Para filtrar seus logs que estão bloqueados por uma regra baseada em taxas, execute a seguinte consulta:

fields @timestamp, httpRequest.clientIp as ClientIP, httpRequest.uri as URI, terminatingRuleId as rule, httpRequest.country as Country| filter action = "BLOCK"
| filter terminatingRuleType = "RATE_BASED"
| sort @timestamp desc

Cross-Site Scripting (XSS) ou injeção de SQL

Para encontrar padrões que causam injeção de XSS ou SQL na regra de encerramento de regras personalizadas ou grupos de regras do AWS Managed Rules, execute a consulta a seguir:

fields @timestamp| parse @message ',"terminatingRuleMatchDetails":[*],' as terminatingRuleMatchData
| filter (terminatingRuleMatchData like /XSS/ or terminatingRuleMatchData like /SQL/)
| display @timestamp, httpRequest.clientIp, httpRequest.country, terminatingRuleMatchData, httpRequest.requestId

A consulta mostra entradas com um carimbo de data/hora, endereço IP do cliente, país de origem, detalhes da correspondência e o ID da solicitação.

Filtrar solicitações contabilizadas por uma regra específica em um grupo de regras

Para filtrar as entradas de log das solicitações que uma regra específica em um grupo de regras conta e encerra por padrão, execute a seguinte consulta:

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

Observação: substitua ruleId pelo ID da sua regra.

Filtrar por solicitações com um CAPTCHA que não é válido

Para filtrar as 100 principais solicitações com um CAPTCHA que não é válido, execute a seguinte consulta:

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

Observação: Substitua 100 na cláusula de limite pelo número de solicitações que você deseja filtrar.

Essa consulta mostra a hora da solicitação, o endereço IP, o ID da solicitação, o código de resposta e a mensagem inteira.