Sentinel
Agente de IA autónomo para monitoreo de seguridad 24/7 en un VPS de producción con 14 dominios activos, cPanel/WHM y múltiples aplicaciones web. Lo construí después de encontrar malware activo en producción que las herramientas estándar no habían detectado.
Malware en producción que nadie había detectado
En 2025 encontré malware activo en el VPS de producción de bitmovil.mx — un servidor con 14 dominios, cPanel/WHM y múltiples aplicaciones web. No fue una brecha nueva: llevaba tiempo ahí. ClamAV y las herramientas integradas de cPanel no lo habían detectado.
Los hallazgos: webshells en directorios de uploads, un backdoor en un usuario de base de datos MySQL, y fileless malware ejecutando en un proceso PHP-FPM. Todas las alertas de cPanel existentes generaban demasiado ruido para ser procesables.
- — ClamAV no detecta fileless malware ni backdoors ofuscados en archivos PHP legítimos
- — Las alertas de CSF son demasiado ruidosas — cientos de notificaciones por día, imposible procesar
- — Los SIEMs comerciales cuestan $500+/mes y están diseñados para redes empresariales, no VPS con cPanel
- — cPanel Imunify360 detecta algunos patrones pero no correlaciona eventos entre sí
Diseño del agente
Sentinel corre como daemon Python en el servidor. No es un script de cron — es un proceso persistente con estado que correlaciona eventos a lo largo del tiempo.
Logs del servidor (ModSecurity, CSF, auth.log, Apache)
↓
Sentinel Agent (Python, daemon)
├── Parser de logs
│ └── Normalización de formato por fuente
├── Motor de detección
│ ├── Reglas estáticas (patrones conocidos)
│ └── Claude API → análisis de anomalías
├── Clasificador de severidad
│ └── CRÍTICO / ALTO / MEDIO / INFO
└── Orchestrator de acciones
├── Telegram Bot → alerta procesable al operador
├── CSF API → bloqueo automático de IPs
└── cPanel UAPI → cuarentena de archivosAcceso nativo a archivos de sistema, librerías maduras para procesamiento de texto, y la velocidad de desarrollo justifica la penalización de performance vs C/Rust para este caso.
La clasificación de eventos requiere baja latencia. Haiku responde en <500ms con costo mínimo. Para análisis de incidentes profundos, se escala a Sonnet manualmente.
Las alertas de email se pierden en el ruido. Telegram entrega push notifications en tiempo real al móvil. Las alertas CRÍTICAS despiertan. Las demás esperan.
CSF es el firewall estándar en cPanel. Tiene su propia API para bloquear IPs sin romper las reglas existentes. iptables directo puede romper configuraciones de cPanel.
Fragmentos representativos
No publico el repo completo — el agente tiene conocimiento del servidor de producción. Pero estos fragmentos documentan los patrones de diseño que hacen funcionar el sistema.
# Parser de log ModSecurity (fragmento)
def parse_modsec_entry(log_line: str) -> dict | None:
"""
ModSecurity escribe en formato no estándar.
Extraemos: IP origen, regla activada, URI, severidad.
"""
pattern = r'\[client (\S+)\].*?id "(\d+)".*?msg "(.*?)".*?severity "(\w+)"'
match = re.search(pattern, log_line)
if not match:
return None
return {
"source_ip": match.group(1),
"rule_id": match.group(2),
"message": match.group(3),
"severity": match.group(4),
"raw": log_line,
}# Clasificador de severidad con Claude API (fragmento)
SYSTEM_PROMPT = """
Eres un analista de seguridad senior especializado en VPS Linux con cPanel.
Recibes entradas de log normalizadas de múltiples fuentes.
Clasifica cada entrada: CRÍTICO, ALTO, MEDIO, INFO.
Responde en JSON. No expliques — solo clasifica y da contexto en 1 línea.
"""
def classify_event(event: dict) -> dict:
response = client.messages.create(
model="claude-haiku-4-5", # Haiku para latencia baja
max_tokens=200,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": json.dumps(event)}]
)
return json.loads(response.content[0].text)Casos reales (IPs ofuscadas)
Archivo PHP con patrón de ejecución ofuscada (base64) en /wp-content/uploads/2024/. Detección: ModSecurity rule 932100 + análisis de contenido por Claude. Acción: cuarentena automática vía cPanel UAPI + alerta inmediata.
Usuario "wp_backup" con GRANT ALL en todas las tablas, no creado por ninguna aplicación conocida. Detección: análisis de auth.log + correlación con cambios recientes de permisos. Acción: alerta CRÍTICO + escalamiento a revisión manual.
847 intentos en 3 minutos desde 185.234.x.x. Detección: parser de auth.log, umbral de 50 intentos/minuto. Acción: bloqueo automático vía CSF, sin intervención humana.
Patrón de User-Agent y secuencia de requests característicos de OWASP ZAP scanner. Detectado por correlación de ModSecurity + análisis de patrones. Bloqueado en CSF. Nota: Sentinel también detecta sus propios escaneos de auditoría.
Números reales
Lo que aprendí, lo que falta
- — cPanel tiene su propio runtime PHP — los logs no están donde un server vanilla los pondría
- — WHM sobrescribe configuraciones de Apache sin aviso — hay que reenganchar hooks periódicamente
- — La UAPI de cPanel tiene rate limits no documentados — implementar backoff exponencial es obligatorio
- — Falsos positivos en reglas de ModSecurity para WordPress (~3%) — en fine-tuning
- — No cubre ataques de supply chain en dependencias npm/composer
- — El análisis de Claude se aplica solo a eventos ALTO/CRÍTICO para controlar costos
- — Roadmap: correlación de eventos entre múltiples servidores