Resumen — qué hace
Lista de bloqueo y reputación (/security/blocklist) cuenta la historia de los rangos de amenaza que Kitsune ML y Suricata IDS han estado bloqueando automáticamente, y ofrece a los operadores una consola de control para bloquear (añadir) · liberar · volver a bloquear rangos a mano.
- La tabla de origen es
blacklist_infoen la conexiónlegacy_glory(unas 8.000–9.000 filas). La unidad de bloqueo no es una IP suelta, sino un rango /24 (c_class, p. ej.203.0.113.0/24). - En esta tabla escriben los recolectores de detección (
kts_tx.js·srct_tx.js) y esta interfaz de operador; el demoniosync_black(sync_black.mjs) la lee y aplica los bloqueos como reglas DROP de ipset/iptables en cada host. Por tanto, añadir o liberar aquí es el plano de control: el descarte real de paquetes lo aplica sync_black. - La etiqueta de origen del campo
reason([Kitsune ...]·[Suricata Auto-Block]·[Manual] ...) y las cifras probatorias (score · port · ja3 · hits …) se analizan hasta obtener una etiqueta legible de «por qué fue capturado» (análisis independiente del idioma).
Un «bloqueo» cubre siempre un rango /24 completo. Aunque introduzca una IP suelta, solo se conservan los tres primeros octetos y se normaliza a
x.y.z.0/24. Los falsos positivos se eximen mediante la Lista blanca, no estrechando el bloqueo.
Cuándo usarlo
- Para ver de un vistazo qué está bloqueando ahora mismo la defensa automática y cuánto (número de bloqueos activos · contribución por motor · países de origen).
- Para bloquear manualmente una IP maliciosa detectada en Amenazas, Detecciones o en una ventana de investigación de IP (enlazada mediante
?add=y con el campo precargado). - Para liberar un rango bloqueado por error, o volver a bloquear un rango liberado que ha retomado la actividad.
- Para contrastar la IP representativa de un rango bloqueado con la reputación de AbuseIPDB.
Disposición
KPI superiores
Los calcula summary() con una caché de 30 segundos (infr:sec:blocklist:summary).
| KPI | Significado | Cálculo |
|---|---|---|
| Bloqueos activos | Rangos /24 aplicados actualmente | COUNT(*) WHERE is_use=1 |
| Direcciones protegidas (subtítulo) | Direcciones cubiertas por los bloqueos activos | active × 256 (/24 ≈ 256) |
| Bloqueadas hoy | Bloqueos nuevos en las últimas 24 h | is_use=1 AND created_at >= today 00:00 |
| Tasa de defensa automática | Porción gestionada automáticamente por IA/IDS | (kitsune + suricata) / active × 100 |
| Países vigilados | Países distintos entre los rangos activos | COUNT(DISTINCT country) WHERE is_use=1 |
| Liberadas | Liberadas actualmente (a la espera de un nuevo bloqueo) | COUNT(*) WHERE is_use=0 |
Contribución de los motores de defensa
Los bloqueos activos se desglosan por etiqueta de origen en una barra de reparto más varios mosaicos. La clasificación se hace por coincidencia LIKE sobre reason.
| Motor | Regla de coincidencia | Significado |
|---|---|---|
| Kitsune ML | reason LIKE '%Kitsune%' |
Detección de anomalías con autoencoder de conjunto |
| Suricata IDS | reason LIKE '%Suricata%' |
Bloqueo automático por escaneo o violación de protocolo |
| Manual | reason LIKE '%Manual%' o %수동% |
Bloqueo designado por el operador |
| Otro | Todo lo que no encaja arriba | active − (kitsune+suricata+manual), con suelo en 0 |
Origen de las amenazas
blockByCountry(12) agrega los rangos activos en los 12 países principales (GROUP BY country ORDER BY COUNT DESC), mostrados como emoji de bandera más barras de ranking. Al hacer clic en una barra, la lista se filtra por ese país.
Actividad de defensa reciente
blockFeed(16) muestra las 16 filas más recientes sin distinguir estado (ORDER BY created_at DESC, id DESC) en una cuadrícula de 4×4: una sensación en vivo de lo que se acaba de capturar.
Lista de bloqueo filtrable
40 tarjetas por página (PER_PAGE=40, ORDER BY created_at DESC, id DESC). Cada tarjeta muestra el rango · el país · la insignia de origen · el chip de evidencia (comportamiento + cifra clave) · la hora del bloqueo · el estado, con las acciones de fila [Reputación] · [Detalles] · [Liberar]/[Volver a bloquear]. Si un rango pertenece a una red interna registrada, recibe una insignia Internal y se oculta su botón de reputación (internal_scope.js).
Filtros:
- Estado —
active(predeterminado) ·released·all - Origen —
kitsune·suricata·manual(vacío = todos) - País — coincidencia exacta (≤ 64 caracteres)
- Búsqueda (q) — solo prefijo CIDR (expresión regular
^[0-9.]{0,20}$, p. ej.211.→c_class LIKE '211.%')
Cómo usarlo
Leer el motivo
El chip de evidencia de cada tarjeta escoge el único conjunto de reglas con mayor peso de la cadena reason y lo muestra como etiqueta más cifra representativa. Entre las categorías heurísticas de srct, la principal se elige por este orden de pesos:
| Marcador de categoría | Peso | Clave behavior | Etiqueta | Cifra representativa (detalle) |
|---|---|---|---|---|
[A2:...] |
6 | brute | Fuerza bruta contra la administración | hits=N → N hits |
[A:...] |
5 | scanner | Escaneo de rutas vulnerables | hits=N → N hits |
[D:...] |
4 | ja3 | Huella JA3 de botnet | ja3=N → ja3×N |
[B:...] |
3 | bot_ua | Acceso de bot malicioso | hits=N → N hits |
[C:...] |
2 | err_flood | Avalancha de errores 4xx | err_rate=NN% |
[E:...] |
1 | short_scan | Escaneo de puertos TCP | port=N o N scan |
Si el origen es Kitsune, o si reason contiene score=, se clasifica como ml_anomaly (anomalía de aprendizaje automático) por delante de cualquier categoría, y se muestra top= (el componente de mayor error) junto con score. Manual y otros recurren a manual / auto.
Datos adicionales extraídos de reason: score=, top=, port=, short_scan_sessions=, bytes=. Ejemplos de motivos:
[Kitsune v2.2] anomaly top=TLS score=0.83
[Suricata Auto-Block] [A:URL] hits=42 port=443
[Manual] repeated login abuse (uid=5)
Añadir un bloqueo manual
- [Bloqueo manual] en la cabecera de la lista abre la ventana de alta. (Al llegar desde Amenazas o desde una investigación de IP, la IP viene precargada a partir de
?add=203.0.113.10.) - Introduzca una IP o CIDR. Una IP suelta se expande a
/24(203.0.113.10→203.0.113.0/24). - Escriba un motivo opcional (≤ 160 caracteres) y pulse [Bloquear].
- Comportamiento del servidor:
- La entrada se normaliza a
x.y.z.0/24mediantecclassCidr()(lo que no sea IPv4 se rechaza comoinvalid_cidr). - Para una IPv4 completa, el país se enriquece desde
ip_info_loop(si no, se conserva el valor existente /Unknown). - Si
(server_index=0, c_class)ya existe, se actualiza ais_use=1(reactivado); si no, se inserta una fila nueva. El motivo queda como"[Manual] <note> (uid=N)". - Se vacía la caché del resumen y se devuelven la lista y el resumen actualizados.
- La entrada se normaliza a
El bloqueo llega a
blacklist_infode inmediato, pero el DROP real del cortafuegos se aplica cuando el demoniosync_blackde cada host lo sincroniza la próxima vez con ipset/iptables. Si ese lote no se está ejecutando, el bloqueo no se aplica en el cortafuegos.
Liberar / Volver a bloquear
- [Liberar] pone
is_use=0para que sync_black lo retire de ipset (la fila permanece). Se ejecuta tras un diálogo de confirmación. - [Volver a bloquear] devuelve un rango liberado a
is_use=1. - Ambos devuelven
not_foundsi la fila de destino no existe.
Sondeo
security-blocklist.js llama a /security/blocklist/live cada 30 segundos para refrescar el resumen y la página actual.
Fuentes de datos
| Elemento | Fuente | Notas |
|---|---|---|
| Registro de bloqueos | blacklist_info (legacy_glory) |
id, server_index, c_class, country, reason, is_use, created_at, updated_at · UNIQUE(server_index, c_class) |
| Enriquecimiento de país | ip_info_loop (legacy_glory) |
consulta de país para IPv4 completas al añadir |
| Comprobación de red interna | SecurityScope::internalMatchers() |
IP de instancias registradas + lista blanca de la Política de operaciones → insignia Internal |
| Aplicación en el cortafuegos | demonio sync_black |
blacklist_info → DROP de ipset/iptables |
| Suministro de bloqueos automáticos | kts_tx.js · srct_tx.js |
escriben las etiquetas de origen y las cadenas probatorias de reason |
| Registro de auditoría | infr_audit_log |
sec.block_add · sec.block_release · sec.block_readd |
La columna vertebral de lectura es App\Repositories\SecurityRepository; la narración y las escrituras las orquesta App\Services\Security\BlocklistService. Las credenciales proceden únicamente de config('database.connections.legacy_glory'), nunca están codificadas en el código.
Acceso
- Ver la página — debe pertenecer al área de rol de Seguridad (
min_req=2en sitemap). En la escala de niveles desplegada, staff (5) y admin (10) ven las pantallas de Seguridad; demo (1) queda fuera del ámbito de seguridad. - Escrituras (añadir/liberar/volver a bloquear) — el servidor exige
infr_user_level >= 2(canWrite). Por debajo devuelve403 forbidden. Así que demo (1) no puede escribir; staff y admin sí. - Cada escritura queda registrada en
InfrAuditLogy es rastreable en el Registro de auditoría (actor, CIDR de destino, marca de reactivación, etc. en el meta).
Como son acciones de seguridad destructivas, la interfaz muestra un diálogo de confirmación (step-up) antes de ejecutarlas. Revise dos veces el CIDR para no bloquear por accidente un rango grande.
Resolución de problemas y preguntas frecuentes
- Lo bloqueé pero los ataques siguen llegando. Esta pantalla solo actualiza el registro. Compruebe que
sync_blackse está ejecutando en el host de destino y que ipset se actualizó realmente. Además, los bloqueos son por /24, así que los ataques desde otros rangos necesitan sus propios bloqueos. - [Bloqueo manual] devuelve 403. Su nivel de acceso es inferior a 2. Reinténtelo con una cuenta de staff o admin (véase Niveles de RBAC).
- La entrada se rechaza como «no es una IP/CIDR válida». Solo se aceptan
a.b.c/a.b.c.d/a.b.c.d/nn. No se admiten IPv6 ni nombres de host. - El país aparece como Unknown. No hay enriquecimiento de
ip_info_looppara esa IP, o solo introdujo un CIDR. Añadir una IPv4 completa puede rellenar el país. - Los KPI o la lista no cambian. El resumen se cachea durante 30 segundos. Se vacía justo después de una escritura, pero los cambios procedentes de los recolectores pueden retrasarse hasta 30 segundos.
- Bloqueé por error un rango legítimo. Libérelo de inmediato y, si el falso positivo del nuevo bloqueo se repite, añádalo a la Lista blanca para que srct_tx lo exima justo antes de bloquear.
Relacionado
- Amenazas — entregue aquí una IP maliciosa mediante
?add=para bloquearla - Lista blanca — exenciones de bloqueo (prevención de falsos positivos, con caducidad)
- Detecciones y JA3 — cómo funciona la detección de Kitsune / srct / JA3
- Bloqueo automático — la canalización programada de bloqueo automático
- Reputación de IP (AbuseIPDB) — contrastar la IP representativa
- Registro de auditoría — rastrear el historial de bloqueos y liberaciones
