Como analiso os logs do AWS WAF no CloudWatch?

6 minuto de leitura
0

Eu armazeno meus logs do AWS WAF no Amazon CloudWatch. Quero analisar e filtrar esses logs.

Resolução

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

Use o CloudWatch Logs Insights para analisar os logs de acesso do AWS WAF

Você pode usar o CloudWatch Logs Insights no console do CloudWatch ou na guia CloudWatch Logs Insights no console do AWS WAF.

Do AWS WAF

Realize as etapas a seguir:

  1. Abra o console do AWS WAF.
  2. No painel de navegação, em AWS WAF, escolha ACLs Web.
  3. Em Região, selecione a região da AWS que contém a lista de controle de acesso à web (ACL da web).
    Observação: se sua ACL da web estiver configurada para o Amazon CloudFront, selecione Global.
  4. Selecione sua ACL da web.
  5. Nas guias na parte superior da página, navegue até o CloudWatch Logs Insights.
  6. 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.
  7. Escolha Executar consulta.
  8. Para ver os resultados, no painel de navegação, escolha Logs.

Do CloudWatch

Realize as etapas a seguir:

  1. Abra o console do CloudWatch.
  2. No painel de navegação, em Logs, selecione Logs Insights.
  3. Em Selecionar grupo(s) de logs, selecione um ou mais grupos de logs a serem consultados na lista. Ou escolha Procurar grupos de logs e, em seguida, selecione sua consulta.
  4. (Opcional) Escolha um intervalo de horário para o período que você deseja consultar.
  5. Use a sintaxe de consulta para criar suas consultas.
  6. Para ver os resultados, selecione Executar consulta.

Para filtrar informações específicas, use os seguintes exemplos de consultas:

Principais endereços IP de clientes

Para contar os principais endereços IP de clientes que fazem solicitações ao seu recurso protegido, 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 de onde as solicitações são enviadas para seu recurso protegido, execute a seguinte consulta:

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

Principais hosts

Para contar os cabeçalhos dos principais hosts que fazem solicitações ao seu recurso protegido, execute a seguinte consulta:

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

Principais métodos

Para contar os principais métodos HTTP usados para fazer solicitações ao seu recurso protegido, 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 atendentes de usuários que fazem solicitações ao seu recurso protegido, execute a seguinte consulta:

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

Principais caminhos de URI

Para listar os caminhos de URI mais visitados em seus recursos protegidos, execute a seguinte consulta:

fields httpRequest.uri
| stats count(*) as uriVisits by httpRequest.uri
| sort uriVisits desc
| limit 50

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 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 valor de cabeçalho de 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":\"(?Host[^\"]*)\"/
| filter Host = "www.example.com"

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

Filtrar para um atendente de usuário específico

Para filtrar seus logs por um atendente de usuário específico, 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\":\"(?Host[^\"]*)\"/
| parse @message /\"name\":\"[Uu]ser\-[Aa]gent\",\"value\":\"(?UserAgent[^\"]*)\"/
| filter @message like "Postman"
| display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent
| sort action, URI desc

Observação: substitua Postman pelo seu atendente de usuário.

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

Para filtrar solicitações bloqueadas por uma regra baseada em intervalos, 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 SQL ou XSS na regra de encerramento de uma regra personalizada ou grupo de regras do AWS Managed Rules, execute a consulta a seguir. A consulta retorna 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:

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

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

Para filtrar solicitações que são contabilizadas por uma regra específica em um grupo de regras e, em seguida, encerradas pela ação 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 o ID da regra.

Filtrar 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. Essa consulta retorna a hora em que a solicitação foi feita, o endereço IP, o ID da solicitação, o código de resposta e a mensagem inteira:

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

Observação: substitua 100 pelo número de solicitações que você deseja filtrar.

Usar o gerador de consultas do CloudWatch para analisar os logs de acesso do AWS WAF

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

AWS OFICIAL
AWS OFICIALAtualizada há 7 meses