Resumen — qué hace
Seguridad ▸ Amenazas (/security/threats) reorganiza la tabla de alertas del IDS Suricata suricata_alert_ct en una vista de entidades de IP de origen (src_ip) pensada para el triaje. En lugar de enumerar miles de alertas en bruto, las agrupa en «quién (qué IP) nos atacó, con qué intensidad y de qué forma» y las ordena por gravedad.
Une tres cosas en una sola pantalla:
- Triaje de entidades de amenaza: una tarjeta por src_ip que resume el número de alertas, la gravedad máxima, las firmas distintas y la hora de la última observación.
- Vinculación con la acción automática (bloqueo): el /24 de cada IP amenazante se coteja con la tabla de defensa automática
blacklist_infopara añadir un distintivo Bloqueada / Detectada, de modo que detección y respuesta se lean como una sola historia. - Explicación de firmas (Signature Lore): la mayoría de las cadenas de firma de Suricata son eventos del motor difíciles de leer (eventos de stream, decoder o app-layer), no reglas de contenido. Esta pantalla narra en un panel explicativo lo que cada firma implica realmente (qué detectó · por qué se disparó [benign→malicious] · a qué prestar atención · el peor de los casos).
Todo es de solo lectura. La única acción que cambia el estado es un enlace directo que envía una IP amenazante a la Lista de bloqueo; la escritura real del bloqueo ocurre allí, bajo un permiso independiente.
Cuándo utilizarla
- Triaje matinal: revisar por encima las IP que más atacaron en las últimas 24 h y su gravedad.
- Decidir si una IP concreta es una amenaza real o ruido: clasificarla rápido mediante el tono [benign/watch/malicious] de la explicación y el distintivo de bloqueo automático.
- Explicar a un compañero «¿qué significa realmente esta firma?»: el panel explicativo sirve también como material didáctico.
- Tras investigar una IP amenazante, promoverla a candidata de bloqueo (→ enlace directo a la Lista de bloqueo, → ventana emergente de Reputación de IP).
Disposición
KPI superiores (limitados a la ventana)
| KPI | Significado | Derivación |
|---|---|---|
| alerts | Total de alertas IDS en la ventana | recuento de suricata_alert_ct con alert_ts >= since |
| entities | Número de entidades de IP amenazante | src_ip principales (hasta 48) |
| blocked | IP amenazantes ya bloqueadas automáticamente | el /24 de la entidad ∈ blacklist_info(is_use=1) |
| critical | IP amenazantes críticas sin mitigar (el total observado es critical_all) |
max_sev <= 1 y todavía sin bloquear |
Tarjetas/filas de entidades de amenaza
Muestra hasta 48 src_ip principales ordenadas por número de alertas (descendente). Cada entidad incluye:
| Campo | Descripción |
|---|---|
ip |
IP de origen (src_ip) |
alerts |
número de alertas de esta IP en la ventana |
sev |
gravedad máxima (1=crítica … 3=informativa). En Suricata, cuanto menor, más grave → MIN(severity) es la máxima |
sigs |
firmas distintas (sid): variedad del ataque |
last_ts |
hora de la última observación |
blocked |
true si el /24 de esta IP está en la lista de bloqueo automático |
block_source |
etiqueta de origen del bloqueo: kitsune · suricata · manual · other (extraída de la cadena reason) |
country / asn |
enriquecimiento geográfico/ASN (ip_info_loop, última fila) |
Su propia red queda excluida.
SecurityScope::excludePrefixes()filtra conNOT LIKEel /24 de las IP de las instancias registradas (más la lista blanca de redes internas de la Política de operaciones), de modo que sus propios servidores no aparecen como origen ni saturan la lista de amenazas. Si aun así aparece una IP interna por la etiqueta de dirección, se le añade un distintivointernal(gobernado porinternalMatchers) y se oculta el botón de reputación.
distribución de gravedad · categorías · firmas
- distribución de gravedad:
{1: n, 2: n, 3: n}: número de alertas críticas/de aviso/informativas. - categorías: las 10 principales categorías (por número descendente) con su gravedad mínima.
- firmas: las 12 principales firmas (por número descendente). Cada elemento incluye
signature·sid·cnt·sev(mínima) másexplain(la clasificación de SignatureLore). Al hacer clic en una firma se abre el panel explicativo contiguo.
Panel de explicación de firmas
App\Support\SignatureLore::classify() clasifica la cadena de firma en una familia y una clave de detalle; el texto propiamente dicho vive en el paquete de idioma resources/lang/{ko,en}/siglore.php. El frontend fusiona family + key (el detalle prevalece sobre la familia) en una narración de cuatro partes.
| Parte | Contenido |
|---|---|
| Qué detectó (meaning) | qué capturó la firma en términos de protocolo |
| Por qué se disparó · posibilidades (why) | causas candidatas enumeradas por tono [benign] → [watch] → [malicious] |
| A qué prestar atención (caution) | cómo separar el ruido de una señal real |
| El peor de los casos (worst) | la brecha a la que puede conducir si se ignora |
Cada familia lleva una gravedad implícita (tone): incluso los eventos informativos difieren en lo que implican.
| family | Etiqueta | tone | Icono |
|---|---|---|---|
stream |
Anomalía de reensamblado de flujo TCP | warn | mdi-transit-connection-variant |
decoder |
Anomalía de decodificación/integridad de paquetes | info | mdi-package-variant-closed |
applayer |
Anomalía del protocolo de aplicación | warn | mdi-swap-horizontal-bold |
http |
Anomalía de análisis HTTP | warn | mdi-web |
tls |
Anomalía TLS | warn | mdi-lock-outline |
dns |
Anomalía DNS | warn | mdi-dns-outline |
scan |
Escaneo/reconocimiento | warn | mdi-radar |
exploit |
Intento de explotación | crit | mdi-bug-outline |
malware |
Malware/C2 | crit | mdi-virus-outline |
dos |
DoS/inundación | crit | mdi-flash-alert-outline |
policy |
Política/informativo | info | mdi-file-document-outline |
generic |
Otra firma IDS | info | mdi-shield-alert-outline |
Existen 14 claves de detalle que prevalecen sobre la familia: invalid_timestamp · checksum · retransmit · handshake · evasion · stateanomaly · host_header · desync · malformed · one_direction · mismatch · starttls · tls_anomaly · unsolicited.
La mayoría de las firmas de stream/decoder (por ejemplo
SURICATA STREAM Packet with invalid timestampoSURICATA TCPv4 invalid checksum) son informativas de sev3 y se disparan en masa por rasgos de la infraestructura como el enrutamiento asimétrico y la descarga de sumas de comprobación en la NIC: ruido inofensivo. Fíjese menos en la firma en sí y más en si la misma src_ip acumula varias familias en una ventana corta (escaneo + anomalía de handshake, etc.). Esa acumulación es la señal de intención.
Cómo utilizarla
1) Elegir el rango
La ventana predeterminada es de 24 h. Rangos admitidos:
| range | ventana (min) |
|---|---|
1h |
60 |
6h |
360 |
24h |
1440 (predeterminado) |
El selector se pasa como ?range=; cualquier valor que no figure en la lista blanca se degrada a 24h.
2) Clasificar las IP amenazantes
- Empiece por las entidades con mayor gravedad (
sev=1crítica) y más alertas. - Un distintivo Bloqueada significa que la defensa automática ya respondió: consulte
block_sourcepara ver qué motor la bloqueó. - Sin bloquear + gravedad alta + muchas firmas es su principal candidata a investigar o bloquear.
3) Detalle de IP (ventana emergente específica de seguridad)
Al hacer clic en una IP se llama a GET /security/threats/ip-detail?ip=<IP>&range=<range>. La IP se valida estrictamente con FILTER_VALIDATE_IP; un valor no válido devuelve 422 (invalid_ip). Campos devueltos:
{
"ok": true,
"detail": {
"ip": "203.0.113.10",
"cidr": "203.0.113.0/24",
"geo": { "country": "US", "city": null, "asn": "ASNNNNN", "isp": "...", "org": "..." },
"signatures": [
{ "signature": "...", "severity": 3, "cnt": 42, "explain": { "family": "stream", "key": "invalid_timestamp", "tone": "warn", "icon": "mdi-...", "svg": "stream" } }
],
"blocked": true,
"block_source": "suricata",
"block_reason": "[Suricata Auto-Block] ...",
"block_at": "2026-08-13 04:12:00",
"abuse_url": "https://www.abuseipdb.com/check/203.0.113.10"
}
}
- geo/ASN: enriquecimiento de
ip_info_loop. - signatures: las 8 firmas principales de esta IP (por número descendente), cada una con su explicación
explain. - estado de bloqueo: coincidencia de /24 con
blacklist_info(c_class,is_use=1) → etiqueta de origen · reason en bruto · hora del bloqueo.
4) Consultar la reputación · promover a bloqueo
- Haga clic en el símbolo (
.infr-ipsym) junto a una IP → ventana emergente de AbuseIPDB integrada en Reputación de IP (mixins/abuse_check.js+/security/ip-reputation). Muestra la confianza de abuso, el número de denuncias, el país, el tipo de uso y los detalles de las denuncias recientes. - Tras investigar, si decide bloquear → enlace directo a la Lista de bloqueo con
?add=<IP>(se normaliza a /24 al insertar, bajo un permiso independiente y con auditoría).
Fuentes de datos
| Tabla | Finalidad | Acceso |
|---|---|---|
suricata_alert_ct |
alertas IDS (src_ip · severity · category · signature · sid · alert_ts) | lectura |
blacklist_info |
lista de bloqueo automático (/24 c_class · reason · country · is_use) |
lectura (distintivo de acción automática) |
ip_info_loop |
enriquecimiento geográfico/ASN/ISP | lectura |
| IP de instancias registradas + redes internas de Política de operaciones | exclusión de la red propia · distintivo internal | SecurityScope |
Todas las fuentes residen en la conexión
legacy_glory(tablas heredadas sin prefijo que rellena la flota de recolectores) y son de solo lectura. La columna vertebral de lectura esApp\Repositories\SecurityRepository(vinculación de parámetros · ventanas estrechas · LIMIT). El controlador y el servicio nunca crean ni modifican estas tablas.
Caché · actualización
- Los resultados de
ThreatService::build()se almacenan en caché 30 segundos por rango (claveinfr:sec:th:<range>). - La pantalla se actualiza mediante sondeo cada 30 segundos (
/security/threats/live), no con Reverb. - Como la gravedad máxima usa
MIN(severity), unsevmenor es más peligroso (1=crítica, 3=informativa).
Acceso
| Acción | Nivel |
|---|---|
| Ver la pantalla · detalle · reputación | ≥ 2 (staff=5, admin=10) |
| Acceso de demo (1) | denegado |
- Todo el prefijo
/security/*está protegido por el middlewareinfr.level:2. La demo (1) tiene restringido el acceso a los datos de seguridad (Niveles RBAC). - Amenazas es íntegramente GET (solo lectura), por lo que no es objeto de escrituras de auditoría. Las acciones destructivas o externas, como escribir un bloqueo o denunciar un abuso, se realizan bajo su propio permiso y auditoría en la Lista de bloqueo y en los flujos de colaboración internacional, respectivamente.
Resolución de problemas y preguntas frecuentes
P. Predominan invalid timestamp / invalid checksum: ¿es un ataque?
Normalmente no. invalid checksum se dispara en masa con el tráfico de sus propios servidores por la descarga de sumas de comprobación en la NIC; invalid timestamp procede del enrutamiento asimétrico y de los middleboxes. Ambas son ruido inofensivo de sev3: las entradas [benign] de la explicación describen exactamente esto. Sospeche solo cuando se concentren en una src_ip externa concreta que además acumule otras señales (escaneo · anomalía de handshake).
P. ¿Por qué la gravedad 1 es la más crítica?
Por convención de Suricata, severity 1=alta, 2=media, 3=informativa. Por eso el riesgo máximo de una entidad se calcula con MIN(severity).
P. La IP de mi propio servidor aparece en la lista de amenazas.
SecurityScope excluye los /24 de las instancias registradas y la lista blanca interna, pero una IP no registrada o una etiqueta de dirección (src/dst) todavía puede aflorar. Registre la IP en Instancias o añada el rango en Política de operaciones. Si aun así se muestra, se le añade un distintivo internal.
P. El detalle de IP devuelve 422.
El parámetro ip no es una IP válida (invalid_ip). Confirme que se trata de un valor IPv4/IPv6 real.
P. La explicación solo muestra «Otra firma IDS».
Las firmas que ninguna regla de palabras clave de SignatureLore::match() captura recaen en la familia generic. Juzgue por la categoría y el nombre de la firma y, si hace falta, añada una clave de detalle en siglore.php.
P. La lista no cambia durante 30 segundos. Es lo esperado. El servicio usa una caché de 30 segundos por rango más un sondeo de 30 segundos. Si necesita el valor más reciente de inmediato, vuelva a cargar cuando caduque la caché (fuerza el recálculo).
Relacionado
- Resumen de seguridad: el embudo de defensa amenaza→detección→respuesta (pieza central)
- Detecciones y JA3: Kitsune ML · heurísticas srct · anomalía de secuencia JA3
- Conjuntos de reglas: el catálogo canónico de detección de 44 conjuntos de reglas
- Lista de bloqueo y reputación: ver/añadir/liberar bloqueos automáticos (
blacklist_info) - Reputación de IP: ventana emergente de reputación de AbuseIPDB integrada
- Lista blanca: IP/CIDR exentos de bloqueo
