<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yoandy Ramirez Delgado</title>
    <description>The latest articles on DEV Community by Yoandy Ramirez Delgado (@yoandy).</description>
    <link>https://dev.to/yoandy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3931672%2Ff72ae885-6254-456e-9726-998d0c2bdb6e.png</url>
      <title>DEV Community: Yoandy Ramirez Delgado</title>
      <link>https://dev.to/yoandy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yoandy"/>
    <language>en</language>
    <item>
      <title>Monté un mini-SOC en mi portátil con honeypot, Wazuh e IA local — proyecto del Máster en Evolve</title>
      <dc:creator>Yoandy Ramirez Delgado</dc:creator>
      <pubDate>Sat, 16 May 2026 15:34:13 +0000</pubDate>
      <link>https://dev.to/evolve-space/monte-un-mini-soc-en-mi-portatil-con-honeypot-wazuh-e-ia-local-proyecto-del-master-en-evolve-52mc</link>
      <guid>https://dev.to/evolve-space/monte-un-mini-soc-en-mi-portatil-con-honeypot-wazuh-e-ia-local-proyecto-del-master-en-evolve-52mc</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tdgg79n84e7t902r3pd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tdgg79n84e7t902r3pd.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Monté un mini-SOC en mi portátil con honeypot, Wazuh e IA local — proyecto del Máster en Evolve
&lt;/h1&gt;

&lt;p&gt;Cuando empecé el proyecto final del Máster en Ciberseguridad en &lt;a href="https://evolve.es" rel="noopener noreferrer"&gt;Evolve&lt;/a&gt;, tenía claro qué &lt;em&gt;no&lt;/em&gt; quería: otro informe PDF que nadie vuelva a abrir. Quería algo que se viera en una entrevista en treinta segundos — logs reales, alertas que suben solas y una interfaz donde un analista pueda trabajar sin pelearse con veinte pestañas.&lt;/p&gt;

&lt;p&gt;Eso acabó siendo &lt;strong&gt;Valhalla SOC&lt;/strong&gt;: un centro de operaciones pequeño pero completo, montado con Docker en local, sin mandar datos a la nube.&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema que quería resolver
&lt;/h2&gt;

&lt;p&gt;En muchos laboratorios de seguridad practicas con PCAPs viejos o ejercicios ya masticados. Yo quería el ruido de fondo de internet: bots que prueban &lt;code&gt;root&lt;/code&gt;/&lt;code&gt;admin&lt;/code&gt;, descargas con &lt;code&gt;wget&lt;/code&gt;, intentos de persistencia… pero en un entorno controlado, en mi máquina.&lt;/p&gt;

&lt;p&gt;La idea era encadenar tres piezas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Una trampa&lt;/strong&gt; que parezca un servidor SSH de verdad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Un SIEM&lt;/strong&gt; que clasifique lo que pasa ahí.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Una capa de análisis&lt;/strong&gt; que no dependa de APIs de pago ni de subir alertas a terceros.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  El entorno: de dónde salen los datos
&lt;/h2&gt;

&lt;p&gt;No hay un CSV de Kaggle detrás. El “dataset” son los propios atacantes (y el contenedor de laboratorio que lanza ataques automáticos).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cowrie&lt;/strong&gt; escucha en el puerto &lt;strong&gt;2222&lt;/strong&gt; y finge ser OpenSSH. Todo queda en JSON: logins, comandos, descargas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wazuh&lt;/strong&gt; lee esos logs, aplica decoders y reglas propias (fuerza bruta, malware, reverse shell, etc.) y los mapea a &lt;strong&gt;MITRE ATT&amp;amp;CK&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenSearch&lt;/strong&gt; (indexer de Wazuh) guarda el histórico para consultas y dashboards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; en el host, con &lt;strong&gt;qwen2.5-coder:7b&lt;/strong&gt;, recibe las alertas más graves y devuelve un resumen corto — dos frases, sin novela.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Encima monté un &lt;strong&gt;frontend + API&lt;/strong&gt; (React y FastAPI) para tickets, workspace tipo kanban, mapa de amenazas, integración con VirusTotal y chat entre operadores. No sustituye a Wazuh Dashboard; lo complementa para el día a día del analista.&lt;/p&gt;

&lt;p&gt;El reto técnico no fue solo “que funcione”, sino &lt;strong&gt;que aguante en Windows&lt;/strong&gt; (sí, con Docker Desktop, Ollama fuera del compose y el clásico lío del event loop de Python con PostgreSQL async). La primera vez que levanté todo, el backend moría al arrancar y el frontend devolvía 500. Horas perdidas hasta entender que uvicorn en Windows necesita un bucle distinto. Cosas que no salen en los diagramas de arquitectura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo lo monté (sin saltarme pasos)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Infra con Docker Compose&lt;/strong&gt;: Wazuh manager + indexer + dashboard, Cowrie, Postgres para la app, nginx como puerta de entrada, y un contenedor “attacker” para generar ruido en el laboratorio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reglas a medida&lt;/strong&gt; en &lt;code&gt;wazuh_config/rules/&lt;/code&gt; — por ejemplo detección de fuerza bruta (varios fallos en ventana corta), login exitoso en honeypot, descargas con &lt;code&gt;wget&lt;/code&gt;/&lt;code&gt;curl&lt;/code&gt;, o intentos de desactivar el firewall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integración Ollama&lt;/strong&gt; vía script en &lt;code&gt;wazuh_config/integrations/custom-ollama.py&lt;/code&gt;: solo alertas de nivel ≥ 5, prompt acotado, respuesta indexada como insight adicional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt; con autenticación por cookie httpOnly, CSRF en mutaciones, auditoría de acciones y sincronización de alertas Wazuh → tickets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI&lt;/strong&gt; con tema oscuro/claro, workspace de incidentes, SIEM propio consultando OpenSearch, y runbooks enlazados a tickets.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para levantarlo en limpio: clonar repo, copiar &lt;code&gt;.env.example&lt;/code&gt; a &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;ollama pull qwen2.5-coder:7b&lt;/code&gt;, &lt;code&gt;docker compose up -d --build&lt;/code&gt;, y los scripts de dashboards/monitores. En el README dejo el detalle; no voy a repetir aquí quince comandos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resultados que sí se pueden enseñar
&lt;/h2&gt;

&lt;p&gt;En una sesión de laboratorio típica (con el honeypot expuesto y el atacante automático corriendo) el sistema se comporta como un SOC en miniatura:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Miles de eventos en el dashboard de Cowrie — en mis pruebas llegué a ver &lt;strong&gt;más de 8000 alertas críticas&lt;/strong&gt; en la vista dedicada, con timeline y top de IPs.&lt;/li&gt;
&lt;li&gt;Reglas disparando técnicas MITRE concretas (T1110 fuerza bruta, T1105 transferencia de herramientas, T1059 ejecución, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitores&lt;/strong&gt; en Wazuh cada pocos minutos para brute force, malware, reverse shell, persistencia en crontab…&lt;/li&gt;
&lt;li&gt;Tickets creados desde alertas Wazuh, asignables y movibles por estados en el workspace.&lt;/li&gt;
&lt;li&gt;Respuestas de Ollama del estilo: “están bajando un script desde una IP externa; tratar como intento de implant” — útil como primera lectura, no como veredicto legal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Capturas que recomiendo subir en el artículo (están en el repo bajo &lt;code&gt;docs/img/&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dashboard Cowrie en tiempo real (&lt;code&gt;04-cowrie-honeypot.png&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Cobertura MITRE en agente (&lt;code&gt;02-agente-mitre.png&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Pantalla de login de Valhalla (&lt;code&gt;11-login-valhalla.png&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lo que me llevé (y lo que cambiaría)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Aprendizajes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un honeypot enseña más en una tarde que una semana leyendo solo teoría de SIEM.&lt;/li&gt;
&lt;li&gt;La IA local tiene sentido en SOC &lt;strong&gt;si acotas el prompt y el modelo&lt;/strong&gt;; no hace falta un LLM gigante para resumir una alerta.&lt;/li&gt;
&lt;li&gt;La parte dura es la &lt;strong&gt;integración&lt;/strong&gt; (certificados Wazuh, rutas de logs, webhooks, CORS, CSRF), no el CSS del login.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Si lo retomara mañana:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endurecería producción (webhooks firmados, websockets autenticados, cero contraseñas por defecto).&lt;/li&gt;
&lt;li&gt;Documentaría un “modo demo” de un solo comando para corrección en clase.&lt;/li&gt;
&lt;li&gt;Separaría más el módulo honeypot del repo principal — ahora todo vive junto y pesa, pero para el máster tenía sentido mostrar el stack entero.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hice además una auditoría de seguridad sobre el propio código (auth, API, Docker) y salieron hallazgos serios — buena lección: &lt;strong&gt;montar un SOC no te convierte automáticamente en secure by default&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Código y cómo reproducirlo
&lt;/h2&gt;

&lt;p&gt;Todo el proyecto está en GitHub, público, con README paso a paso, manual de usuario y capturas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repositorio:&lt;/strong&gt; &lt;a href="https://github.com/heindall92/Proyecto-Master-Ciberseguridad-Evolve-Yoandy" rel="noopener noreferrer"&gt;github.com/heindall92/Proyecto-Master-Ciberseguridad-Evolve-Yoandy&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/heindall92/Proyecto-Master-Ciberseguridad-Evolve-Yoandy.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stack principal: &lt;strong&gt;Python · FastAPI · React · Docker · Wazuh · Cowrie · Ollama · PostgreSQL · OpenSearch&lt;/strong&gt; (TypeScript ~60 % del código según GitHub).&lt;/p&gt;




&lt;p&gt;Proyecto académico desarrollado durante el &lt;strong&gt;Máster en Ciberseguridad de &lt;a href="https://evolve.es" rel="noopener noreferrer"&gt;Evolve&lt;/a&gt;&lt;/strong&gt;. Si estás montando tu primer laboratorio SOC en casa, espero que te ahorre algún tropezón con Docker — o al menos que sepas que no eres el único al que el backend le devuelve 500 un domingo a las once de la noche.&lt;/p&gt;

&lt;p&gt;¿Has montado honeypots en clase o en casa? Me interesa saber qué regla fue la primera que te hizo decir “vale, esto ya parece un SOC de verdad”.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>python</category>
      <category>infosec</category>
      <category>networking</category>
    </item>
  </channel>
</rss>
