Por qué Wazuh para el cumplimiento de NIS2 art. 21
El artículo 21 de NIS2 exige cuatro capacidades: registro de eventos, detección de incidentes, respuesta y notificación. Wazuh cubre las tres primeras de forma nativa — recopilación de logs, reglas de detección, respuesta activa — y su panel de control genera los informes de auditoría necesarios para la cuarta. A diferencia de un SIEM SaaS, los datos permanecen en tu infraestructura: sin transferencia a servidores de terceros, lo que también simplifica el cumplimiento del RGPD para entidades que tratan datos personales. La versión 4.14.8 (publicada el 25 de septiembre de 2026) es la versión estable actual.
Wazuh vs alternativas SIEM self-hosted
Desplace la tabla
| Herramienta | Licencia | Stack de despliegue | Cobertura NIS2 art. 21 |
|---|---|---|---|
| Wazuh 4.14 | GPLv2 (manager) / Apache 2 (indexer) | Docker Compose oficial | Registro + detección + respuesta activa |
| Elastic SIEM | SSPL (Elastic Stack) | Docker o paquetes | Registro + detección (respuesta via SOAR externo) |
| Graylog Open | SSPL | Docker Compose | Registro (detección limitada sin plugins) |
| Security Onion | GPLv2 | ISO bare-metal o VM | Cobertura completa pero requiere servidor dedicado |
Requisitos de hardware y software
Los requisitos oficiales para un despliegue single-node que cubra hasta 25 agentes son: 4 vCPU, 8 GB de RAM y 50 GB de almacenamiento (para 90 días de datos indexados). Un VPS de gama media es suficiente para un equipo que monitorice hasta 25 endpoints o servidores; más allá de 50 agentes, pasa a 8 vCPU y considera un volumen adicional. En cuanto al software, necesitas Docker Engine (versión 24 mínimo), Docker Compose v2 y Git. El kernel Linux debe permitir al menos 262.144 áreas de memoria virtual para el indexador.
Qué monitoriza Wazuh en cuanto se activan los agentes
- Monitorización de integridad de ficheros (FIM) — detecta cualquier modificación, creación o eliminación en rutas críticas (
/etc,/bin,/usr/binpor defecto) - Logs del sistema — recopila e indexa logs de autenticación, syslog, journald y logs de aplicación configurados
- Evaluación de configuración (SCA) — compara el estado real del sistema con los benchmarks CIS para Ubuntu, Debian, RHEL y Windows
- Detección de rootkits — analiza procesos ocultos y anomalías del kernel via
rootcheck - Detección de vulnerabilidades — correlaciona los paquetes instalados en los agentes con CVEs de la National Vulnerability Database
- Respuesta activa — bloquea automáticamente una IP tras N intentos de autenticación fallidos, sin agente SOAR externo
- Logs cloud — ingiere eventos de AWS CloudTrail, Azure Activity Log y GCP Audit Log mediante módulos dedicados
Despliegue paso a paso en un VPS Debian/Ubuntu
Preparar el sistema
Actualiza los paquetes e instala las dependencias:
apt update && apt upgrade -y apt install -y docker.io docker-compose-v2 git curl systemctl enable --now dockerAñade tu usuario no-root al grupo docker si es necesario:
usermod -aG docker $USERConfigurar vm.max_map_count
El indexador Wazuh (OpenSearch) requiere al menos 262.144 áreas de memoria virtual. Aplica el parámetro en caliente y hazlo permanente:
sysctl -w vm.max_map_count=262144 echo 'vm.max_map_count=262144' >> /etc/sysctl.confSin este paso, el contenedor
wazuh.indexerse detiene con el errormax virtual memory areas vm.max_map_count [65530] is too low.Clonar el repositorio oficial
Clona la rama correspondiente a la versión estable actual:
git clone https://github.com/wazuh/wazuh-docker.git -b v4.14.8 cd wazuh-docker/single-node/El directorio
single-node/contiene eldocker-compose.ymlprincipal y elgenerate-indexer-certs.ymlnecesario en el siguiente paso.Generar los certificados TLS entre servicios
Wazuh cifra todas las comunicaciones internas. Genera los certificados con la utilidad incluida:
docker compose -f generate-indexer-certs.yml run --rm generatorLos certificados se depositan en
config/wazuh_indexer_ssl_certs/. No los regeneres sin recrear el stack completo.Arrancar el stack
Lanza los tres servicios en segundo plano:
docker compose up -dSigue el arranque en tiempo real:
docker compose logs -fEl indexador necesita unos 60 segundos para estar listo. Espera la línea
Node 'node-1' initializedantes de continuar.Acceder al panel y cambiar la contraseña
Abre
https://IP-DE-TU-VPSen tu navegador. Acepta la advertencia del certificado autofirmado en la primera conexión. Credenciales por defecto: usuarioadmin, contraseñaSecretPassword. Cambia la contraseña inmediatamente desde Security → Internal users → admin → Edit. Para automatización por línea de comandos:docker exec -it single-node-wazuh.manager-1 \ /var/ossec/bin/wazuh-passwords-tool.sh \ -u admin -p 'NuevaContrasena!'Abrir los puertos necesarios en el firewall
En el VPS, permite el tráfico entrante para agentes y el panel:
ufw allow 443/tcp # Panel HTTPS ufw allow 1514/tcp # Agentes (protocolo Wazuh) ufw allow 1515/tcp # Registro de agentes ufw allow 514/udp # Recepción syslog ufw allow 55000/tcp # API REST Wazuh (restringe a tus IPs) ufw enableRestringe el puerto 55000 solo a tus IPs de gestión.
Instalar el agente Wazuh en un servidor a monitorizar
En cada máquina que quieras observar, instala el agente y apúntalo hacia tu VPS. Ejemplo en Debian/Ubuntu:
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --dearmor \ -o /usr/share/keyrings/wazuh.gpg echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] \ https://packages.wazuh.com/4.x/apt/ stable main" \ > /etc/apt/sources.list.d/wazuh.list apt update && apt install -y wazuh-agent WAZUH_MANAGER='IP-DE-TU-VPS' \ WAZUH_AGENT_NAME='tu-servidor-01' \ dpkg-reconfigure wazuh-agent systemctl enable --now wazuh-agentEl agente aparece en el panel bajo Agents a los 30 segundos de su registro.
Lectura adicional — guías relacionadas
Para fortalecer tu postura de seguridad más allá de Wazuh, consulta nuestras guías relacionadas: [nis2-securite-informatique-hebergement-obligations] para las obligaciones legales detalladas, [crowdsec-vs-fail2ban-securite-vps] para el bloqueo colaborativo a nivel de red, y [zitadel-sso-self-hosted-vps] para centralizar la autenticación y reducir la superficie de ataque en tu panel Wazuh.
Arquitectura del stack single-node
El stack Docker Compose oficial despliega tres servicios interdependientes. El manager Wazuh es el núcleo: recibe eventos de los agentes en el puerto 1514, aplica las reglas de detección, activa las respuestas activas y reenvía las alertas al indexador. El indexador Wazuh (OpenSearch) almacena y hace buscables esas alertas; se comunica con el manager en el puerto 9200 y requiere los recursos de kernel propios de un motor de búsqueda. El panel Wazuh expone la interfaz de usuario en el puerto 443 y consulta el indexador por HTTPS. Los tres servicios comparten certificados TLS autofirmados generados en el paso de preparación; modificar uno sin regenerar los demás provoca errores de validación mutua. Los datos persistentes — configuración del manager, cola de alertas, datos del índice — se almacenan en volúmenes Docker con nombre, desacoplados del ciclo de vida de los contenedores.
Configurar la retención y las alertas por email
Por defecto, Wazuh retiene los datos 90 días. Para ajustar la retención, modifica el parámetro max_age en la política ISM del indexador, accesible desde Index Management → Policies en el panel. Puedes ampliar la retención a 180 días para cumplir los requisitos de conservación de logs de NIS2, o reducirla a 30 días en un VPS con almacenamiento limitado. Para alertas por email, edita /var/ossec/etc/ossec.conf en el contenedor manager — añade un bloque <email_notification> con tu servidor SMTP y los niveles de alerta deseados (nivel 7 y superiores para alertas críticas, nivel 5 para incluir alertas medias). Wazuh también permite enviar notificaciones por webhooks a Slack, Teams o PagerDuty a través de su mecanismo de integración. Reinicia el manager tras cada cambio de configuración:
docker compose restart wazuh.managerGenerar informes de cumplimiento NIS2 / GDPR
El panel de Wazuh incluye cuadros de mando dedicados a marcos de cumplimiento: GDPR, PCI DSS, HIPAA y NIST 800-53. Estos cuadros permiten exportar informes PDF que listan los controles cubiertos y los eventos asociados — útiles para justificar tu postura ante un auditor o una autoridad competente NIS2. Para NIS2 específicamente, usa la vista GDPR como base y complétala con las reglas de detección clasificadas por categoría Mitre ATT&CK disponibles en Threat intelligence → Mitre ATT&CK. NIS2 exige notificación en 72 horas tras detectar un incidente significativo: configura alertas de nivel 12 (crítico) para activar una notificación inmediata — Wazuh incluye reglas listas para intentos de explotación de CVE conocidas, movimiento lateral y escalada de privilegios.
Activa la política de contraseñas seguras en Wazuh desde la instalación: en Security → Security settings, marca 'Require complex passwords' y 'Enable audit logging'. Ambas opciones están desactivadas por defecto y deben habilitarse manualmente antes de la puesta en producción.
Actualizar Wazuh sin perder datos
Los datos del indexador se persisten en volúmenes Docker con nombre. El procedimiento de actualización consiste en clonar la nueva versión del repositorio en un directorio separado, copiar los volúmenes existentes y reiniciar el stack. La documentación oficial recomienda hacer una copia de seguridad de los volúmenes antes de cualquier actualización mayor:
docker run --rm \
-v single-node_wazuh-indexer-data:/data \
-v $(pwd)/backup:/backup \
alpine tar czf /backup/indexer-data-$(date +%Y%m%d).tar.gz /dataPara una actualización de versión menor (p.ej. 4.14.7 → 4.14.8), basta con actualizar la etiqueta en docker-compose.yml y reiniciar con docker compose up -d --pull always.
Solución de problemas — errores frecuentes
Aquí están los cinco errores más comunes en un primer despliegue de Wazuh Docker, con sus causas y remedios.
Errores frecuentes y soluciones
max virtual memory areas vm.max_map_count [65530] is too low— El parámetro del kernel no se aplicó. Ejecutasysctl -w vm.max_map_count=262144y verifica consysctl vm.max_map_countantes de reiniciar el stack.Connection refuseden el puerto 443 trasdocker compose up -d— El indexador aún no está listo. Espera 60-90 segundos y consultadocker compose logs wazuh.indexerpara confirmar la inicialización del nodo.Agent disconnectedjusto tras el registro — El puerto 1514/TCP o 1515/TCP está bloqueado en el VPS. Compruebaufw statusy las reglas de seguridad de red de tu proveedor de hosting.certificate verify faileden los logs del panel — Los certificados autogenerados no coinciden con la IP o el hostname utilizado. Regenera los certificados tras verificar queWAZUH_DASHBOARD_HOSTendocker-compose.ymlcoincide con tu IP o nombre de dominio.Wazuh API 401 Unauthorized— El cambio de contraseña deadminno se propagó a la configuración del panel. Tras modificar la contraseña, actualiza tambiénDASHBOARD_PASSWORDen el fichero.envo en las variables de entorno del serviciowazuh.dashboard, y reinicia condocker compose restart wazuh.dashboard.