<?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: Santiago Ruiz Diaz</title>
    <description>The latest articles on DEV Community by Santiago Ruiz Diaz (@ruizz16).</description>
    <link>https://dev.to/ruizz16</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4112555%2F708bb717-b057-48ce-9ba9-98a57e21a308.jpg</url>
      <title>DEV Community: Santiago Ruiz Diaz</title>
      <link>https://dev.to/ruizz16</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ruizz16"/>
    <language>en</language>
    <item>
      <title>Armé un SIEM gratis con Wazuh y Kibana: así detecta un ataque de fuerza bruta en tiempo real</title>
      <dc:creator>Santiago Ruiz Diaz</dc:creator>
      <pubDate>Sun, 06 Sep 2026 17:02:49 +0000</pubDate>
      <link>https://dev.to/ruizz16/arme-un-siem-gratis-con-wazuh-y-kibana-asi-detecta-un-ataque-de-fuerza-bruta-en-tiempo-real-562g</link>
      <guid>https://dev.to/ruizz16/arme-un-siem-gratis-con-wazuh-y-kibana-asi-detecta-un-ataque-de-fuerza-bruta-en-tiempo-real-562g</guid>
      <description>&lt;p&gt;El problema que casi nadie mira hasta que es tarde&lt;/p&gt;

&lt;p&gt;Trabajando en infraestructura para más de 25 sedes de una corporación, aprendí algo que se repite en todo el sector IT: el problema casi nunca es la falta de registros — es que nadie los revisa.&lt;/p&gt;

&lt;p&gt;Cada servidor, cada firewall, cada endpoint genera logs de autenticación constantemente. La actividad sospechosa — alguien probando contraseñas contra un servidor, por ejemplo — casi siempre queda ahí, documentada, invisible, hasta que alguien mira.&lt;/p&gt;

&lt;p&gt;Para una empresa grande, tener un SIEM (Security Information and Event Management) que centralice y correlacione esos logs es casi un estándar. Para una mipyme que recién está armando su infraestructura, comprar una licencia de SIEM comercial no es una opción realista.&lt;/p&gt;

&lt;p&gt;Así que armé uno gratis, con herramientas open source, para mostrar exactamente qué se puede lograr sin gastar en licencias: Wazuh + Kibana, corriendo en Docker, detectando en tiempo real un intento de ataque de fuerza bruta simulado.&lt;/p&gt;

&lt;p&gt;Acá el video de la demo (el mismo que publiqué en LinkedIn): &lt;br&gt;
&lt;a href="https://lnkd.in/p/dvQVub7W" rel="noopener noreferrer"&gt;https://lnkd.in/p/dvQVub7W&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y acá abajo, el paso a paso completo — la arquitectura, la configuración real, y los problemas que me tocó resolver en el camino, porque casi ninguno de ellos aparece en la documentación oficial.&lt;/p&gt;
&lt;h2&gt;
  
  
  Arquitectura: qué es cada pieza
&lt;/h2&gt;

&lt;p&gt;Wazuh se compone de tres servicios principales, todos corriendo en contenedores separados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wazuh Indexer: el motor de búsqueda/almacenamiento (basado en OpenSearch), donde viven los eventos y alertas&lt;/li&gt;
&lt;li&gt;Wazuh Manager: el cerebro — recibe los eventos de los agentes, los procesa contra un set de reglas, y genera alertas&lt;/li&gt;
&lt;li&gt;Wazuh Dashboard: la interfaz visual (basada en Kibana/OpenSearch Dashboards) para explorar todo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Además, cada endpoint que querés monitorear necesita un Wazuh Agent instalado — en mi caso, un contenedor separado simulando un servidor Linux, con el agente enrolado contra el manager.&lt;/p&gt;

&lt;p&gt;┌─────────────┐      ┌──────────────┐      ┌────────────────┐&lt;br&gt;
│ Wazuh Agent  │ ───▶ │ Wazuh Manager │ ───▶ │ Wazuh Indexer   │&lt;br&gt;
│ (servidor    │      │ (procesa      │      │ (almacena       │&lt;br&gt;
│  monitoreado)│      │  reglas)      │      │  eventos)       │&lt;br&gt;
└─────────────┘      └──────────────┘      └───────┬────────┘&lt;br&gt;
                                                      │&lt;br&gt;
                                              ┌───────▼────────┐&lt;br&gt;
                                              │ Wazuh Dashboard │&lt;br&gt;
                                              │ (visualización) │&lt;br&gt;
                                              └────────────────┘&lt;/p&gt;
&lt;h2&gt;
  
  
  Deploy del stack
&lt;/h2&gt;

&lt;p&gt;Usé el repositorio oficial wazuh-docker (v4.14.7), que trae un docker-compose con los tres servicios y la generación de certificados TLS entre ellos ya resuelta.&lt;/p&gt;

&lt;p&gt;Requisito previo en Windows: Docker Desktop necesita Hyper-V y Virtual Machine Platform habilitados. Si docker te tira que no detecta virtualización aunque esté prendida en la BIOS, revisá esto (en PowerShell, como administrador):&lt;/p&gt;

&lt;p&gt;powershell&lt;br&gt;
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All -NoRestart&lt;br&gt;
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -All -NoRestart&lt;br&gt;
bcdedit /set hypervisorlaunchtype auto&lt;/p&gt;
&lt;h2&gt;
  
  
  Reiniciar
&lt;/h2&gt;

&lt;p&gt;Con eso resuelto, el stack completo levanta con &lt;code&gt;docker compose up -d&lt;/code&gt;. Las credenciales por defecto del dashboard son &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;SecretPassword&lt;/code&gt; (cambiarlas es obligatorio en un despliegue real, esto es un lab).&lt;/p&gt;
&lt;h2&gt;
  
  
  El agente: acá está el 90% de los problemas reales
&lt;/h2&gt;

&lt;p&gt;Levantar el stack central es la parte fácil. Lo que realmente cuesta — y donde se pierde más tiempo — es lograr que el agente &lt;strong&gt;realmente&lt;/strong&gt; te mande los eventos que esperás.&lt;/p&gt;

&lt;p&gt;Usé un contenedor &lt;code&gt;wazuh/wazuh-agent:4.14.7&lt;/code&gt; sobre una base &lt;code&gt;amazonlinux:2023&lt;/code&gt; simulando el servidor a monitorear, enrolado contra el manager vía el bloque &lt;code&gt;&amp;lt;client&amp;gt;&amp;lt;server&amp;gt;&lt;/code&gt; de &lt;code&gt;ossec.conf&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Problema 1: el agente no mandaba nada
&lt;/h3&gt;

&lt;p&gt;Primer bug real: &lt;strong&gt;rsyslog&lt;/strong&gt; en el contenedor tenía &lt;code&gt;imuxsock SysSock.Use="off"&lt;/code&gt; en su config. Como el contenedor no tiene systemd/journald corriendo, la ruta basada en journal quedaba vacía — el agente no tenía de dónde leer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/SysSock.Use="off"/SysSock.Use="on"/'&lt;/span&gt; /etc/rsyslog.conf
&lt;span class="c"&gt;# reiniciar rsyslogd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Problema 2: seguía sin monitorear el log correcto
&lt;/h3&gt;

&lt;p&gt;Después de arreglar rsyslog, seguía sin aparecer nada. Revisando el propio &lt;code&gt;ossec.log&lt;/code&gt; del agente, confirmé que nunca hubo una directiva &lt;code&gt;&amp;lt;localfile&amp;gt;&lt;/code&gt; apuntando a &lt;code&gt;/var/log/secure&lt;/code&gt; — el agente solo monitoreaba comandos y &lt;code&gt;active-responses.log&lt;/code&gt; por defecto. Hubo que agregar explícitamente el bloque de monitoreo del log de autenticación y reiniciar.&lt;/p&gt;

&lt;p&gt;Esta parte es la que más vale la pena remarcar: la documentación te dice cómo instalar el agente, no necesariamente qué vas a estar monitoreando realmente por default. Vale la pena verificar &lt;code&gt;ossec.log&lt;/code&gt; en cualquier despliegue nuevo antes de asumir que "ya está andando".&lt;/p&gt;

&lt;h2&gt;
  
  
  Las reglas: cómo Wazuh arma la alerta de fuerza bruta
&lt;/h2&gt;

&lt;p&gt;Un intento de login fallido individual genera una alerta de nivel bajo (regla &lt;code&gt;5760&lt;/code&gt;, sshd auth failed). Eso solo no dice mucho — cualquiera se equivoca tipeando una contraseña.&lt;/p&gt;

&lt;p&gt;Lo interesante es la correlación: cuando Wazuh detecta varios intentos fallidos consecutivos desde el mismo origen en una ventana corta de tiempo, dispara la regla &lt;code&gt;2502&lt;/code&gt;, nivel 10 — fuerza bruta confirmada. Esto requiere al menos 3 intentos fallidos consecutivos para activarse; con 1 o 2 no correlaciona (lo confirmé revisando &lt;code&gt;alerts.log&lt;/code&gt; directo en el manager cuando una prueba con solo 2 intentos no generó la alerta esperada — no era un bug, era el umbral funcionando como debía).&lt;/p&gt;

&lt;p&gt;Otras reglas que entran en juego según el escenario: &lt;code&gt;5557&lt;/code&gt; (unix_chkpwd failed), &lt;code&gt;5501&lt;/code&gt;/&lt;code&gt;5503&lt;/code&gt; (eventos PAM de login), &lt;code&gt;5715&lt;/code&gt; (sshd auth success — importante para detectar el patrón "muchos fallos + un éxito", la firma clásica de una fuerza bruta exitosa).&lt;/p&gt;

&lt;p&gt;Y un detalle que me pareció importante mostrar en la demo: incluso si el atacante corta la conexión a mitad de camino, queda registrado. Nada pasa desapercibido si el sistema está mirando.&lt;/p&gt;

&lt;h2&gt;
  
  
  La demo
&lt;/h2&gt;

&lt;p&gt;Con todo enrolado y las reglas activas, simulé un ataque de fuerza bruta por SSH contra el "servidor" monitoreado. En el Wazuh Dashboard, en tiempo real:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Aparecen los intentos fallidos individuales (regla 5760) uno por uno&lt;/li&gt;
&lt;li&gt;Al tercer intento consecutivo, dispara la alerta de nivel 10 (regla 2502)&lt;/li&gt;
&lt;li&gt;Queda todo el registro navegable — origen, timestamp, usuario probado&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Por qué esto importa para una mipyme
&lt;/h2&gt;

&lt;p&gt;Ninguna de estas herramientas cuesta un dólar en licencias. Lo que cuesta es el tiempo de armarlo bien — y ese es exactamente el punto: una mipyme que recién está construyendo su infraestructura puede tener visibilidad real de sus propios logs sin presupuesto corporativo ni un equipo de seguridad dedicado.**&lt;/p&gt;

&lt;p&gt;No hace falta ser una empresa con SOC 24/7 para dejar de operar a ciegas. Hace falta, como mínimo, saber que el registro existe y que alguien (o algo) lo está mirando.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;El próximo paso en este mismo lab es sumar &lt;strong&gt;respuesta activa&lt;/strong&gt; — que el propio sistema bloquee automáticamente al atacante cuando se dispara la alerta de fuerza bruta, sin que nadie tenga que estar mirando la pantalla en el momento exacto. Ese va a ser el tema del próximo artículo/video.&lt;/p&gt;

&lt;p&gt;¿Tu empresa, por más chica que sea, tiene visibilidad de sus propios logs? Te leo en los comentarios.&lt;/p&gt;

&lt;p&gt;Trabajo en infraestructura TI en Paraguay/Argentina — si te interesa este tipo de contenido (ciberseguridad, networking, infraestructura, todo con foco práctico), conectemos en LinkedIn: &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/santiagoruiz16" rel="noopener noreferrer"&gt;Santiago Ruiz Díaz&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>linux</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
