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.

Preparación y contenedores

1. Creación de la red virtual:

docker network create elk-red

Creación de red virtual

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

Contenedor 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

Contenedor víctima

4. Entrar en la máquina víctima:

docker exec -it filebeat bash

Acceso a contenedor

Instalación y configuración dentro del contenedor víctima

5. Actualizar repositorios e instalar las herramientas necesarias:

apt update
apt install openssh-server snort nano nginx -y

Instalación de herramientas

6. Iniciar servidor SSH:

service ssh start

Inicio SSH

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.

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.

2.2. Configuración del IDS: Poniendo a Snort a escuchar

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.

2.3. El camino de los Logs (Logstash)

3. Visualización y Validación del Sistema

La idea de todo esto no es coleccionar logs ilegibles, sino convertirlos en información útil de un vistazo en el dashboard de Kibana.

3.1. Qué vemos en Kibana

Montamos un dashboard enfocado a vigilar qué pasa en tiempo real. Aquí tenemos:

3.2. Dando cera: Pruebas de Ataque

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

Test 2: Aporreando la puerta (Fuerza Bruta SSH)

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)Reglas de Snort

8. Iniciar Snort en segundo plano:

snort -q -c /etc/snort/snort.conf -i eth0 -k none -l /var/log/snort -A fast -D

Ejecución Snort

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']

Configuración Filebeat

10. Iniciar Filebeat:

service filebeat start

Inicio Filebeat

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

Prueba de ping

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

Ataque con Hydra

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.

Logros y Aprendizajes

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.