Cuarenta intentos en dos minutos
Una regla de detección es una condición que se aplica a un registro y avisa cuando se cumple. Con tres piezas, coincidir, contar y fijar una ventana de tiempo, detectas ataques que a simple vista se pierden entre miles de líneas.
Alguien prueba contraseñas en la cuenta de un profesor del aula virtual: cuarenta intentos en dos minutos. Un solo intento fallido es normal. Cuarenta seguidos no lo son.
Al final de esta lección
Nota
Puedo escribir una regla que encuentra un ataque en un registro.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Regla de detección | una condición que se aplica a los registros y avisa si se cumple | |
| Coincidencia | una línea que encaja con lo que buscas | contraseña incorrecta |
| Umbral | el número de sucesos a partir del cual la regla avisa | |
| Ventana de tiempo | el periodo en que cuentas los sucesos, por ejemplo 60 segundos | |
| Fuerza bruta | probar muchas contraseñas hasta acertar una | |
| Dirección de origen | la dirección de red desde la que llega una petición |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Las tres piezas de una regla
Coincidir: qué líneas te interesan, por ejemplo las que dicen contraseña incorrecta.
Contar: cuántas veces ocurre, casi siempre por dirección o por cuenta.
Ventana: en cuánto tiempo. Cinco fallos en un minuto son raros. Cinco fallos en un año no lo son.
El número a partir del cual avisas es el umbral.
Ejemplo: tres reglas y sus piezas
| Regla | Coincide con | Cuenta | Ventana |
|---|---|---|---|
| Un fallo de contraseña | Líneas de fallo | Nada | Ninguna |
| Cinco fallos desde una dirección | Líneas de fallo | Por dirección | 60 segundos |
| Tres páginas prohibidas seguidas | Estado 403 del servidor web | Por dirección | 120 segundos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cómo se cuenta dentro de una ventana
Para cada suceso, abre una ventana que empieza en él y dura, por ejemplo, 60 segundos. Cuenta cuántos sucesos caen dentro.
Si llegas al umbral, avisa. El final de la ventana no cuenta: en la ventana de 100 a 160 entra el segundo 159, pero no el 160.
Ejemplo: umbral 3 y ventana de 60 segundos
| Empieza en | Ventana | Sucesos dentro | Avisa |
|---|---|---|---|
| 100 | 100 a 159 | 100, 110 y 130: son 3 | Sí |
| 110 | 110 a 169 | 110 y 130: son 2 | No |
| 130 | 130 a 189 | Solo 130: es 1 | No |
| 400 | 400 a 459 | 400 y 410: son 2 | No |
| 410 | 410 a 469 | Solo 410: es 1 | No |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Probar una regla desde la terminal
Con printf puedes fabricar un registro pequeño y probar una regla antes de usarla de verdad. El primer comando coincide y cuenta: filtra las líneas de fallo y cuenta las repetidas. El segundo mira una ventana: deja los sucesos entre 100 y 159 y los cuenta.
Coincidir y contar en un registro pequeño
printf 'fallo 10.0.0.5\nfallo 10.0.0.5\nok 10.0.0.9\nfallo 10.0.0.5\n' | grep fallo | sort | uniq -cSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Contar los sucesos de una ventana
printf '100\n110\n130\n400\n410\n' | awk '$1 >= 100 && $1 < 160' | wc -lSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Dos reglas de solo coincidencia en el laboratorio
En el laboratorio, una regla que solo coincide ya da un número. Los dos comandos cuentan las líneas que dicen Invalid user, usuario inexistente, en el registro de autenticación. Y las peticiones con estado 404 en el servidor web.
No dicen quién ni cuándo, porque aún no cuentan por dirección ni usan ventana.
Cuántas líneas dicen usuario inexistente
grep -c "Invalid user" case/var/log/auth.logSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuántas peticiones recibieron un 404
grep -c '" 404 ' case/var/log/nginx/access.logSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
La regla de la ventana en Python
El programa recorre los sucesos. Para cada uno cuenta cuántos caen en su ventana. Si alguno llega al umbral, hay alarma.
Ejecuta el ejemplo con los números de la tabla. Cambia el umbral a 4 y piensa qué imprimirá antes de ejecutarlo.
Una regla con umbral y ventana
times = [100, 110, 130, 400, 410]
limit = 3 # el umbral: cuántos sucesos hacen saltar la regla
window = 60 # la ventana, en segundos
alert = False
for start in times:
count = 0
for moment in times:
if moment >= start and moment < start + window:
count = count + 1
if count >= limit:
alert = True
print(alert)
Un error frecuente
Advertencia
Mucha gente cuenta los fallos de todo el día sin ventana. Un error a las nueve y otro a las cinco suman y la regla salta sin ataque. Sin ventana, un día largo siempre acaba superando el umbral.
Para ir más lejos
Una regla puede combinar dos sucesos: varios fallos seguidos de un acceso correcto desde la misma dirección. Escribe en palabras qué líneas coinciden, qué cuentas y qué ventana usas. Después piensa en qué caso normal saltaría sin ataque.