El objetivo principal de este proyecto ha sido montar un entorno de laboratorio (o prueba de concepto) para poder simular, detectar y monitorizar ciberataques en tiempo real contra una infraestructura concreta.
Este escenario práctico sirve para:
Para montar todo esto, optamos por ELK (Elasticsearch, Logstash y Kibana). Principalmente porque trae los datos y los muestra en tiempo real y porque, además de ser una solución súper robusta que se usa a nivel corporativo, es gratuita y de código abierto.
Para asegurarnos de que el entorno sea fácil de replicar, tiramos de Docker Desktop para meter cada componente en su propio contenedor.
1. Creación de la red virtual:
docker network create elk-red

2. Lanzar el contenedor ELK con las redes y el límite de memoria:
Advertencia: Mover la pila ELK en el equipo de pruebas se comió más del 90% de los 32 GB de RAM disponibles. Así que, antes de tocar nada, toca cerrar todo lo que no sea estrictamente necesario. Tuvimos que ponernos serios con los límites de memoria (2GB para Elasticsearch y 2GB para Filebeat) para evitar el colapso (Out of Memory - OOM).
docker run -d --name elk --network elk-red -p 5601:5601 -p 9200:9200 -p 5044:5044 -e ES_JAVA_OPTS="-Xms2g -Xmx2g" sebp/elk

3. Despliegue del contenedor víctima (Filebeat):
docker run -d --name filebeat --network elk-red -p 8080:80 -p 2222:22 --memory 2g --memory-swap 2g nginx-filebeat

4. Entrar en la máquina víctima:
docker exec -it filebeat bash

5. Actualizar repositorios e instalar las herramientas necesarias:
apt update
apt install openssh-server snort nano nginx -y

6. Iniciar servidor SSH:
service ssh start

Snort es el encargado de vigilar la red. Es un Sistema de Detección de Intrusos (IDS) clásico que revisa todo el tráfico que pasa.
msg:"Ping ICMP Detectado"; sid:3000003; rev:1;).Advertencia: Mover la pila ELK en el equipo de pruebas se comió más del 90% de los 32 GB de RAM disponibles. Así que, antes de tocar nada, toca cerrar todo lo que no sea estrictamente necesario. Para esta práctica usamos dos contenedores principales:
Tuvimos que ponernos serios con los límites de memoria (2GB para Elasticsearch y 2GB para Filebeat) para evitar que el PC host se colapsara (Out of Memory - OOM), que es el clásico dolor de cabeza en estos tipos de prácticas.
Snort es el encargado de vigilar la red. Es un Sistema de Detección de Intrusos (IDS) clásico que revisa todo el tráfico que pasa.
msg:"Ping ICMP Detectado"; sid:3000003; rev:1;)./var/log/snort/alert) y se las pasa al puerto 5044 de Logstash.La idea de todo esto no es coleccionar logs ilegibles, sino convertirlos en información útil de un vistazo en el dashboard de Kibana.
Montamos un dashboard enfocado a vigilar qué pasa en tiempo real. Aquí tenemos:
Una vez montado, había que probar si aguantaba los golpes. Lanzamos ataques simulados desde un Kali Linux corriendo en WSL para ver cómo reaccionaba.
Test 1: Mapeo de Red
SID 3000003;REV,2).Test 2: Aporreando la puerta (Fuerza Bruta SSH)
SID 3000003).El dashboard cumplió. Nos dio justo lo que queríamos: una foto instantánea y clara de lo que estaba pasando, permitiéndonos ver rápido quién nos estaba tocando las narices y qué alertas requerían atención urgente.
7. Editar reglas locales de Snort:
nano /etc/snort/rules/local.rules
(Añadir las reglas correspondientes para SSH e ICMP)
8. Iniciar Snort en segundo plano:
snort -q -c /etc/snort/snort.conf -i eth0 -k none -l /var/log/snort -A fast -D

/var/log/snort/alert) y se las pasa al puerto 5044 de Logstash.9. Editar configuración de Filebeat:
nano /etc/filebeat/filebeat.yml
Contenido de
filebeat.yml
:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/*.log
- type: log
enabled: true
paths:
- /var/log/snort/alert
output.logstash:
hosts: ['elk:5044']

10. Iniciar Filebeat:
service filebeat start

La idea de todo esto no es coleccionar logs ilegibles, sino convertirlos en información útil de un vistazo en el dashboard de Kibana: contadores de alertas críticas (ICMP, SSH), lista negra de IPs atacantes.
Lanzamos ataques simulados desde un Kali Linux corriendo en WSL para ver cómo reaccionaba.
Test 1: Mapeo de Red
docker exec -it filebeat ping -c 4 8.8.8.8).SID 3000003;REV,2).docker exec -it filebeat ping -c 4 8.8.8.8

Test 2: Aporreando la puerta (Fuerza Bruta SSH)
hydra -L usuarios.txt -P claves.txt -s 2222 -o resultados.txt -t 4 ssh://127.0.0.1

Implementar esto no fue fácil. Nos encontramos bastantes problemas por el camino, pero solucionarlos fue parte de la gracia del proyecto.
1. Se nos iba la RAM (Elasticsearch y Filebeat son muy tragones)
Cómo lo arreglamos: Tuvimos que ponerles límites de RAM a los contenedores al lanzarlos para no tumbar la máquina real:
docker run -d --name elk --network elk-red -p 5601:5601 -p 9200:9200 -p 5044:5044 -e ES_JAVA_OPTS="-Xms2g -Xmx2g" sebp/elk
2. Sorpresa: Filebeat no venía preinstalado
Cómo lo arreglamos: Hubo que entrar al contenedor víctima a mano e instalar/configurar Filebeat y Nginx a la antigua usanza, y luego cruzar los dedos para que mandara los logs a Logstash (puerto 5044):
apt update && apt install openssh-server snort nano nginx -y
3. Snort se hacía el loco (Fallo de detección)
Cómo lo arreglamos: Resulta que Docker y sus chequeos de red (Checksum Offloading) confundían a Snort. Lo "engañamos" arrancando Snort con -k none y aligerando las reglas para que ignorara las conexiones raras de Docker:
snort -q -c /etc/snort/snort.conf -i eth0 -k none -l /var/log/snort -A fast -D
4. Filebeat no nos dejaba entrar por SSH ni HTTP
Cómo lo arreglamos: Mítico fallo de puertos. El contenedor no dejaba sacar las cosas por los puertos por defecto. La solución fue mapear puertos menos habituales para evitar líos (el 2222 en vez del 22 para SSH y el 8080 por el 80 para HTTP):
docker run -d --name filebeat --network elk-red -p 8080:80 -p 2222:22 --memory 2g --memory-swap 2g nginx-filebeat
5. ELK crasheaba al intentar iniciarse
Cómo lo arreglamos: Al parecer, revisando los logs del contenedor, se encontró que Elasticsearch crasheaba tan pronto como se intentó iniciar (se descubrió que era porque se asignó demasiada poca memoria al servidor), y se tuvo que rehacer desde cero el servidor, ya que era imposible arreglarlo. Se solucionó asignando desde cero la memoria para Elasticsearch.
6. Kibana no veía los logs de Snort
Cómo lo arreglamos: A pesar de que la conectividad al puerto 5044 del contenedor ELK marcaba todo OK, en Kibana no mostraba absolutamente nada. Se tuvo que cambiar la configuración de Filebeat cambiando el puerto al de Elasticsearch para que Kibana pueda mostrarlo correctamente.
Conseguimos dejar fino un SIEM operativo con herramientas open source. Este laboratorio dio rodaje en cómo se mueve la info en un SIEM, gestionar redes Docker reales, y afinar un IDS para evitar el ruido.