← proyectos
EN PRODUCCIÓN

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.

1,247
alertas / mes
40→66
Lynis score
<30s
tiempo de detección

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.

Por qué las soluciones genéricas no funcionaban
  • 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 archivos
Por qué Python

Acceso 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.

Por qué Claude Haiku

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.

Por qué Telegram y no email

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.

Por qué CSF y no iptables directo

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 ModSecurity
# 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 con Claude API
# 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)

Webshell en directorio uploads
CRÍTICOdetección: < 30s

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.

Backdoor en usuario MySQL
CRÍTICOdetección: 2 min

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.

Brute force SSH
ALTOdetección: < 60s

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.

Escaneo OWASP ZAP detectado y bloqueado
MEDIOdetección: < 30s

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

1,247
alertas procesadas / mes (promedio)
99.8%
uptime del agente (daemon supervisado)
40 → 66
Lynis score (antes / después)
< 30s
tiempo promedio de detección a alerta
~3%
tasa de falsos positivos (en revisión)
0
incidentes críticos no detectados desde deploy

Lo que aprendí, lo que falta

// sorpresas de cPanel
  • 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
// limitaciones actuales
  • 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
← Anterior: Cash ControlTodos los proyectos →