Saltar al contenido

¿Cómo analizo los registros de AWS WAF en CloudWatch?

6 minutos de lectura
0

Quiero analizar y filtrar los registros de AWS WAF que almaceno en Amazon CloudWatch.

Resolución

Para analizar y filtrar solicitudes de registro específicas de AWS WAF en CloudWatch, utiliza Información de registros de CloudWatch o el generador de consultas de CloudWatch.

Información de registros de CloudWatch

Puedes usar Información de registros de CloudWatch desde la consola de CloudWatch o en Información de registros en AWS WAF.

AWS WAF

Sigue estos pasos:

  1. Abre la consola de AWS WAF.
  2. En el panel de navegación, selecciona AWS WAF.
  3. Elige Paquetes de protección y recursos.
  4. Selecciona tu paquete de protección.
  5. Elige Ver panel.
  6. Amplía el explorador de registros en la parte inferior de la página.
  7. Elige Ver en CloudWatch.
  8. En el editor de consultas, introduce la consulta. Utiliza la sintaxis de consulta para diseñar las consultas. También puedes seleccionar consultas de la lista Most frequently used queries (Consultas utilizadas con más frecuencia).
  9. Selecciona Ejecutar consulta.

CloudWatch

Sigue estos pasos:

  1. Abre la consola de CloudWatch.
  2. En el panel de navegación, elige Registros.
  3. Elige Información de registros.
  4. En Información de registros, abre el menú desplegable Criterios de selección.
  5. Selecciona uno o más grupos de registro para realizar la consulta. O bien, selecciona Examinar grupos de registro y, a continuación, selecciona tus grupos de registro.
  6. (Opcional) Elige un intervalo de tiempo para la consulta.
  7. Utiliza la sintaxis de consulta para diseñar las consultas.
  8. Para ver los resultados, selecciona Ejecutar consulta.

Generador de consultas CloudWatch

Para usar la IA generativa para analizar los registros de acceso, ejecuta el generador de consultas en CloudWatch.

Ejemplos de consultas para buscar los datos

Para filtrar información específica con Información de registros de CloudWatch, utiliza los siguientes ejemplos de consultas.

Principales direcciones IP de los clientes

Para contar las principales direcciones IP de los clientes que acceden a tus registros, ejecuta la siguiente consulta:

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

Principales países

Para contar los principales países que acceden a tus registros, ejecuta la siguiente consulta:

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

Principales hosts

Para contar los principales hosts que acceden a tus registros, ejecuta la siguiente consulta:

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

Principales métodos

Para contar los principales métodos que acceden a tus registros, ejecuta la siguiente consulta:

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

Principales agentes de usuario

Para contar los principales agentes de usuario que acceden a tus registros, ejecuta la siguiente consulta:

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

Principales reglas de terminación

Para contar las principales reglas de terminación de tus registros, ejecuta la siguiente consulta:

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

Filtrar por solicitudes bloqueadas

Para filtrar por todas las solicitudes bloqueadas y su regla de terminación, ruta de URI y dirección IP del cliente, ejecuta la siguiente 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 los registros por un host específico, ejecuta la siguiente 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"

Nota: Sustituye www.ejemplo.com por el nombre del host.

Filtrar por una cadena específica

Para filtrar los registros por una cadena específica, ejecuta la siguiente 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

Nota: Sustituye {jndi:ldap por tu cadena.

Filtrar por solicitudes POST

Para filtrar por las solicitudes POST, ejecuta la siguiente 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 las solicitudes que no se originan en un país específico, ejecuta la siguiente 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

Nota: Sustituye US por el código de país que quieras filtrar.

Filtrar por solicitudes bloqueadas según reglas basadas en tasas

Para filtrar los registros que están bloqueados por una regla basada en tasas, ejecuta la siguiente 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

Scripting entre sitios (XSS) o inyección de código SQL

Para encontrar los patrones que provocan XSS o la inyección de código SQL en la regla de terminación de una regla personalizada o grupos de reglas administradas de AWS, ejecuta la siguiente consulta:

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

La consulta muestra entradas con una marca de tiempo, la dirección IP del cliente, el país de origen, los detalles de la coincidencia y el ID de la solicitud.

Filtrar por solicitudes contadas según una regla específica en un grupo de reglas

Para filtrar las entradas de registro para las solicitudes que una regla específica de un grupo de reglas cuenta y termina de forma predeterminada, ejecuta la siguiente 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

Nota: Sustituye ruleId por el ID de tu regla.

Filtrar por solicitudes con un CAPTCHA que no es válido

Para filtrar las 100 solicitudes principales con un CAPTCHA que no es válido, ejecuta la siguiente consulta:

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

Nota: Sustituye 100 en la cláusula de límite por el número de solicitudes por las que deseas filtrar.

Esta consulta muestra la hora de la solicitud, la dirección IP, el ID de la solicitud, el código de respuesta y el mensaje completo.