Monitorear la seguridad de una infraestructura de servidores mediante la lectura manual de archivos de registro (logs) en /var/log/ o el Visor de Eventos de Windows es inviable en entornos corporativos modernos.
Para cumplir con normativas estrictas de protección de datos (como NIS2 o ISO 27001) y detectar accesos no autorizados, escaladas de privilegios o ataques de fuerza bruta en tiempo real, es obligatorio implementar un sistema SIEM (Security Information and Event Management) y XDR (Extended Detection and Response). Wazuh se ha consolidado como el estándar Open Source indiscutible en este sector. Sin embargo, su consola web solo es útil si alguien la está mirando constantemente. La verdadera capacidad operativa se logra cuando el motor de correlación de reglas dispara alertas inmediatas directamente a un canal privado de Telegram ante eventos de severidad crítica. Puedes desplegar este servidor central dentro de una máquina virtual optimizada siguiendo nuestra Guía de virtualización en Proxmox VE 8.
// EJECUCIÓN RÁPIDA (TL;DR) – DESPLIEGUE EN 3 COMANDOS
# 1. Instalación desatendida de Wazuh All-in-One (Ubuntu 22.04 / 24.04 LTS):
curl -sO https://packages.wazuh.com/4.8/wazuh-install.sh && sudo bash ./wazuh-install.sh -a
# 2. Guardar credenciales de acceso inicial:Al finalizar, el instalador generará el archivo “wazuh-passwords.txt” con la clave de ‘admin’.
# 3. Integración con Telegram:Colocar script custom-telegram en /var/ossec/integrations/ y declarar el hook en /var/ossec/etc/ossec.conf.
1. Requisitos de Infraestructura para el Servidor Wazuh
Wazuh consta de tres componentes clave: Wazuh Indexer (motor de búsqueda basado en OpenSearch), Wazuh Server (motor de análisis y correlación) y Wazuh Dashboard (interfaz gráfica web). Para un despliegue todo-en-uno que gestione entre 10 y 100 agentes monitorizados, el servidor requiere:
- CPU: 4 núcleos dedicados (mínimo).
- Memoria RAM: 8 GB (mínimo indispensable para que el Indexer de Java no colapse).
- Almacenamiento: 50 GB SSD/NVMe (los índices de seguridad consumen espacio de forma intensiva).
- Sistema Operativo: Ubuntu Server 22.04 / 24.04 LTS o Debian 12 limpio.
2. Creación del Bot y Canal en Telegram
Para recibir las alertas sin depender de servicios de mensajería de pago, utilizaremos la API oficial de Telegram:
- En Telegram, busca el contacto oficial
@BotFathery escribe el comando:/newbot. - Asigna un nombre a tu bot (ejemplo: Wazuh SOC Alerts) y un usuario único que termine en
bot. - BotFather te devolverá el API Token (una cadena similar a
7123456789:AAH...). Guárdalo celosamente. - Crea un grupo o canal privado en Telegram, añade al bot recién creado como Administrador y envía un mensaje de prueba al chat (por ejemplo, “Hola”).
- Obtén el Chat ID de tu grupo accediendo en tu navegador a:
https://api.telegram.org/bot<TU_API_TOKEN>/getUpdatesBusca en el JSON la clave"chat":{"id": -100XXXXXXXXXX}. Ese número negativo es tu Chat ID.
3. Desarrollo del Script de Integración en Python
Wazuh permite inyectar scripts personalizados en su pipeline de alertas mediante el protocolo de integración de eventos. Crea el archivo ejecutable en el servidor Wazuh Manager:
sudo nano /var/ossec/integrations/custom-telegram
Pega el siguiente código en Python 3 puro (sin dependencias externas pesadas):
#!/usr/bin/env python3
import sys
import json
import requests
# Parámetros pasados automáticamente por Wazuh:
# sys.argv[1]: Ruta del archivo temporal JSON que contiene la alerta
# sys.argv[2]: Clave de API Token
# sys.argv[3]: Parámetro extra (Chat ID)
alert_file = sys.argv[1]
token = sys.argv[2]
chat_id = sys.argv[3]
with open(alert_file) as f:
alert = json.load(f)
# Extraer metadatos críticos del evento
rule = alert.get('rule', {})
level = rule.get('level', 0)
description = rule.get('description', 'Sin descripción')
agent = alert.get('agent', {})
agent_name = agent.get('name', 'Servidor Local')
agent_ip = agent.get('ip', 'N/A')
# Construir mensaje con formato Markdown para Telegram
message = (
f"🚨 *ALERTA WAZUH SIEM (Nivel {level})*\n"
f"━━━━━━━━━━━━━━━━━━━\n"
f"📌 *Regla:* {description}\n"
f"🖥 *Host:* `{agent_name}` (`{agent_ip}`)\n"
f"ID de Regla: `{rule.get('id', 'N/A')}`\n"
)
telegram_url = f"https://api.telegram.org/bot{token}/sendMessage"
payload = {
'chat_id': chat_id,
'text': message,
'parse_mode': 'Markdown'
}
try:
requests.post(telegram_url, json=payload, timeout=10)
except Exception as e:
sys.exit(1)
sys.exit(0)
Asegúrate de conceder permisos de ejecución y cambiar la propiedad al usuario interno de Wazuh:
sudo chmod 750 /var/ossec/integrations/custom-telegram
sudo chown root:ossec /var/ossec/integrations/custom-telegram
4. Declaración de la Integración en ‘ossec.conf’
Ahora debemos instruir a Wazuh para que dispare este script cada vez que una alerta supere el umbral de severidad corporativo (recomendado: Nivel 7 o superior para evitar spam de notificaciones informativas).
- Edita el archivo de configuración central:
sudo nano /var/ossec/etc/ossec.conf - Busca la etiqueta de cierre
</ossec_config>al final del archivo y añade justo antes el bloque de integración:<integration> <name>custom-telegram</name> <api_key>TU_API_TOKEN_DE_TELEGRAM</api_key> <hook_url>TU_CHAT_ID_NEGATIVO</hook_url> <level>7</level> <alert_format>json</alert_format> </integration> - Reinicia el motor de Wazuh Manager para aplicar los cambios:
sudo systemctl restart wazuh-manager
5. Prueba de Simulación de Ataque (Validación End-to-End)
Para comprobar que la cadena de notificación funciona, conéctate a un servidor monitorizado por el agente de Wazuh e intenta realizar 5 intentos fallidos de inicio de sesión por SSH con un usuario falso:
ssh usuario-inexistente@IP_DEL_AGENTE
En menos de 3 segundos, el motor correlacionará los fallos consecutivos en /var/log/auth.log, disparará la regla 5710: Attempt to login using a non-existent user (Nivel 5) o 5712: Multiple connection attempts (Nivel 10) y recibirás el aviso en tu canal de Telegram con el nombre del host y la IP atacante.
Monitoreo en Entornos Críticos
Wazuh también cuenta con agentes específicos para sistemas Windows. Si gestionas servidores de identidad empresarial, puedes auditar eventos de autenticación Kerberos y fallos de sincronización como el error 1722 del Servidor RPC en Active Directory. Asimismo, si monitorizas bases de datos relacionales, Wazuh alertará ante bloqueos catastróficos que requieran aplicar el procedimiento para reparar bases de datos MySQL InnoDB corruptas.
Para asegurar que las comunicaciones entre tus agentes y el servidor SIEM viajen por un túnel cifrado privado sin exponer puertos a Internet, considera implementar nuestra guía para desplegar un servidor VPN con WireGuard y UFW.
Preguntas Frecuentes
¿Por qué no recibo alertas en Telegram aunque el script funcione manualmente?
Revisa el archivo de log interno de integraciones: grep custom-telegram /var/ossec/logs/ossec.log. El fallo más común es que el usuario del sistema ossec no tiene instalado el paquete requests de Python. Soluciónalo ejecutando: sudo apt install python3-requests -y.
¿Wazuh puede bloquear IPs automáticamente además de enviar alertas?
Sí. Mediante el módulo Active Response de Wazuh, puedes configurar el sistema para que, al detectar ataques de fuerza bruta o escaneos de puertos, ejecute automáticamente una regla de bloqueo en iptables, nftables o Windows Firewall de forma inmediata en el nodo afectado.
Manual técnico de ciberseguridad corporativa e integración de eventos elaborado por Gustavo Dulcey, Ingeniero de Sistemas especializado en Arquitecturas SIEM y Hardening de Servidores.