Tutorial

Self-host Wazuh en VPS: SOC completo en menos de una hora

Seguridad y monitorización9 min de lectura9 pasos

La directiva NIS2 obliga a las entidades esenciales e importantes a implantar herramientas de registro, monitorización y respuesta a incidentes (artículo 21). Al mismo tiempo, los CVE recientes en Jira, Confluence y GitLab recuerdan que un perímetro no observado es un perímetro comprometido en silencio. Wazuh es un SIEM open source activo que cubre exactamente estos tres requisitos, y su distribución Docker Compose oficial permite desplegarlo en un único nodo VPS en menos de una hora, sin experiencia previa en infraestructura de seguridad.

Contenido· Por qué Wazuh para el cumplimiento de NIS2 art. 211/11
  1. 01Por qué Wazuh para el cumplimiento de NIS2 art. 21
  2. 02Wazuh vs alternativas SIEM self-hosted
  3. 03Requisitos de hardware y software
  4. 04Qué monitoriza Wazuh en cuanto se activan los agentes
  5. 05Despliegue paso a paso en un VPS Debian/Ubuntu
  6. 06Arquitectura del stack single-node
  7. 07Configurar la retención y las alertas por email
  8. 08Generar informes de cumplimiento NIS2 / GDPR
  9. 09Actualizar Wazuh sin perder datos
  10. 10Solución de problemas — errores frecuentes
  11. 11Errores frecuentes y soluciones

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

HerramientaLicenciaStack de despliegueCobertura NIS2 art. 21
Wazuh 4.14GPLv2 (manager) / Apache 2 (indexer)Docker Compose oficialRegistro + detección + respuesta activa
Elastic SIEMSSPL (Elastic Stack)Docker o paquetesRegistro + detección (respuesta via SOAR externo)
Graylog OpenSSPLDocker ComposeRegistro (detección limitada sin plugins)
Security OnionGPLv2ISO bare-metal o VMCobertura 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/bin por 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

  1. 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 docker

    Añade tu usuario no-root al grupo docker si es necesario:

    usermod -aG docker $USER
  2. Configurar 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.conf

    Sin este paso, el contenedor wazuh.indexer se detiene con el error max virtual memory areas vm.max_map_count [65530] is too low.

  3. 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 el docker-compose.yml principal y el generate-indexer-certs.yml necesario en el siguiente paso.

  4. 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 generator

    Los certificados se depositan en config/wazuh_indexer_ssl_certs/. No los regeneres sin recrear el stack completo.

  5. Arrancar el stack

    Lanza los tres servicios en segundo plano:

    docker compose up -d

    Sigue el arranque en tiempo real:

    docker compose logs -f

    El indexador necesita unos 60 segundos para estar listo. Espera la línea Node 'node-1' initialized antes de continuar.

  6. Acceder al panel y cambiar la contraseña

    Abre https://IP-DE-TU-VPS en tu navegador. Acepta la advertencia del certificado autofirmado en la primera conexión. Credenciales por defecto: usuario admin, contraseña SecretPassword. 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!'
  7. 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 enable

    Restringe el puerto 55000 solo a tus IPs de gestión.

  8. 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-agent

    El agente aparece en el panel bajo Agents a los 30 segundos de su registro.

  9. 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.manager

Generar 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 /data

Para 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ó. Ejecuta sysctl -w vm.max_map_count=262144 y verifica con sysctl vm.max_map_count antes de reiniciar el stack.
  • Connection refused en el puerto 443 tras docker compose up -d — El indexador aún no está listo. Espera 60-90 segundos y consulta docker compose logs wazuh.indexer para confirmar la inicialización del nodo.
  • Agent disconnected justo tras el registro — El puerto 1514/TCP o 1515/TCP está bloqueado en el VPS. Comprueba ufw status y las reglas de seguridad de red de tu proveedor de hosting.
  • certificate verify failed en los logs del panel — Los certificados autogenerados no coinciden con la IP o el hostname utilizado. Regenera los certificados tras verificar que WAZUH_DASHBOARD_HOST en docker-compose.yml coincide con tu IP o nombre de dominio.
  • Wazuh API 401 Unauthorized — El cambio de contraseña de admin no se propagó a la configuración del panel. Tras modificar la contraseña, actualiza también DASHBOARD_PASSWORD en el fichero .env o en las variables de entorno del servicio wazuh.dashboard, y reinicia con docker compose restart wazuh.dashboard.

Un VPS diseñado para Wazuh

Nuestros VPS profesionales incluyen configuraciones optimizadas para cargas de trabajo SIEM: 8 vCPU, 16 GB de RAM, almacenamiento NVMe rápido y red aislada. Despliega Wazuh en producción con el ancho de banda y los recursos que merece.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva