Una agenda copiada y nadie lo vio
La monitorización de seguridad consiste en registrar lo que ocurre en un sistema y vigilar las señales de que algo va mal. Sirve para enterarte de un ataque mientras aún puedes pararlo.
Una clínica dental descubre un lunes que alguien copió su agenda de citas el jueves. Los registros lo contaban desde el primer minuto. Nadie los miraba.
Al final de esta lección
Nota
Puedo elegir qué registrar y qué vigilar en un sistema.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Registro | un archivo donde un programa anota lo que ocurre, línea a línea | |
| Evento | algo que ocurre y queda anotado, como un acceso o un error | |
| Fuente | el programa o la máquina que escribe un evento | cortafuegos |
| Métrica | un número medido a lo largo del tiempo, como los accesos por minuto | |
| Señal | un evento que te ayuda a tomar una decisión | |
| Ruido | eventos normales que tapan las señales |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Registro y métrica: en qué se distinguen
Un registro guarda cada evento con su hora. Sirve para saber qué pasó, a quién y desde dónde.
Una métrica es un número que se mide cada minuto o cada hora, como los accesos fallidos por minuto. Sirve para ver un cambio de un vistazo.
Necesitas las dos. La métrica te avisa de que algo cambió y el registro te dice qué fue.
Qué registrar según la fuente
| Fuente | Qué anota | Para qué te sirve |
|---|---|---|
| Autenticación | Accesos correctos y fallidos | Ver quién intenta entrar con claves ajenas |
| Cortafuegos | Conexiones permitidas y denegadas | Ver escaneos y orígenes raros |
| Servidor web | Cada petición y su código de estado | Ver qué páginas se atacan |
| Base de datos | Consultas de administración y errores | Ver copias masivas de datos |
| Sistema operativo | Usuarios creados y tareas programadas | Ver cambios que dejan una puerta abierta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Señal y ruido: qué merece vigilancia
No todo evento merece un aviso. Pregúntate: si esto ocurre, ¿cambia lo que hago? Si la respuesta es no, es ruido.
Un acceso fallido es ruido, porque todos nos equivocamos. Cuarenta en un minuto desde la misma dirección son una señal.
Registra casi todo y vigila solo lo que cambiaría tu decisión.
Mira qué escribe cada fuente en el laboratorio
En el laboratorio tienes los registros de un servidor web durante un día, en la carpeta case. Todavía no buscas ningún ataque. Solo preguntas qué fuentes hay y cuánto escribe cada una.
El primer comando lista las fuentes: el registro de autenticación, auth.log, y la carpeta nginx del servidor web. El segundo cuenta sus líneas. El tercero cuenta las líneas de cada programa.
Las fuentes que hay en el laboratorio
ls case/var/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 líneas escribe cada registro en un día
wc -l case/var/log/auth.log 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.
Cuántas líneas escribe cada programa
awk '{print $5}' case/var/log/auth.log | sed 's/\[.*//' | 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.
Ejemplo: lo que imprime el tercer comando
| Programa | Líneas en el día | Qué te dice |
|---|---|---|
| CRON | 560 | Tareas programadas que se repiten: casi todo es ruido |
| sshd | 798 | Intentos de entrar por SSH: aquí hay señales y ruido |
| systemd-logind | 6 | Sesiones abiertas: pocas, merece la pena leerlas |
| sudo | 1 | Una orden de administración: poco, pero importante |
| useradd | 1 | Una cuenta creada: poco, pero cambia quién puede entrar |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Contar eventos por fuente con Python
Contar a mano no escala. Un programa pequeño lo hace con un diccionario: la fuente es la clave y la cuenta es el valor.
Los nombres del código van en inglés, como en casi todo el código real. Los comentarios y los mensajes van en español. Ejecuta el ejemplo y cambia una línea del registro.
Un contador de eventos por fuente
lines = [
"09:00:01 web INFO acceso de ana",
"09:00:04 cortafuegos AVISO paquete denegado",
"09:00:06 web INFO acceso de luis",
"09:00:09 cortafuegos AVISO paquete denegado",
]
counts = {}
for line in lines:
source = line.split()[1] # la segunda palabra es la fuente
if source in counts:
counts[source] = counts[source] + 1
else:
counts[source] = 1
print(counts)
Un error frecuente
Advertencia
Mucha gente cree que vigilar bien es avisar de todo. Un aviso por cada evento tapa las señales con ruido, y al tercer día nadie lee los avisos. Vigila pocas cosas y elígelas por la decisión que cambian.
Para ir más lejos
Una fuente que de pronto calla puede ser un aviso: alguien la apagó o dejó de funcionar. Piensa en una tienda en línea con cinco fuentes. Escribe cuáles tendrían que escribir cada minuto y cuáles no. Después di qué harías si la primera callara diez minutos.