Data-Unix/tfg-soc-zerotrust
GitHub: Data-Unix/tfg-soc-zerotrust
Stars: 1 | Forks: 0
# SOC Zero Trust
### Implementación de un SOC con Detección y Respuesta Activa Open Source
#### AUTORES: Álvaro Carmena Díaz & Ilie Scripca
*Detección distribuida · Respuesta activa automatizada · Honeypots · Zero Trust aplicado*
*Coste en licencias de software: **0 €** · Funcionalidades equivalentes en el mercado: **>35.000 €/año***
[](config/wazuh/)
[](config/opnsense/)
[](config/)
[](config/opnsense/)
[](config/fail2ban/)
[](config/nginx/)
[](src/ztt_framework.py)
[](src/)
[](config/wazuh/local_rules.xml)
[](src/preparar.sh)
[](LICENSE)
[](.github/workflows/security-scan.yml)
[](#)
[](#)
[](#)
[](#)
[](#)
[](#)
[](#)
[](#)
[](#instalación-del-laboratorio)
[](#arquitectura)
[](#infraestructura)
[](#fases-de-la-tool-ztt-v11)
[](#demo-tool-ztt-v11)
[](docs/TFG-SOC-ZeroTrust-2026.pdf)
[](config/)
## ¿Qué es este proyecto?
Este repositorio contiene la implementación completa de un **Security Operations Center (SOC) con arquitectura Zero Trust**, construido íntegramente con herramientas open source sobre infraestructura virtualizada. El sistema opera sobre un único servidor físico con **11 máquinas virtuales** distribuidas en cuatro redes segmentadas con niveles de confianza diferenciados.
El núcleo del proyecto es la **cadena de detección y respuesta activa**: Wazuh como SIEM central recibe telemetría de todos los agentes, evalúa las alertas con reglas personalizadas y dispara automáticamente el Active Response sobre OPNsense —que bloquea la IP atacante vía pfctl en menos de 5 segundos. Esta cadena integra honeypots avanzados (T-Pot), IDS de red (Suricata), protección de capa de aplicación (Fail2Ban + Nginx) e identidad centralizada (Authentik SSO).
La **Tool ZTT** es la herramienta de verificación desarrollada ad hoc para validar la respuesta del sistema: recorre 9 fases de ataque progresivo y confirma en tiempo real que cada componente detecta, bloquea y alerta correctamente ante cada vector de amenaza.
El sistema replica los principios del **NIST SP 800-207** (*Zero Trust Architecture*) y da cobertura funcional a los requisitos técnicos de la **Directiva NIS2** y el **ENS categoría BÁSICA**, con un gasto en licencias de software de **0 €**.
## Demo — Tool ZTT

| Fase | Vector | Herramienta | Resultado |
|------|--------|-------------|-----------|
| **0** | Check status | ping / socket | `3/3 ONLINE` |
| **1** | Recon puertos | RustScan 2.3.0 | 7 puertos descubiertos |
| **2** | Enumeración web | ffuf v2.1.0-dev | `100014` ×19 alertas |
| **3** | Honeypot SSH éxito | Hydra v9.6 | `100011` → **AR bloquea en < 5 s** |
| **4** | Honeypot SSH fallo | ssh -b (IP alias) | `100040` → **AR bloquea perímetro** |
| **5** | Rollback PF | rollback-demo.sh | tabla `__wazuh_agent_drop` vaciada |
| **6** | Fail2Ban doble capa | ssh -b (IP alias) | `100040` → **iptables + PF simultáneo** |
| **7** | Rollback Fail2Ban | fail2ban-client | jail sshd liberado |
| **8** | Dionaea SMB+MSSQL | impacket | `100020` ×2 alertas |
*La herramienta activa Cowrie, Dionaea, Fail2Ban, Suricata y el Active Response de Wazuh→OPNsense en una secuencia reproducible de principio a fin.*
# Ejecutar demo completa para tribunal (con pausas explicativas)
sudo python3 src/ztt_framework.py --tribunal
# Modo espectáculo sin pausas (para grabación)
sudo python3 src/ztt_framework.py --espectaculo
# Verificar estado previo a la demo
sudo python3 src/ztt_framework.py --status
# Ejecutar una fase concreta
sudo python3 src/ztt_framework.py --fase 8
## Arquitectura
La arquitectura segmenta la red en **cuatro zonas de distinto nivel de confianza**:

| Red | Segmento | Nivel de confianza | Hosts |
|-----|----------|--------------------|-------|
| WAN | 203.0.113.0/24 | No confiable | Internet simulado (RFC 5737) |
| LAN_DMZ | 172.17.0.0/24 | Baja | Atacante · Honeypots · Proxy · Mail |
| LAN_INTERNA | 172.18.0.0/24 | Media-Alta | SIEM · AD · IdP · Endpoints |
| LAN_MNG | 172.16.0.0/24 | Alta | Proxmox · Acceso remoto |
OPNsense actúa como gateway único entre todas las redes, con Suricata 8.0.4 en modo IDS sobre la interfaz WAN y PF como backend de bloqueo para el Active Response de Wazuh.
## Infraestructura
| VM | IP | Rol | Tecnología | Agente Wazuh |
|----|----|-----|------------|--------------|
| VM100 | 172.17.0.167 | Atacante simulado | Kali 2025.4 · Tool ZTT · Python 3.13 | — |
| VM101 | 172.18.0.1 | Firewall perimetral | OPNsense · PF · Suricata 8.0.4 · AR | 009 |
| VM102 | 172.18.0.12 | SIEM central | Wazuh Manager 4.14.1 · OpenSearch | — |
| VM103 | 172.17.0.13 | Web honeypot + IDS host | Nginx 1.18.0 · Fail2Ban 0.11.1 · Ubuntu 20.04 | 008 |
| VM104 | 172.18.0.56 | Endpoint Windows | Win10 LTSC 21H2 · Active | 011 |
| VM105 | 172.18.0.20 | Active Directory | WinServer 2022 CORE · DC01 lab.tfg.local | 012 |
| VM106 | 172.17.0.16 | Honeypot avanzado | T-Pot v24.04.1 · Cowrie · Dionaea · ELK | 010 |
| VM107 | 172.18.0.14 | Identity Provider | Authentik 2026.2.2 · LDAP Outpost · SSO | — |
| VM108 | 172.17.0.15 | Reverse proxy | NPM 2.14.0 · SSL wildcard *.lab.tfg.local | — |
| VM109 | 172.17.0.20 | Mail server | docker-mailserver v15.1.0 · Roundcube | — |
| VM110 | 172.16.0.11 | Acceso remoto | Apache Guacamole 1.6.0 · RDP+SSH | — |
## Fases de la Tool ZTT
| Fase | Vector de ataque | IP origen | Herramienta | Alerta Wazuh | Respuesta |
|------|-----------------|-----------|-------------|--------------|-----------|
| 0 | Check status (3/3 ONLINE) | 172.17.0.167 | ping | — | — |
| 1 | Reconocimiento de puertos | 172.17.0.167 | RustScan 2.3.0 | — | — |
| 2 | Enumeración web | 172.17.0.167 | ffuf v2.1.0-dev | **100014** lvl 10 | — |
| 3 | Honeypot SSH éxito | 172.17.0.167 | Hydra v9.6 + ssh | **100011** lvl 14 | AR → PF block |
| 4 | Honeypot SSH fallo × 3 | 172.17.0.200* | ssh -b (alias) | **100040** lvl 15 | AR → PF block |
| 5 | Rollback PF | — | rollback-demo.sh | — | — |
| 6 | Fail2Ban doble capa | 172.17.0.200* | ssh -b (alias) | **100040** lvl 15 | iptables + PF |
| 7 | Rollback completo | — | fail2ban-client | — | — |
| 8 | Dionaea SMB + MSSQL | 172.17.0.167 | impacket | **100020** × 2 | — |
*\* IP alias del pool 172.17.0.200-209 creada en tiempo de ejecución sobre eth0 de VM100.*
### Flujo de Active Response
Cowrie (T-Pot VM106)
│
▼
Wazuh Agente 010 ──► Wazuh Manager (VM102)
│
regla 100011 / 100040 (lvl ≥ 14)
│
AR: opnsense-fw ──► Agente 009 (VM101)
│
pfctl tabla
__wazuh_agent_drop
│
IP atacante BLOQUEADA
(latencia < 5 segundos)
## Resultados de validación
Validación ejecutada el **16 de mayo de 2026** con `--tribunal`, 5 agentes activos (008-012):
| Métrica | Valor |
|---------|-------|
| Verdaderos Positivos (TP) | **~29** |
| Falsos Positivos (FP) | **0** |
| Falsos Negativos (FN) | **1** *(regla 100005 — ffuf→503 por rate-limit)* |
| Latencia Active Response | **< 5 segundos** |
| Requisitos funcionales verificados | **10 / 10** |
| Agentes Wazuh activos | **5** (008 · 009 · 010 · 011 · 012) |
## Reglas Wazuh personalizadas
Fichero completo en [`config/wazuh/local_rules.xml`](config/wazuh/local_rules.xml)
| Rule ID | Descripción | Nivel | Acción |
|---------|-------------|-------|--------|
| 100005 | Web enumeration frequency (ffuf/nikto) | 10 | — |
| 100010 | Cowrie SSH login fallido | 10 | — |
| 100011 | Cowrie SSH login exitoso (honeypot comprometido) | 14 | **Active Response** |
| 100014 | ffuf/fuzzer detectado en logs Nginx | 10 | — |
| 100020 | Dionaea: conexión exploit SMB/MSSQL | 10 | — |
| 100040 | CRITICAL: amenaza consolidada multi-vector | 15 | **Active Response** |
## Instalación del laboratorio
### Requisitos
- Servidor físico: CPU × 6 cores, RAM 32 GB, SSD 256 GB + HDD 1 TB
- Proxmox VE instalado con 4 bridges de red (vmbr0-3)
- Acceso a Internet para descarga de ISOs
### Orden de despliegue
# 1. Infraestructura base
# VM101 OPNsense → VM102 Wazuh → VM103 Fail2Ban+Nginx
# 2. Honeypots
# VM106 T-Pot v24.04.1 → registrar agente 010 en Wazuh
# 3. Identidad y acceso
# VM105 Windows Server (AD DC01) → VM107 Authentik → VM108 NPM
# 4. Endpoints
# VM104 Windows Cliente → VM109 Mail → VM110 Guacamole
# 5. Atacante simulado
# VM100 Kali → copiar ztt_framework.py → instalar dependencias
# 6. Validación
sudo python3 src/ztt_framework.py --status # 3/3 targets ONLINE
sudo python3 src/ztt_framework.py --tribunal # demo completa
### Dependencias Tool ZTT (VM100 Kali)
# Herramientas externas
sudo apt install -y hydra ffuf rustscan sshpass impacket-scripts
# Librería de interfaz visual
pip install rich
# Wordlist
gunzip /usr/share/wordlists/rockyou.txt.gz
## Estructura del repositorio
tfg-soc-zerotrust/
├── src/
│ ├── ztt_framework.py # Tool ZTT — 866 líneas, Python 3.13
│ └── preparar.sh # Limpieza de alias IP pre-demo
├── config/
│ ├── wazuh/
│ │ ├── local_rules.xml # 6 reglas de detección personalizadas
│ │ └── tpot_decoders.xml # Decoder Dionaea (T-Pot v24.04.1)
│ ├── nginx/
│ │ ├── nginx.conf # Configuración base Nginx (VM103)
│ │ └── vm103-nginx.conf # Virtual host con rate limiting
│ ├── fail2ban/
│ │ ├── jail.local # Jails: sshd + nginx-req-limit
│ │ ├── nginx-req-limit.conf # Filtro Fail2Ban para rate limit
│ │ └── wazuh-syslog.conf # Acción custom: iptables + logger→Wazuh
│ └── opnsense/
│ └── rollback-demo.sh # Script de rollback post-demo
├── web/
│ └── el-heraldo-pyongyang/
│ └── index.html # Web señuelo para demostración ffuf
├── media/
│ ├── architecture.png # Diagrama de arquitectura de red
│ └── demo-ztt-espectaculo.gif # Grabación demo completa
├── docs/
│ ├── instalacion.md
│ └── fases-ztt.md
└── README.md
## Tecnologías










**IES Valle Inclán · ASIR 2025-2026**
Álvaro Carmena Díaz · Ilie Scripca
*Tutor: Manuel Antonio Reyes Cañizal*