

# Ejemplos de consultas de registros de AWS WAF
<a name="query-examples-waf-logs"></a>

En muchas de las consultas de ejemplo de esta sección se utiliza la tabla de proyección de particiones creada anteriormente. Modifique el nombre de la tabla, los valores de columna y otras variables de los ejemplos según sus requisitos. Para mejorar el rendimiento de las consultas y reducir el costo, agregue la columna de partición en la condición de filtro.

**Topics**
+ [Recuento de los orígenes de referencia, las direcciones IP o las reglas coincidentes](query-examples-waf-logs-count.md)
+ [Consulta con la fecha y hora](query-examples-waf-logs-date-time.md)
+ [Consulta de las solicitudes o direcciones bloqueadas](query-examples-waf-logs-blocked-requests.md)

# Recuento de los orígenes de referencia, las direcciones IP o las reglas coincidentes
<a name="query-examples-waf-logs-count"></a>

En los ejemplos de esta sección se consultan los recuentos de elementos de registro de interés.
+ [Count the number of referrers that contain a specified term](#waf-example-count-referrers-with-specified-term)
+ [Count all matched IP addresses in the last 10 days that have matched excluded rules](#waf-example-count-matched-ip-addresses)
+ [Group all counted managed rules by the number of times matched](#waf-example-group-managed-rules-by-times-matched)
+ [Group all counted custom rules by number of times matched](#waf-example-group-custom-rules-by-times-matched)

**Example : contar el número de referencias que contienen un término especificado**  
La siguiente consulta cuenta el número de referencias que contienen el término “amazon” para el intervalo de fechas especificado.  

```
WITH test_dataset AS 
  (SELECT header FROM waf_logs
    CROSS JOIN UNNEST(httprequest.headers) AS t(header) WHERE "date" >= '2021/03/01'
    AND "date" < '2021/03/31')
SELECT COUNT(*) referer_count 
FROM test_dataset 
WHERE LOWER(header.name)='referer' AND header.value LIKE '%amazon%'
```

**Example : contar todas las direcciones IP coincidentes en los últimos 10 días que coincidieron con las reglas excluidas**  
En la siguiente consulta se cuenta el número de veces que, en los últimos 10 días, la dirección IP coincidió con la regla excluida del grupo de reglas.   

```
WITH test_dataset AS 
  (SELECT * FROM waf_logs 
    CROSS JOIN UNNEST(rulegrouplist) AS t(allrulegroups))
SELECT 
  COUNT(*) AS count, 
  "httprequest"."clientip", 
  "allrulegroups"."excludedrules",
  "allrulegroups"."ruleGroupId"
FROM test_dataset 
WHERE allrulegroups.excludedrules IS NOT NULL AND from_unixtime(timestamp/1000) > now() - interval '10' day
GROUP BY "httprequest"."clientip", "allrulegroups"."ruleGroupId", "allrulegroups"."excludedrules"
ORDER BY count DESC
```

**Example : agrupar todas las reglas administradas contadas por el número de veces que coinciden**  
Si estableció las acciones de reglas del grupo de reglas en Contar en su configuración de ACL web antes del 27 de octubre de 2022, AWS WAF guardó las anulaciones en el archivo JSON de ACL web como `excludedRules`. Ahora, la configuración JSON para anular una regla en Contar se encuentra en la configuración `ruleActionOverrides`. Para obtener más información, consulte [Anulación de acciones en grupos de reglas](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-rule-group-override-options.html) en la *Guía para desarrolladores de AWS WAF*. Para extraer las reglas administradas en el modo Contar de la estructura de registro nueva, consulte `nonTerminatingMatchingRules` en la sección `ruleGroupList` en lugar del campo `excludedRules`, como en el siguiente ejemplo.  

```
SELECT
 count(*) AS count,
 httpsourceid,
 httprequest.clientip,
 t.rulegroupid, 
 t.nonTerminatingMatchingRules
FROM "waf_logs" 
CROSS JOIN UNNEST(rulegrouplist) AS t(t) 
WHERE action <> 'BLOCK' AND cardinality(t.nonTerminatingMatchingRules) > 0 
GROUP BY t.nonTerminatingMatchingRules, action, httpsourceid, httprequest.clientip, t.rulegroupid 
ORDER BY "count" DESC 
Limit 50
```

**Example : agrupar todas las reglas personalizadas contadas por el número de veces que coinciden**  
En la siguiente consulta se agrupan todas las reglas personalizadas contadas según el número de veces que coinciden.  

```
SELECT
  count(*) AS count,
         httpsourceid,
         httprequest.clientip,
         t.ruleid,
         t.action
FROM "waf_logs" 
CROSS JOIN UNNEST(nonterminatingmatchingrules) AS t(t) 
WHERE action <> 'BLOCK' AND cardinality(nonTerminatingMatchingRules) > 0 
GROUP BY t.ruleid, t.action, httpsourceid, httprequest.clientip 
ORDER BY "count" DESC
Limit 50
```

Para obtener información sobre las ubicaciones de registro de las reglas personalizadas y los grupos de reglas administrados, consulte [Supervisión y ajuste](https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-testing-activities.html) en la *Guía para desarrolladores de AWS WAF*.

# Consulta con la fecha y hora
<a name="query-examples-waf-logs-date-time"></a>

En los ejemplos de esta sección se incluyen consultas que utilizan valores de fecha y hora.
+ [Return the timestamp field in human-readable ISO 8601 format](#waf-example-return-human-readable-timestamp)
+ [Return records from the last 24 hours](#waf-example-return-records-last-24-hours)
+ [Return records for a specified date range and IP address](#waf-example-return-records-date-range-and-ip)
+ [For a specified date range, count the number of IP addresses in five minute intervals](#waf-example-count-ip-addresses-in-date-range)
+ [Count the number of X-Forwarded-For IP in the last 10 days](#waf-example-count-x-forwarded-for-ip)

**Example : devolver el campo de marca de tiempo en formato ISO 8601 legible por humanos**  
La siguiente consulta utiliza las funciones `from_unixtime` y `to_iso8601` para devolver el campo `timestamp` en formato ISO 8601 legible por humanos (por ejemplo, `2019-12-13T23:40:12.000Z` en lugar de `1576280412771`). La consulta devuelve también el nombre de origen HTTP, el ID de origen y la solicitud.   

```
SELECT to_iso8601(from_unixtime(timestamp / 1000)) as time_ISO_8601,
       httpsourcename,
       httpsourceid,
       httprequest
FROM waf_logs
LIMIT 10;
```

**Example : devolver registros de las últimas 24 horas**  
La siguiente consulta utiliza un filtro en el cláusula `WHERE` para devolver el nombre de origen HTTP, el ID de origen HTTP y los campos de solicitud HTTP para los registros de las últimas 24 horas.  

```
SELECT to_iso8601(from_unixtime(timestamp/1000)) AS time_ISO_8601, 
       httpsourcename, 
       httpsourceid, 
       httprequest 
FROM waf_logs
WHERE from_unixtime(timestamp/1000) > now() - interval '1' day
LIMIT 10;
```

**Example : devolver registros para un intervalo de fechas y una dirección IP especificados**  
En la siguiente consulta, se enumeran los registros de un intervalo de fechas especificado para una dirección IP de cliente especificada.  

```
SELECT * 
FROM waf_logs 
WHERE httprequest.clientip='53.21.198.66' AND "date" >= '2021/03/01' AND "date" < '2021/03/31'
```

**Example : contar el número de direcciones IP en intervalos de cinco minutos para un intervalo de fechas especificado**  
La siguiente consulta cuenta el número de direcciones IP en intervalos de cinco minutos para un intervalo de fechas determinado.  

```
WITH test_dataset AS 
  (SELECT 
     format_datetime(from_unixtime((timestamp/1000) - ((minute(from_unixtime(timestamp / 1000))%5) * 60)),'yyyy-MM-dd HH:mm') AS five_minutes_ts,
     "httprequest"."clientip" 
     FROM waf_logs 
     WHERE "date" >= '2021/03/01' AND "date" < '2021/03/31')
SELECT five_minutes_ts,"clientip",count(*) ip_count 
FROM test_dataset 
GROUP BY five_minutes_ts,"clientip"
```

**Example : contar el número de IP X-Forwarded-For en los últimos 10 días**  
En la siguiente consulta se filtran los encabezados de la solicitud y se cuenta el número de IP de X-Forwarded-For de los últimos 10 días.  

```
WITH test_dataset AS
  (SELECT header
   FROM waf_logs
   CROSS JOIN UNNEST (httprequest.headers) AS t(header)
   WHERE from_unixtime("timestamp"/1000) > now() - interval '10' DAY) 
SELECT header.value AS ip,
       count(*) AS COUNT 
FROM test_dataset 
WHERE header.name='X-Forwarded-For' 
GROUP BY header.value 
ORDER BY COUNT DESC
```

Para obtener más información sobre las funciones de fecha y hora, consulte [Funciones y operadores de fecha y hora](https://trino.io/docs/current/functions/datetime.html) en la documentación de Trino.

# Consulta de las solicitudes o direcciones bloqueadas
<a name="query-examples-waf-logs-blocked-requests"></a>

En los ejemplos de esta sección se consultan solicitudes o direcciones bloqueadas.
+ [Extract the top 100 IP addresses blocked by a specified rule type](#waf-example-extract-top-100-blocked-ip-by-rule)
+ [Count the number of times a request from a specified country has been blocked](#waf-example-count-request-blocks-from-country)
+ [Count the number of times a request has been blocked, grouping by specific attributes](#waf-example-count-request-blocks-by-attribute)
+ [Count the number of times a specific terminating rule ID has been matched](#waf-example-count-terminating-rule-id-matches)
+ [Retrieve the top 100 IP addresses blocked during a specified date range](#waf-example-top-100-ip-addresses-blocked-for-date-range)

**Example : extraer las 100 direcciones IP principales bloqueadas por un tipo de regla especificado**  
La siguiente consulta extrae y cuenta las 100 direcciones IP principales que han sido bloqueadas por la regla de finalización `RATE_BASED` durante el intervalo de tiempo especificado.  

```
SELECT COUNT(httpRequest.clientIp) as count,
httpRequest.clientIp
FROM waf_logs
WHERE terminatingruletype='RATE_BASED' AND action='BLOCK' and "date" >= '2021/03/01'
AND "date" < '2021/03/31'
GROUP BY httpRequest.clientIp
ORDER BY count DESC
LIMIT 100
```

**Example : contar el número de veces que se bloqueó una solicitud de un país especificado**  
La siguiente consulta cuenta el número de veces que la solicitud ha llegado de una dirección IP que pertenece a Irlanda (IE) y ha sido bloqueada por la regla de terminación `RATE_BASED`.  

```
SELECT 
  COUNT(httpRequest.country) as count, 
  httpRequest.country 
FROM waf_logs
WHERE 
  terminatingruletype='RATE_BASED' AND 
  httpRequest.country='IE'
GROUP BY httpRequest.country
ORDER BY count
LIMIT 100;
```

**Example : contar el número de veces que se bloqueó una solicitud, agrupando por atributos específicos**  
La siguiente consulta cuenta el número de veces que la solicitud se ha bloqueado, con los resultados agrupados por WebACL, RuleId, ClientIP y URI de la solicitud HTTP.  

```
SELECT 
  COUNT(*) AS count,
  webaclid,
  terminatingruleid,
  httprequest.clientip,
  httprequest.uri
FROM waf_logs
WHERE action='BLOCK'
GROUP BY webaclid, terminatingruleid, httprequest.clientip, httprequest.uri
ORDER BY count DESC
LIMIT 100;
```

**Example : contar el número de veces que se encontraron coincidencias con un ID de regla de terminación específico**  
La siguiente consulta cuenta el número de veces que se han encontrado coincidencias con un ID de regla de terminación específico (`WHERE terminatingruleid='e9dd190d-7a43-4c06-bcea-409613d9506e'`). La consulta agrupa después los resultados por WebACL, Action, ClientIP y URI de solicitud HTTP.  

```
SELECT 
  COUNT(*) AS count,
  webaclid,
  action,
  httprequest.clientip,
  httprequest.uri
FROM waf_logs
WHERE terminatingruleid='e9dd190d-7a43-4c06-bcea-409613d9506e'
GROUP BY webaclid, action, httprequest.clientip, httprequest.uri
ORDER BY count DESC
LIMIT 100;
```

**Example : recuperar las 100 direcciones IP principales bloqueadas durante un intervalo de fechas especificado**  
La siguiente consulta extrae las 100 direcciones IP principales que se han bloqueado durante un intervalo de tiempo especificado. La consulta muestra también el número de veces que se han bloqueado las direcciones IP.  

```
SELECT "httprequest"."clientip", "count"(*) "ipcount", "httprequest"."country"
FROM waf_logs
WHERE "action" = 'BLOCK' and "date" >= '2021/03/01'
AND "date" < '2021/03/31'
GROUP BY "httprequest"."clientip", "httprequest"."country"
ORDER BY "ipcount" DESC limit 100
```