Resumen — qué hace
Conjuntos de reglas de detección (/security/rulesets) es la biblioteca canónica que normaliza cada regla de detección que InfraGuard observa y evalúa en 44 conjuntos de reglas repartidos en 11 categorías. La pantalla hace tres cosas en un mismo sitio:
- Panorama — dispone tarjetas de conjuntos de reglas dentro de secciones por categoría y muestra, para la ventana temporal seleccionada (1h/6h/24h), el recuento real de eventos y la marca de tiempo de la última aparición de cada conjunto.
- Explicación — narra cada conjunto de reglas en tres pasos (qué detecta · por qué se dispara · peor caso).
- Reproducción — al hacer clic en una tarjeta se abre una ventana modal con los eventos recientes realmente coincidentes con ese conjunto, en una tabla específica por motor.
La clave del diseño es la separación entre la estructura de clasificación y el texto explicativo. La estructura (categorías, claves de conjunto, reglas de coincidencia por motor) reside en la SOT estática e independiente del idioma App\Support\SecurityRulebook (segura para caché), mientras que el texto explicativo (nombre, significado, evidencia, riesgo) reside en resources/lang/{ko,en}/secrules.php. El frontend combina ambos por key+category para renderizar.
Esta pantalla es estrictamente de solo lectura. No activa, desactiva, edita ni elimina conjuntos de reglas. Es un catálogo de referencia que responde a «qué se está observando ahora mismo en esta organización y qué significa». El lugar donde realmente se cambian las constantes de detección (umbrales/ventanas) es Reglas y umbrales (Administración ▸ Reglas).
Los 44 conjuntos de reglas están cableados a telemetría real
Los conjuntos de reglas no son reglas abstractas: cada uno está ligado a una tabla de recolección real mediante una regla de coincidencia (match). Todas las fuentes están en la conexión legacy_glory (la base de datos heredada que llena la flota de recolectores).
| Motor | Regla de coincidencia | Tabla de origen | Conjuntos |
|---|---|---|---|
| Suricata IDS | sig: coincidencia de subcadena en minúsculas contra un array de fragmentos de firma |
suricata_alert_ct |
33 |
| Web (nginx) | classifyWeb: clasificación por prioridad y disjunta de las peticiones is_suspicious según url/ua/status |
nginx_meta_ct |
8 |
| Kitsune ML | source=kitsune: IP anómalas según el autocodificador |
kitsune_detail_log |
1 |
| Heurística (srct) | source=srct: ejecuciones heurísticas de escaneo/tasa |
srct_process_log |
1 |
| Huella JA3 | source=ja3: variedad de JA3 (rotación) por IP de origen |
suricata_tls_ct |
1 |
Cuándo usarlo
- Obtener contexto antes del triaje — cuando aparezca una firma desconocida en Amenazas o en Detecciones · IA JA3, confirme a qué familia de conjuntos de reglas pertenece y qué implica.
- Repasar el panorama de observación — vea de un vistazo qué categorías se están disparando en las últimas 24h y si los ataques web están a nivel de reconocimiento o han escalado a sondeo de RCE.
- Incorporación e informes — un material educativo y de reporte que explica «qué detectamos» por categoría y por motor.
- Reproducir eventos — inspeccione las IP de petición, las URL y los códigos de estado reales que un conjunto concreto (por ejemplo
web_secret_scan) ha coincidido recientemente y, después, derive los sospechosos a Reputación de IP o a Lista de bloqueo.
Disposición
KPI superiores
| KPI | Etiqueta | Significado |
|---|---|---|
total |
Conjuntos de reglas | Total de conjuntos del catálogo (siempre 44) |
active |
Conjuntos observados | Conjuntos que dispararon al menos un evento en la ventana (firing) |
events |
Eventos en la ventana | Suma de los recuentos de eventos de todos los conjuntos |
cats |
Categorías | Número de categorías (11) |
Internamente también calcula sumas por motor (totales de eventos de kitsune y suricata) para que las cifras sigan siendo coherentes con la etapa «conjuntos de reglas» del embudo de defensa de Seguridad.
Controles
- Selector de ventana —
1h(60 min) ·6h(360 min) ·24h(1440 min). Por defecto24h. - Actualización automática (LIVE) — consulta
/security/rulesets/livepara refrescar los recuentos (se puede pausar). - Pantalla completa — oculta la navegación superior para un modo de panel inmersivo (ESC para salir).
Secciones por categoría y tarjetas de conjuntos
Las 11 categorías forman secciones en orden de visualización y, dentro de cada sección, los conjuntos se disponen en una rejilla de tarjetas minmax(600). Cada tarjeta muestra el nombre del conjunto, un icono MDI, una insignia de severidad (crit/warn/info), el recuento de eventos en la ventana, la marca de tiempo de la última aparición y [Open]. Sin eventos muestra «en calma / nada observado en la ventana».
| # | Clave de categoría | Etiqueta | Motor | Conjuntos |
|---|---|---|---|---|
| 1 | tcp_stream |
Integridad del flujo TCP | Suricata | 10 |
| 2 | packet_decode |
Decodificación de paquetes | Suricata | 4 |
| 3 | protocol_anomaly |
Anomalía de protocolo | Suricata | 5 |
| 4 | http_anomaly |
Conformidad HTTP | Suricata | 5 |
| 5 | tls_anomaly |
Anomalía TLS | Suricata | 5 |
| 6 | dns_anomaly |
Anomalía DNS | Suricata | 1 |
| 7 | mail_anomaly |
Anomalía de correo (SMTP) | Suricata | 3 |
| 8 | web_attack |
Patrones de ataque web | nginx | 8 |
| 9 | ml_anomaly |
Detección de anomalías por ML | Kitsune | 1 |
| 10 | heuristic_scan |
Escaneo heurístico | srct | 1 |
| 11 | tls_fingerprint |
Huella JA3 | JA3 | 1 |
Cómo usarlo
1) Elija una ventana → lea el panorama
Primero seleccione la ventana de interés (1h/6h/24h). Use active (conjuntos observados) y el recuento de eventos de cada tarjeta para ver qué se está disparando ahora. Tenga en cuenta que la insignia de severidad es una severidad implícita: la mayoría de los eventos del motor Suricata son sev3 (informativos), pero su implicación difiere (ruido / escaneo / explotación). La insignia del conjunto refleja ese tono de implicación, no el sev en bruto.
2) Haga clic en una tarjeta → ventana modal de eventos recientes
Al hacer clic en una tarjeta se llama a /security/rulesets/events?key=<rulesetKey>&range=<window> y se abre una ventana modal que contiene:
- Explicación en tres pasos — qué detecta · por qué se dispara · peor caso.
- Agregados — recuento de eventos · orígenes únicos (IP src distintas).
- Fichas de firmas coincidentes (solo Suricata) — las cadenas de firma reales capturadas por la coincidencia de subcadena
sigde este conjunto, cada una con su recuento y su sev mínimo (las 12 principales). - Tabla de eventos específica del motor (60 filas recientes).
- IP de origen → reputación — un botón emergente de AbuseIPDB por cada IP src. Las IP de red interna registradas reciben una insignia
internaly el botón de reputación queda oculto (evita confundir nuestros propios servidores con atacantes).
Columnas de la tabla de eventos específica del motor:
| Motor | Columnas |
|---|---|
| Suricata | hora · src · dst · puerto · proto · firma · sev |
| nginx | hora · src · host · método · URL (rawurldecode, 180 caracteres) · estado |
| Kitsune | hora · IP · puntuación de anomalía · sesiones · bloqueada |
| srct | hora · escaneadas · bloqueadas · nota |
| JA3 | hora · IP · variedad JA3 · conexiones TLS · variedad SNI |
3) Prioridad de clasificación de ataques web (disjunta)
Los 8 conjuntos de reglas web (nginx) son mutuamente disjuntos. Una sola petición is_suspicious=1 se recorre en el orden de definición del catálogo y se atribuye a exactamente un conjunto, el primero que coincida; si no coincide con ninguno, cae en el comodín (web_suspicious_other). Así, una misma petición nunca se cuenta dos veces en dos conjuntos web.
| Prioridad | Clave del conjunto | Indicio de coincidencia (url/ua) | Severidad |
|---|---|---|---|
| 1 | web_secret_scan |
.env .git wp-config id_rsa .aws credentials backup.sql .bak |
warn |
| 2 | web_path_traversal |
../ ..%2f %2e%2e etc/passwd boot.ini proc/self |
crit |
| 3 | web_sqli |
union select information_schema sleep( or 1=1 %27or |
crit |
| 4 | web_xss |
<script onerror= javascript: document.cookie |
warn |
| 5 | web_rce_probe |
/bin/sh exec( system( jndi: ${ phpunit |
crit |
| 6 | web_admin_brute |
wp-login xmlrpc.php phpmyadmin /admin/login |
warn |
| 7 | web_bad_bot |
UA: sqlmap nikto masscan nuclei python-requests curl/ |
warn |
| 8 | web_suspicious_other |
(comodín: peticiones sospechosas que no coinciden con ninguna de las anteriores) | info |
Por rendimiento, la clasificación web agrega sobre una muestra de las 6,000 filas más recientes (tope del repositorio: 8,000). Durante escaneos intensos puede que los eventos fuera de la muestra no queden reflejados: lea las cifras como distribución/tendencia, no como recuentos absolutos.
4) Qué implica la coincidencia por subcadena de Suricata
Los conjuntos de reglas de Suricata se disparan con una coincidencia de subcadena en minúsculas de la cadena de firma. Por ejemplo, stream_invalid_ts suma todos los eventos cuya firma contiene invalid timestamp. Un solo conjunto puede agrupar varias firmas reales (visibles como fichas de «firmas coincidentes» en la ventana modal), y las palabras clave sig de conjuntos distintos están diseñadas para no solaparse.
5) Ejemplo medido (a título de referencia)
Una instantánea ilustrativa de 24h: 37 de 44 conjuntos disparando, stream_invalid_ts 10,243, web_secret_scan 3,304 (en su mayoría 404 de la familia .env), srct_heuristic 126,252, ja3_rotation 300 (variedad 307/307). Los valores varían según la organización y el momento.
Fuentes de datos
Todas las fuentes son la conexión legacy_glory (solo lectura), a la que se accede únicamente mediante config('database.connections.legacy_glory'): sin credenciales codificadas en el código.
| Familia de conjuntos | Tabla | Métodos del repositorio (extracto) |
|---|---|---|
| Suricata (33) | suricata_alert_ct |
signatureHistogram() · recentAlertsBySignatures() · distinctIpsBySignatures() |
| Web (8) | nginx_meta_ct (is_suspicious=1) |
suspiciousRows($since, 6000) |
| Kitsune ML (1) | kitsune_detail_log |
kitsuneCount() · kitsuneRecentInWindow() |
| Heurística (1) | srct_process_log |
srctBlockedSum() · srctRunsInWindow() |
| JA3 (1) | suricata_tls_ct |
topJa3Ips($since, N, excludePrefixes) |
Rendimiento y caché
- El panorama de tarjetas (
build) se cachea durante 30 segundos (infr:sec:rulebook:<range>). Suricata obtiene el histograma de firmas una sola vez y suma las coincidencias de subcadena de los 44 conjuntos para evitar N+1. - JA3 excluye la red propia (IP /24 de las instancias registradas) mediante el NOT LIKE de
SecurityScope::excludePrefixes()y solo cuenta como infractoras las IP de origen conja3_variety >= 2. - Los eventos de la ventana modal están limitados a 60 filas por ventana. Todas las consultas del repositorio usan una ventana temporal estrecha + LIMIT + vinculación de parámetros.
Acceso
- Solo lectura. La verificación del controlador es
level≥1para las lecturas, y la entrada al propio área de rol de Seguridad está protegida por elmin_req=2del sitemap (operaciones de seguridad): en la práctica llegan staff (=5), admin (=10) o usuarios con alcance de seguridad. - Como no existe ruta de escritura, no hay reconfirmación de elevación ni registro de auditoría.
/rulesets,/rulesets/livey/rulesets/eventsson todas lecturas puras. - La
keydel endpointeventsse admite únicamente desde la lista blanca del catálogo. Las claves fuera de la lista devuelven404 unknown_ruleset(no es posible consultar tablas arbitrarias).
Convención de niveles: demo=1 · staff=5 · admin=10. Algunas áreas tienen además la protección del middleware
infr.level:N. Consulte Niveles RBAC para el esquema de graduación completo.
Resolución de problemas y preguntas frecuentes
Todas las tarjetas muestran «en calma»
O bien no hay eventos coincidentes en la ventana seleccionada (por defecto 24h), o bien la conexión legacy_glory no es accesible. El servicio absorbe con elegancia los errores de origen y muestra recuentos vacíos (0): las tarjetas no desaparecen. Amplíe la ventana o revise la conexión.
Los recuentos de los conjuntos web difieren de [Amenazas] / [Detecciones]
La clasificación web es un agregado de distribución sobre una muestra de las 6,000 filas más recientes (no un recuento absoluto). Además es disjunta, de modo que una petición se atribuye a exactamente un conjunto. La fuente autoritativa de eventos sigue la consulta propia de cada pantalla.
Una firma concreta no la captura ningún conjunto de reglas
La coincidencia de Suricata es por subcadena de palabra clave. Las firmas nuevas o personalizadas que el catálogo no cubre no se suman al recuento de ningún conjunto. Para clasificarlas y explicarlas, añada la palabra clave de la firma al array sig de SecurityRulebook: es un cambio de código, no un ajuste en tiempo de ejecución.
Los infractores JA3 son 0 pero hay mucho tráfico TLS
El conjunto de reglas JA3 solo cuenta como infractoras las IP de origen con ja3_variety >= 2 (rotación de huella). Sin rotación, un origen se trata como normal y no se contabiliza. Las IP de la red propia también quedan excluidas.
Una IP muestra una insignia internal en la ventana modal de eventos
Es una IP de red interna registrada, determinada por SecurityScope::internalMatchers(). Evita confundir con atacantes a nuestros propios servidores —a los que la direccionalidad de Suricata puede etiquetar como «origen»— y oculta el botón de reputación. La definición de red interna se gestiona en internal_networks, dentro de Política de operaciones.
Relacionado
- Detecciones · Análisis de secuencias JA3 — la pantalla padre (Detecciones); una heurística determinista deriva nuevos conjuntos de reglas a partir de secuencias JA3.
- Amenazas — triaje de entidades de amenaza del IDS y explicación de firmas.
- Resumen de seguridad — coherente con la etapa «conjuntos de reglas» del embudo de defensa.
- Reputación de IP — compruebe en AbuseIPDB una IP de origen de la ventana modal.
- Lista de bloqueo — convierta un origen sospechoso en un bloqueo.
- Reglas y umbrales (Administración ▸ Reglas) — ajuste realmente las constantes de los recolectores de detección (umbrales/ventanas).
