Wazuh es una plataforma libre de seguridad (SIEM y XDR) que recoge y analiza logs de tus servidores, vigila la integridad de ficheros, detecta paquetes con vulnerabilidades conocidas y evalúa la configuración frente a benchmarks como CIS. Tiene tres componentes centrales: el indexer, basado en OpenSearch, que almacena los eventos; el manager (o server), que analiza lo que envían los agentes y genera alertas; y el dashboard, la interfaz web. En este tutorial instalarás los tres en un único servidor Ubuntu 24.04 con el asistente oficial, registrarás un agente en otro servidor Linux y crearás una regla propia.
Requisitos previos
Para seguir esta guía necesitas:
- Un servidor para Wazuh con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 4 vCPU, 8 GB de RAM y 50 GB de disco. Para decenas de agentes o retenciones largas necesitarás más disco.
- Un segundo servidor Linux (Ubuntu 24.04 en los ejemplos) que quieras monitorizar.
- Un usuario no root con privilegios
sudoen ambos. - UFW activo en el servidor de Wazuh, o el cortafuegos que uses, con acceso SSH permitido.
En esta guía, your_server_ip es la IP del servidor de Wazuh y your_admin_ip la IP pública desde la que accederás al dashboard.
Paso 1: Abrir los puertos necesarios
Los agentes se comunican con el manager por el puerto 1514/tcp y se registran por el 1515/tcp. El dashboard escucha en el 443/tcp; limítalo a tu IP de administración:
sudo ufw allow 1514/tcp
sudo ufw allow 1515/tcp
sudo ufw allow from your_admin_ip to any port 443 proto tcp
Comprueba las reglas:
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
1514/tcp ALLOW Anywhere
1515/tcp ALLOW Anywhere
443/tcp ALLOW 198.51.100.20
Si todos tus agentes están en direcciones conocidas, restringe también 1514 y 1515 a esas IP o redes.
Paso 2: Descargar el asistente de instalación
Wazuh proporciona un script, wazuh-install.sh, que instala y configura los tres componentes, genera los certificados TLS y crea contraseñas aleatorias. La URL incluye la versión menor; consulta la versión actual en la documentación de Wazuh y sustituye 4.14 si ha cambiado:
curl -sO https://packages.wazuh.com/4.14/wazuh-install.sh
Échale un vistazo antes de ejecutarlo con privilegios de root:
less wazuh-install.sh
Paso 3: Instalar Wazuh en modo all-in-one
La opción -a instala indexer, manager y dashboard en este mismo servidor:
sudo bash wazuh-install.sh -a
La instalación tarda varios minutos. Al terminar, el script muestra las credenciales del dashboard:
INFO: --- Summary ---
INFO: You can access the web interface https://<wazuh-dashboard-ip>:443
User: admin
Password: 3xAmPl3.P4ssw0rd*K2
INFO: Installation finished.
Guarda esa contraseña en tu gestor de contraseñas. El resto de credenciales internas están en wazuh-install-files.tar, en el directorio donde ejecutaste el script. Puedes consultarlas así:
sudo tar -O -xf wazuh-install-files.tar wazuh-install-files/wazuh-passwords.txt
Mueve ese fichero a un lugar protegido o bórralo cuando hayas guardado las contraseñas.
Comprueba que los tres servicios están activos:
systemctl is-active wazuh-indexer wazuh-manager wazuh-dashboard
active
active
active
Notasi el script se detiene porque el servidor no cumple los requisitos mínimos, puedes forzar la instalación con la opción
-i, pero en producción es mejor ampliar el servidor: el indexer necesita memoria para funcionar con fluidez.
Paso 4: Evitar actualizaciones accidentales
El asistente deja configurado el repositorio de Wazuh. Si un apt upgrade actualizara solo uno de los componentes, podrían quedar versiones incompatibles entre sí. La documentación oficial recomienda desactivar el repositorio y actualizar Wazuh de forma planificada:
sudo sed -i 's/^deb /#deb /' /etc/apt/sources.list.d/wazuh.list
sudo apt update
Cuando quieras actualizar, vuelve a descomentar la línea y sigue la guía de actualización de Wazuh para la versión de destino.
Paso 5: Acceder al dashboard
Abre https://your_server_ip en el navegador. El certificado es autofirmado, así que tendrás que aceptar la advertencia. Inicia sesión con el usuario admin y la contraseña del paso 3.
En el menú verás los módulos principales: Threat Hunting (alertas), File Integrity Monitoring, Vulnerability Detection, Configuration Assessment y las vistas de cumplimiento normativo (PCI DSS, GDPR, HIPAA, NIST 800-53). Todavía estarán vacías porque no hay agentes conectados.
Paso 6: Instalar un agente en otro servidor
Conéctate por SSH al servidor que quieres monitorizar. Añade la clave y el repositorio de Wazuh:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://packages.wazuh.com/key/GPG-KEY-WAZUH | sudo gpg --dearmor -o /etc/apt/keyrings/wazuh.gpg
echo "deb [signed-by=/etc/apt/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | sudo tee /etc/apt/sources.list.d/wazuh.list
sudo apt update
Instala el agente indicando la IP del manager y un nombre para el agente. Las variables de entorno se aplican durante la instalación y dejan escrita la configuración en /var/ossec/etc/ossec.conf:
sudo WAZUH_MANAGER="your_server_ip" WAZUH_AGENT_NAME="web01" apt install -y wazuh-agent
El agente no debe tener una versión superior a la del manager. Desactiva también aquí el repositorio para que apt upgrade no lo actualice por su cuenta:
sudo sed -i 's/^deb /#deb /' /etc/apt/sources.list.d/wazuh.list
sudo apt update
Habilita y arranca el servicio:
sudo systemctl daemon-reload
sudo systemctl enable --now wazuh-agent
Comprueba en el log del agente que se ha registrado y conectado:
sudo grep -E 'Valid key|Connected to the server' /var/ossec/logs/ossec.log
2026/09/25 11:02:14 wazuh-agentd: INFO: Valid key received
2026/09/25 11:02:18 wazuh-agentd: INFO: (4102): Connected to the server ([your_server_ip]:1514/tcp).
De vuelta en el servidor de Wazuh, lista los agentes:
sudo /var/ossec/bin/agent_control -l
Wazuh agent_control. List of available agents:
ID: 000, Name: wazuh (server), IP: 127.0.0.1, Active/Local
ID: 001, Name: web01, IP: any, Active
A los pocos minutos el agente aparecerá también en el dashboard, en Agents management > Summary. Con la configuración por defecto ya envía los logs del sistema (/var/log/auth.log, /var/log/syslog, dpkg), vigila la integridad de directorios como /etc, /bin y /usr/bin, ejecuta la evaluación de configuración CIS e informa de los paquetes instalados para la detección de vulnerabilidades.
Paso 7: Monitorizar un log adicional
Para que el agente lea un log de aplicación, añade un bloque <localfile> a su configuración. En el servidor del agente:
sudo nano /var/ossec/etc/ossec.conf
Añade este bloque dentro de <ossec_config>, junto a los demás <localfile>. En este ejemplo se monitoriza el log de acceso de Nginx:
<localfile>
<log_format>apache</log_format>
<location>/var/log/nginx/access.log</location>
</localfile>
El formato apache sirve para el formato combinado que usan tanto Apache como Nginx. Reinicia el agente y comprueba que no hay errores:
sudo systemctl restart wazuh-agent
sudo grep -i 'nginx/access.log' /var/ossec/logs/ossec.log
2026/09/25 11:10:41 wazuh-logcollector: INFO: (1950): Analyzing file: '/var/log/nginx/access.log'.
Paso 8: Crear una regla propia
Las reglas propias se guardan en el manager, en /var/ossec/etc/rules/local_rules.xml, y deben usar identificadores a partir de 100000. Como ejemplo, esta regla eleva a nivel 10 cualquier fallo de autenticación SSH contra el usuario root, algo que en un servidor con el login de root desactivado indica un ataque. En el servidor de Wazuh:
sudo nano /var/ossec/etc/rules/local_rules.xml
Añade al final del fichero:
<group name="local,sshd,">
<rule id="100100" level="10">
<if_group>authentication_failed</if_group>
<program_name>sshd</program_name>
<user>root</user>
<description>sshd: intento de login fallido como root desde $(srcip).</description>
<group>authentication_failed,</group>
</rule>
</group>
Antes de reiniciar, prueba la regla con wazuh-logtest, que procesa una línea de log igual que lo haría el manager:
sudo /var/ossec/bin/wazuh-logtest
Pega una línea de ejemplo y pulsa Intro:
Sep 25 11:20:01 web01 sshd[2211]: Failed password for root from 203.0.113.45 port 51122 ssh2
La fase 3 debe mostrar tu regla:
**Phase 3: Completed filtering (rules).
id: '100100'
level: '10'
description: 'sshd: intento de login fallido como root desde 203.0.113.45.'
groups: '['local', 'sshd', 'authentication_failed']'
firedtimes: '1'
mail: 'False'
**Alert to be generated.
Sal con Ctrl+C y reinicia el manager para cargar la regla:
sudo systemctl restart wazuh-manager
Si el manager no arranca, el error de sintaxis aparecerá en /var/ossec/logs/ossec.log. A partir de ahora, estas alertas aparecerán en Threat Hunting del dashboard con nivel 10.
Paso 9: Consultar alertas desde la línea de comandos
Además del dashboard, el manager escribe todas las alertas en /var/ossec/logs/alerts/alerts.json, un evento JSON por línea. Es útil para comprobaciones rápidas o para enviarlas a otra herramienta. Instala jq y muestra las últimas alertas de nivel 7 o superior:
sudo apt install -y jq
sudo tail -n 500 /var/ossec/logs/alerts/alerts.json | jq -r 'select(.rule.level >= 7) | [.timestamp, .agent.name, .rule.id, .rule.description] | @tsv'
2026-09-25T11:21:07.412+0000 web01 100100 sshd: intento de login fallido como root desde 203.0.113.45.
Solución de problemas
- El agente no se registra (
Unable to connect to enrollment service): comprueba desde el agente que llega al puerto 1515 del manager connc -zv your_server_ip 1515y revisa las reglas de UFW del paso 1. - El agente aparece como
Disconnected: suele ser el puerto 1514 bloqueado o una IP de manager incorrecta en el bloque<client>de/var/ossec/etc/ossec.confdel agente. - El dashboard muestra
Wazuh dashboard server is not ready yet: el indexer aún está arrancando o se ha quedado sin memoria. Revisasudo journalctl -u wazuh-indexeryfree -h. - El disco se llena: el indexer guarda un índice por día. Configura una política de retención (Index State Management) en el dashboard para borrar índices antiguos de
wazuh-alerts-*.
Conclusión
Has desplegado Wazuh en un único servidor con indexer, manager y dashboard, has conectado un agente Linux, has añadido un log de aplicación y has creado y probado una regla propia. Como siguientes pasos, puedes activar respuestas activas para bloquear IPs automáticamente, configurar notificaciones por correo o integraciones con Slack, y revisar los resultados de Vulnerability Detection y Configuration Assessment de cada agente para priorizar parches.
