Cómo usar los registros de Cloudflare (ELS) para investigar el tráfico DDoS (solo Enterprise)
Descripción
Con los registros de Cloudflare (anteriormente ELS) tienes acceso a datos útiles para analizar el tráfico que puede mostrar patrones relacionados con un ataque DDoS. Para ejecutar este tipo de análisis, puedes organizar los datos de tus registros de Cloudflare. Para comenzar, sigue los pasos que se describen a continuación y revisa el flujo de trabajo del ejemplo que se muestra.
Antes de seguir estas instrucciones, necesitas lo siguiente:
Paso 1: Reunir la información que necesitas antes de consultar los registros de Cloudflare
Reunir la siguiente información:
- Dirección de correo electrónico del administrador de zona
- ID de zona (se encuentra bajo Overview (Descripción) > Zone ID (ID de zona))
- Clave de API del cliente
- Hora de inicio (formato de ejemplo: 1529171100)
- Hora de finalización (formato de ejemplo: 1529171100)
Paso 2: Descargar y guardar los registros
Nota: El punto de conexión de Cloudflare tiene una franja horaria de 1 hora y el tamaño de los archivos de registro debe ser inferior a 1 GB por solicitud. Si el tamaño del archivo es mayor a 1 GB, la descarga se detendrá al alcanzar 1 GB, incluso si los eventos registrados desde la hora solicitada no están incluidos. Para evitar que se trunquen los registros, reduce el tiempo de 1 hora a 45 minutos, y así sucesivamente hasta que el tamaño del archivo sea inferior a 1 GB.
Opción 1:
Descarga *todos* los campos desde los registros de Cloudflare, guarda en els.txt:
Plantilla:
curl -sv -o els.txt -H "X-Auth-Email: email" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received?start=starttime&end=endtime&fields=(curl -s -H "X-Auth-Email: email" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received/fields" | jq '. | to_entries[] | .key' -r | paste -sd "," -)"
Ejemplo (con valores):
curl -sv -o els.txt -H "X-Auth-Email: monkey@bannana.com" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/5b5f0xxxcbfbaxxxxxx0416d22f7b/logs/received?start=1529171100&end=1529171100&fields=(curl -s -H "X-Auth-Email: monkey@bannana.com" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received/fields" | jq '. | to_entries[] | .key' -r | paste -sd "," -)"
Opción 2:
**Descarga los campos *específicos* desde los registros de Cloudflare, guarda en els.txt:
**
Este comando incluirá solo los siguientes campos en los registros que solicitaste: CacheCacheStatus, CacheResponseBytes, CacheResponseStatus, CacheTieredFill, ClientASN.
Consulta aquí la lista completa de los campos de los registros de Cloudflare.
Plantilla:
curl -sv -o els.txt-H "X-Auth-Email:email" -H "X-Auth-Key:api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received?start=starttime&end=endtime&fields=CacheCacheStatus,CacheResponseBytes,CacheResponseStatus,CacheTieredFill,ClientASN”
Ejemplo (con valores):
curl -sv -o els.txt-H "X-Auth-Email:monkey@bannana.com" -H "X-Auth-Key:api key" "https://api.cloudflare.com/client/v4/zones/xx5x0xxxc45baxxxxxx0x6d23fxx/logs/received?start=1529171100&end=1529171100&fields=CacheCacheStatus,CacheResponseBytes,CacheResponseStatus,CacheTieredFill,ClientASN”
Paso 3: Organizar los registros
Organiza los registros por valor de campo e imprímelos en un archivo.Organiza por respuesta de HTTP 200, envía al archivo con el nombre de els-200.txt:
~$ cat els.txt| grep ":200," > els-200.txt
Organiza por respuesta de HTTP 525, envía al archivo con el nombre de els-525.txt
~$ cat els.txt| grep ":525," > els-525.txt
¿De dónde viene el valor de campo “:525,” ?
El patrón :525, (dos puntos, código de estado, coma) es exclusivo del campo EdgeResponseStatus. La simple búsqueda del código de estado HTTP 525 sin dos puntos y coma también incluiría entradas de registro que tienen el patrón 525 en otros campos como EdgeStartTimeStamp, por ejemplo, que contiene muchos números y también puede contener la secuencia de números 525.
Nota:los archivos de salida (els-200.txt y els-525.txt) no son legibles así como están. Para visualizarlos en un formato legible, usa jq en el siguiente comando:
~$ cat els-525.txt | jq '.'
Cuenta las solicitudes por campo e imprímelas en un archivo
En este ejemplo, contamos las solicitudes por versión de protocolo SSL, que se indica por el campo ClientSSLProtocol en los registros de Cloudflare (comprueba el punto antes del nombre del campo a continuación).
~$ jq -r .ClientSSLProtocol els-200.txt |sort -n |uniq -c |sort -n > ClientSSLProtocol.txt
~$ cat ClientSSLProtocol.txt
Resultado del ejemplo:
Los campos ClientRequestURI, ClientIP, ClientRequestUserAgent, ClientCountry y ClientRequestHost son, por lo general, los más útiles para encontrar los patrones de los ataques en estos registros.
- Organizar por ClientRequestUserAgent te permite configurar las reglas para bloquear el agente usuario.
- Organizar por ClientCountry te permite configurar las reglas de firewall en función del país.
- Organizar por ClientRequestURI te permitirá configurar las reglas de rate limiting para las páginas con la mayor cantidad de solicitudes.
Flujo de trabajo de ejemplo
Con frecuencia, necesitarás organizar por muchos campos para analizar e identificar el origen de un ataque. Por ejemplo, observa el siguiente flujo de trabajo:
Acción 1: Organiza tus registros descargados de Cloudflare por respuesta HTTP 200, envía a els-200.txt.
Razón: Ya no te interesan las respuestas que Cloudflare está bloqueando, es decir, solicitudes que generan una respuesta HTTP 503 o 403. Una solicitud que genera una respuesta 200 HTTP en tu red perimetral no está bloqueada por Cloudflare y es probable que vaya hasta el origen si el recurso no está en caché en la red perimetral de Cloudflare. Estas solicitudes, cuando son elementos maliciosos, estás diseñadas para sobrecargar el origen.
Cómo proceder:
~$ cat els.txt | grep ":200," > els-200.txt
**
Acción 2**: Organiza tus registros “HTTP 200 only” por URI, envía a els-200-URI.txt.
Razón: de las 200 respuestas, tú quieres ver las páginas que más se están solicitando.
Cómo proceder:
Busca los URI que están más arriba:
~$ jq -r .ClientRequestURI els-200.txt |sort -n |uniq -c |sort -n > els-200-top-URIs.txt
~$ cat els-200-top-URIs.txt
Selecciona un URI de esta lista y envía las entradas de registro con ese URI a su propio archivo. Para hacerlo, reemplaza /ClientRequestURI/path/to/something/ en el comando que ves abajo con el URI que seleccionas:
~$ cat els-200.txt| grep "/ClientRequestURI/path/to/something/" > els-200-URI-1.txt
**
Acción 3**: Cuenta las respuestas específicas de URI, “HTTP 200 only”, por dirección IP, y envía a els-200-URI-1-Top-IP.txt
Razón: quieres ver las direcciones IP principales que están solicitando el URI y que generan una respuesta de 200.
Cómo proceder:
~$ jq -r .ClientIP els-200-URI-1.txt |sort -n |uniq -c |sort -n > els-200-URI-1-Top-IP.txt
Envía los contenidos del archivo:
~$ cat els-200-URI-1-Top-IP.txt
Puedes acotar las respuestas 200 HTTP tanto por URI de solicitud como por las IP que solicitan esos URI. También puedes organizar los registros a la inversa, acotar las entradas de registro por direcciones IP principales y luego ver qué URI solicita más la dirección IP.