Sobreviviendo a la Zona Gris: Por Qué Construimos Centinela, un IPS Guiado por Modelos que Arbitra Tu WAF
centinela-2f) y Laya, nuestro motor de decisión multilingüe autoalojado y optimizado que arbitra las zonas grises del WAF, reduce los falsos positivos drásticamente y hace viable el uso de OWASP CRS en Nivel de Paranoia 3 en producción.Cualquiera que haya administrado un Firewall de Aplicaciones Web (WAF) empresarial en producción conoce la regla tácita y sagrada del Core Rule Set de OWASP (CRS):
"Ejecutarás el Nivel de Paranoia 1 sin miedo, probarás el Nivel de Paranoia 2 en staging con cautela, y jamás, bajo ninguna circunstancia, activarás el Nivel de Paranoia 3 en producción a menos que tu objetivo sea una denegación de servicio autoinducida contra tus propios clientes."
El secreto a voces de la seguridad web basada en firmas no es que los motores de expresiones regulares no detecten ataques. Es que son incapaces de notar la diferencia entre una inyección SQL maliciosa y un usuario legítimo llamado O'Reilly registrándose en tu plataforma. No pueden distinguir un payload de salto de directorio (directory traversal) de una ruta relativa inofensiva en un webhook, y tratan a un desarrollador pegando código en un formulario de soporte como si fuera un ataque de día cero patrocinado por un estado nación.
En nuestro conjunto de pruebas de referencia para la zona gris, configurar OWASP CRS en Nivel de Paranoia 3 (PL3) logró una excelente tasa de detección de ataques del 82.8%. ¿El problema? También bloqueó el 51.3% del tráfico completamente legítimo. Activar ese nivel en producción significa que la mitad de tus usuarios se toparán con pantallas de error 403 Forbidden mientras tu equipo de guardia se replantea su carrera.
Por eso construimos Centinela.
Centinela es un Sistema de Prevención de Intrusiones (IPS) en línea, guiado por modelos de decisión y desarrollado en Go. Pero en lugar de cometer el error de reemplazar el WAF con un LLM masivo en la nube, costoso y propenso a alucinaciones, Centinela hace algo mucho más sensato: arbitra la zona gris del WAF utilizando un codificador rápido y especializado llamado Laya.
1. La Filosofía Central: El WAF es un Detective, No un Juez
El debate convencional suele plantear a los WAFs y a los modelos de IA como enfoques opuestos. Los tradicionalistas defienden que las expresiones regulares son rápidas y deterministas. Los entusiastas de la IA afirman que modelos generativos deberían inspeccionar cada paquete TCP que cruza el perímetro. Ambos extremos yerran el tiro.
Las expresiones regulares son sumamente veloces (μs) pero ciegas al contexto. Los modelos pesados poseen un profundo entendimiento semántico, pero son computacionalmente costosos (ms) y vulnerables a la manipulación retórica.
Centinela combina lo mejor de ambos mundos tratando a OWASP CRS como un detective investigador y a nuestro motor de decisión (Laya) como el juez en el tribunal:
cliente -> proxy -> WAF (CRS PL3) -> centinela -> app
| |
puntuación anomalía ¿vetado? ¿bypass? ¿bloqueo duro? ¿caché? ¿compuerta? (μs, sin modelo)
|
zona gris (sospechoso, no seguro) -> Laya -> política
|
permitir / marcar / bloquear / vetarCuando una solicitud llega al proxy de entrada, CRS la evalúa a alta paranoia:
- Tráfico Limpio (Puntuación de Anomalía 0): Pasa directo a la aplicación sin tocar el modelo (0 ms de sobrecarga).
- Ataques Flagrantes (Puntuación de Anomalía 50+): Barridos automáticos de
sqlmap. Centinela aplica un bloqueo duro (hard-block) instantáneo sin consultar al modelo (0 ms de sobrecarga). - La Zona Gris (Puntuación de Anomalía 5–25): Solicitudes ambiguas que dispararon alertas porque una contraseña contenía comillas o un JSON incluía fragmentos de comandos. Centinela las intercepta.
Centinela empaqueta la solicitud cruda junto con las reglas exactas de regex que saltaron y se las entrega a Laya con instrucciones claras: "Aquí tienes la solicitud y las reglas que se activaron. Son pistas de investigación, no verdades absolutas. ¿Se trata de un exploit real o es simplemente un usuario enviando código legítimo en un ticket de soporte?"
2. La Trayectoria de Ingeniería: Probando Jev, Qwen y Gemma (y Por Qué Elegimos Laya)
Cuando nos propusimos construir Centinela, nuestro primer instinto fue el mismo que el de cualquier equipo de ingeniería moderno: evaluar los modelos comerciales y de código abierto existentes antes de entrenar uno propio.
Probamos Jev. Probamos Qwen en modo Decision (ejecutado a través de nuestra bifurcación parallel-decision en llama.cpp). También evaluamos Gemma en modo Decision.
Las conclusiones de esa fase experimental fueron contundentes:
- Demasiado Lentos para Protección en Línea: Ejecutar decodificadores generativos como Qwen 27B en la ruta en vivo de las solicitudes añadía más de 760 ms de latencia. Para aplicaciones web de producción con tráfico interactivo, ese retraso resulta inaceptable.
- Déficits de Precisión y Calibración: Los modelos de propósito general sufrieron para alcanzar la calibración exacta que exigía nuestra política perimetral. Gemma, por ejemplo, arrojaba salidas binarias polarizadas (0.0 o 1.0), eliminando los matices probabilísticos indispensables para diferenciar código inofensivo de un exploit real. Jev y Qwen tampoco alcanzaron la precisión y velocidad deseadas en nuestras distribuciones de amenazas.
- Privacidad y Soberanía de Datos: Enviar cuerpos de solicitudes confidenciales (a menudo con contraseñas, cookies de sesión o datos personales de clientes) a través de Internet hacia APIs de terceros era un riesgo inaceptable para la arquitectura.
La conclusión fue clara: adaptar LLMs conversacionales masivos a proxies de red es utilizar la herramienta equivocada. No necesitas un modelo capaz de redactar poesía; necesitas un codificador diseñado con precisión milimétrica para clasificar amenazas a velocidad de red.
mmBERT-base) y lo afinamos específicamente con nuestros conjuntos de datos curados. Al entrenarlo directamente con vectores de ataque reales, casos benignos complejos y la batería tipada exacta que Centinela evalúa, obtuvimos latencias por debajo de 40 ms y una precisión quirúrgica. A partir de ahí, Laya se implementó y desplegó directamente en producción.Laya opera empaquetado en nuestra imagen de contenedor laya-serve. En lugar de desperdiciar ciclos de GPU generando texto, se enfoca estrictamente en responder la batería tipada de preguntas de seguridad de Centinela: sqli, xss, command_injection, path_traversal, ssrf, recon y una puntuación de severity calibrada en 4 niveles.
Dado que las solicitudes web completas pueden alcanzar cerca de 1,600 tokens (incluyendo encabezados HTTP, extractos del cuerpo y reglas activadas de CRS), Laya opera con una ventana de contexto de 2,048 tokens. En una GPU AMD Radeon RX 7900 XTX, Laya ofrece una impresionante latencia de 39 ms p50 / 79 ms p99, operando cómodamente dentro del presupuesto en línea de 150ms de Centinela.
3. El Embudo de Ejecución: Máxima Velocidad sin Carga Innecesaria
Incluso con un modelo de 39ms, jamás se debe invocar la IA en cada petición. Centinela aplica un embudo de menor costo primero:
- Verificación de Veto (Shun List): ¿Esta IP de cliente ya acumuló bloqueos reiterados? Se rechaza en memoria (μs).
- Reputación de IP y Listas de Bloqueo: Consulta feeds en vivo como Spamhaus DROP y FireHOL (μs).
- Límite de Tasa (Rate Limiter): Ventana deslizante de peticiones por cliente (μs).
- Prefijos de Omisión (Bypass): Rutas de salud y assets estáticos (
/healthz,/favicon.ico) se autorizan de inmediato (μs). - Puntuación CRS Embebida: Ejecutada con Coraza y OWASP CRS en modo detección (sub-ms).
- Filtro de Bloqueo Duro: Puntuaciones astronómicas de anomalía se cortan aquí sin tocar la IA (μs).
- Caché de Veredictos: Genera un hash semántico del payload + hallazgos del WAF (independiente de la IP). Si una botnet distribuye el mismo exploit entre 5,000 IPs residenciales, solo la primera llamada toca a Laya; las 4,999 restantes se resuelven en 5 μs desde la caché.
- La Compuerta (Gate): Solo las peticiones que alcanzan
CENTINELA_GREY_MINavanzan a Laya. - Adjudicación con Laya: Evaluación en paralelo dentro del presupuesto de
150ms. Si se excede el tiempo, Centinela permite el paso (FAIL_OPEN=true) para proteger la experiencia del usuario, pero completa la llamada en segundo plano para vetar a infractores recurrentes.
4. Los Resultados Empíricos: Evaluando la Zona Gris
Para medir el impacto con rigor, creamos un entorno de evaluación automatizado (cmd/centinela-eval) y probamos un conjunto de 68 solicitudes calibradas (29 ataques de diversa sutileza y 39 casos benignos pero sospechosos) frente a CRS 4.25 en Coraza 3.8, comparando CRS solo frente a los modelos evaluados:
| Canalización | Detección de Ataques | Falsos Positivos | Tasa de Falsos Positivos | Latencia (p50 / p99) |
|---|---|---|---|---|
| CRS PL1 Solo | 82.8% | 9 / 39 | 23.1% | — |
| CRS PL2 Solo | 82.8% | 17 / 39 | 43.6% | — |
| CRS PL3 Solo | 82.8% | 20 / 39 | 51.3% | — |
| CRS PL3 + Laya | 82.8% | 7 / 39 | 17.9% | 39 / 79 ms (RX 7900 XTX) |
| Probado: CRS PL3 + Qwen 27B (Modo Decision) | 86.2% | 4 / 39 | 10.3% | 766 / 1436 ms (Demasiado lento) |
| Probado: CRS PL3 + Gemma 12B (Modo Decision) | 86.2% | 13 / 39 | 33.3% | 955 / 2474 ms (Sin calibrar) |
Los datos demuestran por qué un fine-tuning dedicado resulta ganador:
- Los falsos positivos cayeron del 51.3% al 17.9%: CRS PL3 por sí solo bloqueó erróneamente 20 solicitudes benignas de 39. Laya absolvió casi dos tercios de esas falsas alarmas de inmediato, manteniendo intacta la detección y respondiendo en tan solo 39 ms.
- La Ventaja de Velocidad: A 39 ms, Laya es casi 20 veces más rápido que Qwen 27B y 24 veces más rápido que Gemma 12B, haciendo viable la evaluación en línea en tiempo real con GPUs convencionales.
- Privacidad Total y Costo Cero: A diferencia de servicios en la nube que cobran por millón de tokens y exponen datos en tránsito por Internet, Laya opera 100% dentro de tu clúster.
5. En Qué se Destacan Centinela y Laya
- Viabilidad Real para Nivel de Paranoia 3: Obtienes la visibilidad de amenazas profundas de PL3 sin romper inicios de sesión legítimos, repositorios de código ni aplicaciones enriquecidas.
- Veto a Infractores Recurrentes (Repeat-Offender Shunning): Los escáneres rara vez lanzan un único ataque catastrófico; disparan decenas de sondas pequeñas. Centinela monitorea la frecuencia de bloqueos por cliente en ventanas de tiempo (
CENTINELA_SHUN_AFTER) y veta la IP completa en el borde. - Topologías Híbridas y Flexibles: Funciona como un destino
forward_authpara Nginx, Caddy o Traefik, o directamente en la ruta como un proxy inverso para túneles de Cloudflare sin ingress controllers dedicados. - Afinado Especializado para Seguridad Web: Entrenado con datasets curados que incluyen ataques reales de SR-BH 2020 y tráfico normal de CSIC 2010, diseñado específicamente para clasificar amenazas web.
6. Hoja de Ruta y Próximos Pasos de Ingeniería
Creemos en la transparencia técnica absoluta sobre las fronteras actuales de Centinela y Laya:
A. Reentrenamiento de Laya con Tráfico de Alto Volumen
Aunque los conjuntos de datos curados proporcionaron a Laya una base sólida, las sondas sutiles de reconocimiento (como /actuator/env o /phpmyadmin) sin reglas activadas del WAF continúan siendo un área de mejora. Nuestro plan de iteración activo despliega Centinela bajo tráfico de alto volumen detrás de Cloudflare (utilizando túneles de Cloudflare que enrutan directamente al proxy inverso de Centinela) para capturar registros reales vía CENTINELA_TRAIN_LOG, seguido de una ronda de reentrenamiento y aceleración con compilación en tiempo de ejecución / ONNX en laya-serve.
B. La Paradoja de la Entrada Adversaria
El desafío más fascinante de un IPS guiado por modelos es que la entrada evaluada es redactada directamente por el adversario. Aunque Centinela aísla las solicitudes mediante delimitadores defensivos e instruye a Laya a ignorar comandos internos, la inyección indirecta de prompts sigue siendo un vector activo. Por esta razón el WAF permanece al frente: si una solicitud activa firmas rotundas, el modelo jamás entra en contacto con el atacante.
C. Semántica y Conciencia de Esquema en Campos
Actualmente, Centinela inspecciona pares clave-valor serializados. Enseñar a Centinela que un campo llamado password puede contener símbolos caóticos mientras que id debe ser puramente numérico resolverá el residuo restante de falsos positivos.
D. Estado Efímero en Memoria por Réplica
Hoy en día, las tablas de caché de veredictos y de clientes vetados residen en la memoria local de cada pod. Estamos trabajando en sincronización distribuida mediante Redis o difusión gossip para que un veto disparado en el pod A proteja de inmediato a los pods B hasta Z.
Conclusión
Centinela no busca sustituir la ingeniería de redes consolidada con modas de inteligencia artificial generativa. Se trata de aplicar un codificador especializado de 322M afinado específicamente para detección de intrusiones exactamente donde las firmas estáticas fallan: en la compleja y ambigua zona gris donde el contexto humano marca la diferencia.
Al unir la velocidad implacable de OWASP Core Rule Set con el criterio contextual y calibrado de Laya, obtenemos el estándar dorado de la protección perimetral: máxima paranoia con mínima disrupción.
Repositorio oficial: git.colibrisec.org/colibrisec/centinela