Wazuh nació como un fork de OSSEC y conserva su estructura (/var/ossec), su formato de reglas y decodificadores y buena parte de su ruleset, pero añade una API REST, detección de vulnerabilidades, inventario de sistema y un panel web propio. En este tutorial migrarás un despliegue de OSSEC a Wazuh 4.x montando un manager nuevo en paralelo en Ubuntu 24.04, trasladando tus reglas y decodificadores personalizados y sustituyendo los agentes uno a uno. Mantener el manager de OSSEC encendido durante la transición te deja siempre un camino de vuelta.

Requisitos previos

Para seguir esta guía necesitas:

  • El servidor OSSEC actual (manager) y acceso sudo a él y a los hosts con agente.
  • Un servidor nuevo con Ubuntu 24.04 LTS para el manager de Wazuh, por ejemplo un VPS de CubePath, con al menos 2 vCPU y 4 GB de RAM (8 GB si también vas a instalar el indexador y el panel en la misma máquina).
  • Un usuario no root con privilegios sudo en todos los equipos.
  • Conectividad desde los agentes al nuevo manager en los puertos TCP 1514 (eventos) y 1515 (registro de agentes).

En la guía se usan estos marcadores, que debes sustituir por tus valores: ossec_server_ip (manager antiguo), wazuh_manager_ip (manager nuevo) y your_user.

Qué cambia al pasar de OSSEC a Wazuh

Antes de empezar conviene saber qué se mantiene y qué no:

ElementoOSSECWazuh 4.x
Directorio base/var/ossec/var/ossec
Control de serviciosossec-controlwazuh-control y systemd (wazuh-manager, wazuh-agent)
Probar reglasossec-logtestwazuh-logtest
Reglas personalizadas/var/ossec/rules/local_rules.xml/var/ossec/etc/rules/local_rules.xml
Decodificadores propios/var/ossec/etc/local_decoder.xml/var/ossec/etc/decoders/local_decoder.xml
Ruleset por defecto/var/ossec/rules//var/ossec/ruleset/rules/
Protocolo de agentesUDP 1514 por defectoTCP 1514 por defecto, registro en TCP 1515
Rango para reglas propias100000 en adelante por convención100000 a 120000 reservado para el usuario

El formato XML de reglas y decodificadores es compatible, así que tus reglas propias normalmente funcionan sin cambios. El archivo ossec.conf completo, en cambio, no debe copiarse tal cual: Wazuh añade y renombra secciones, y es más seguro trasladar solo los bloques que hayas personalizado.

Paso 1: Inventariar la instalación de OSSEC

En el manager de OSSEC, anota la versión instalada. OSSEC la guarda en /etc/ossec-init.conf:

cat /etc/ossec-init.conf
DIRECTORY="/var/ossec"
NAME="OSSEC HIDS"
VERSION="v3.7.0"
DATE="..."
TYPE="server"

Lista los agentes registrados y su estado. Esta lista será tu checklist durante la migración:

sudo /var/ossec/bin/agent_control -l
OSSEC HIDS agent_control. List of available agents:
   ID: 000, Name: ossec-server (server), IP: 127.0.0.1, Active/Local
   ID: 001, Name: web01, IP: 10.0.0.11, Active
   ID: 002, Name: db01, IP: 10.0.0.12, Active

Localiza lo que has personalizado respecto a una instalación limpia: reglas, decodificadores y los bloques de ossec.conf que has tocado (archivos monitorizados, directorios de integridad, respuesta activa, correo):

sudo cat /var/ossec/rules/local_rules.xml
sudo cat /var/ossec/etc/local_decoder.xml
sudo grep -nE '<localfile>|<directories|<active-response>|<email_to>' /var/ossec/etc/ossec.conf

Guarda esta salida; la usarás en el paso 4.

Paso 2: Hacer una copia de seguridad de OSSEC

Empaqueta la configuración, las reglas, las claves de los agentes y el histórico de alertas. El histórico no se puede importar en Wazuh, pero conviene conservarlo por si necesitas consultarlo o por requisitos de auditoría:

sudo tar -czf /root/ossec-backup-$(date +%F).tar.gz \
  /var/ossec/etc /var/ossec/rules /var/ossec/logs/alerts

Comprueba que el archivo existe y no está vacío:

sudo ls -lh /root/ossec-backup-*.tar.gz
-rw-r--r-- 1 root root 184M Sep 25 10:12 /root/ossec-backup-2026-09-25.tar.gz

Copia este archivo fuera del servidor antes de continuar.

Paso 3: Instalar el manager de Wazuh

En el servidor nuevo, importa la clave GPG de Wazuh en /etc/apt/keyrings:

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

Añade el repositorio oficial de la rama 4.x:

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

Instala el manager y arráncalo:

sudo apt update
sudo apt install wazuh-manager
sudo systemctl daemon-reload
sudo systemctl enable --now wazuh-manager

Comprueba que el servicio está activo:

sudo systemctl status wazuh-manager --no-pager
● wazuh-manager.service - Wazuh manager
     Loaded: loaded (/usr/lib/systemd/system/wazuh-manager.service; enabled; preset: enabled)
     Active: active (running) since Thu 2026-09-25 10:20:41 UTC; 8s ago

Abre en UFW los puertos de agentes y de registro (y SSH si aún no lo estaba):

sudo ufw allow OpenSSH
sudo ufw allow 1514/tcp
sudo ufw allow 1515/tcp
sudo ufw enable

Si prefieres limitar el acceso a tu red, usa reglas del tipo sudo ufw allow from 10.0.0.0/24 to any port 1514 proto tcp.

Paso 4: Trasladar reglas y decodificadores personalizados

Copia tus archivos desde el manager de OSSEC a tu directorio personal en el servidor Wazuh. Ejecuta esto en el manager de OSSEC:

sudo cp /var/ossec/rules/local_rules.xml /var/ossec/etc/local_decoder.xml /tmp/
sudo chown "$USER" /tmp/local_rules.xml /tmp/local_decoder.xml
scp /tmp/local_rules.xml /tmp/local_decoder.xml your_user@wazuh_manager_ip:~/

En el servidor Wazuh, instálalos en sus rutas nuevas con el propietario y los permisos que espera el manager:

sudo install -o wazuh -g wazuh -m 0660 ~/local_rules.xml /var/ossec/etc/rules/local_rules.xml
sudo install -o wazuh -g wazuh -m 0660 ~/local_decoder.xml /var/ossec/etc/decoders/local_decoder.xml

Tus reglas suelen depender de reglas base mediante <if_sid>. Comprueba que los identificadores a los que haces referencia existen en el ruleset de Wazuh. Por ejemplo, para la regla 5716 (fallo de autenticación SSH):

grep -rl 'id="5716"' /var/ossec/ruleset/rules/
/var/ossec/ruleset/rules/0095-sshd_rules.xml

Si un identificador no aparece, busca la regla equivalente en /var/ossec/ruleset/rules/ y actualiza tu <if_sid>. Revisa también que todas tus reglas usen identificadores entre 100000 y 120000.

Traslada ahora los bloques personalizados de ossec.conf que anotaste en el paso 1 (por ejemplo <localfile> o <directories> dentro de <syscheck>), añadiéndolos a la sección correspondiente del archivo de Wazuh en lugar de sustituirlo:

sudo nano /var/ossec/etc/ossec.conf

Valida la configuración y las reglas antes de reiniciar:

sudo /var/ossec/bin/wazuh-analysisd -t

Si no hay errores, el comando termina sin mostrar nada. Reinicia el manager:

sudo systemctl restart wazuh-manager

Prueba una regla con wazuh-logtest, que sustituye a ossec-logtest. Arráncalo y pega una línea de log que debería disparar una de tus reglas o una del ruleset:

sudo /var/ossec/bin/wazuh-logtest
Sep 25 10:30:45 web01 sshd[1234]: Failed password for invalid user admin from 203.0.113.50 port 51122 ssh2
**Phase 3: Completed filtering (rules).
	id: '5710'
	level: '5'
	description: 'sshd: Attempt to login using a non-existent user'
	groups: '['syslog', 'sshd', 'authentication_failed', 'invalid_login']'
**Alert to be generated.

Sal con Ctrl+C.

Paso 5: Sustituir los agentes de OSSEC por agentes de Wazuh

El agente de Wazuh se instala en /var/ossec, la misma ruta que el de OSSEC, así que en cada host hay que retirar primero el agente antiguo. Migra un host de prueba, verifica que llegan sus eventos y después repite con el resto.

Detén el agente de OSSEC y guarda una copia de su directorio:

sudo /var/ossec/bin/ossec-control stop
sudo tar -czf /root/ossec-agent-backup-$(date +%F).tar.gz /var/ossec

Si lo instalaste desde un paquete, elimínalo con el gestor de paquetes (por ejemplo sudo apt purge ossec-hids-agent). Si lo compilaste desde el código fuente, mueve el directorio y desactiva el servicio que haya dejado el instalador:

sudo mv /var/ossec /var/ossec.old
systemctl list-unit-files | grep -i ossec

Si el último comando muestra alguna unidad, desactívala con sudo systemctl disable <unidad>.

Añade el repositorio de Wazuh igual que en el paso 3 (clave y archivo wazuh.list) e instala el agente. La variable WAZUH_MANAGER escribe la dirección del manager en la configuración durante la instalación y WAZUH_AGENT_NAME fija el nombre con el que aparecerá:

sudo apt update
sudo WAZUH_MANAGER="wazuh_manager_ip" WAZUH_AGENT_NAME="web01" apt install wazuh-agent
sudo systemctl daemon-reload
sudo systemctl enable --now wazuh-agent

El agente se registra automáticamente contra el manager en el puerto 1515 al arrancar; ya no hace falta manage_agents ni copiar claves a mano.

En hosts con Rocky Linux 9, el repositorio se define así en /etc/yum.repos.d/wazuh.repo:

sudo rpm --import https://packages.wazuh.com/key/GPG-KEY-WAZUH
sudo nano /etc/yum.repos.d/wazuh.repo
[wazuh]
gpgcheck=1
gpgkey=https://packages.wazuh.com/key/GPG-KEY-WAZUH
enabled=1
name=EL-$releasever - Wazuh
baseurl=https://packages.wazuh.com/4.x/yum/
protocol=https

Después instala con sudo WAZUH_MANAGER="wazuh_manager_ip" dnf install wazuh-agent y arranca el servicio del mismo modo.

Para evitar que una actualización rutinaria del sistema instale una versión del agente más nueva que la del manager, bloquea el paquete y actualízalo de forma controlada:

sudo apt-mark hold wazuh-agent

Si migras decenas de hosts, automatiza exactamente estos pasos con tu herramienta de gestión de configuración (Ansible, por ejemplo) en lugar de un bucle SSH improvisado.

Paso 6: Verificar la migración

En el manager de Wazuh, comprueba que el agente aparece como activo:

sudo /var/ossec/bin/agent_control -l
Wazuh agent_control. List of available agents:
   ID: 000, Name: wazuh-server (server), IP: 127.0.0.1, Active/Local
   ID: 001, Name: web01, IP: any, Active

Genera un evento real en el agente, por ejemplo un intento fallido de SSH con un usuario inexistente, y comprueba que la alerta llega al manager:

sudo tail -f /var/ossec/logs/alerts/alerts.log
** Alert 1758796245.12345: - syslog,sshd,authentication_failed,invalid_login,
2026 Sep 25 10:45:12 (web01) any->/var/log/auth.log
Rule: 5710 (level 5) -> 'sshd: Attempt to login using a non-existent user'

Cuando todos los agentes de tu lista del paso 1 aparezcan como Active en Wazuh y el de OSSEC ya no reciba eventos, puedes apagar el manager antiguo. Conserva la copia de seguridad del paso 2 el tiempo que exija tu política de retención.

Solución de problemas

El agente no se registra o aparece como Never connected. Comprueba desde el agente que llega a los puertos del manager y revisa su log:

nc -zv wazuh_manager_ip 1514
nc -zv wazuh_manager_ip 1515
sudo tail -n 50 /var/ossec/logs/ossec.log

Un error de conexión suele ser el firewall; un mensaje de nombre duplicado indica que ya existe un agente registrado con ese nombre, que puedes eliminar en el manager con sudo /var/ossec/bin/manage_agents -r <ID>.

El manager no arranca tras copiar las reglas. Ejecuta sudo /var/ossec/bin/wazuh-analysisd -t: el error indica el archivo y la regla problemática, normalmente un identificador duplicado con el ruleset o un <if_sid> que ya no existe. También puedes revisar sudo tail -n 50 /var/ossec/logs/ossec.log.

Una regla propia no salta en wazuh-logtest. Mira en la fase 2 qué decodificador se aplica. Si tu regla dependía de un decodificador propio de OSSEC, asegúrate de que está en /var/ossec/etc/decoders/local_decoder.xml y de que su nombre no choca con uno del ruleset de Wazuh.

Conclusión

Has instalado un manager de Wazuh en paralelo al de OSSEC, trasladado tus reglas y decodificadores, validado que siguen funcionando con wazuh-logtest y sustituido los agentes sin perder la monitorización. A partir de aquí puedes instalar el indexador y el panel web de Wazuh para consultar las alertas desde el navegador, activar la detección de vulnerabilidades y revisar las comprobaciones de configuración (SCA) que Wazuh ejecuta en cada agente.