Introducción

En el post anterior presenté Sentry como plataforma. Ahora toca abrir la caja: ¿qué hay dentro de ese pipeline async y cómo se conecta con el dashboard?

Sentry se compone de dos grandes piezas:

  1. Pipeline Python que recolecta, correlaciona, enriquece y puntúa amenazas.
  2. Dashboard Next.js 16 que consume el resultado y lo presenta al analista.

Ambos se comunican mediante un único artefacto: dashboard_data.json.

Pipeline de Threat Intelligence (Python)

Recolección: 13 Fuentes en Paralelo

El módulo cve_sentry/sources/ contiene un collector por cada fuente. Todos heredan de una clase abstracta BaseCollector que define un modelo común ThreatItem, lo que permite ejecutarlos en paralelo con asyncio y normalizar la salida.

Las fuentes incluyen:

  • MSRC RSS: Microsoft Security Response Center, advisories oficiales del stack Microsoft.
  • NVD: National Vulnerability Database del NIST, fuente autoritativa de CVEs con CVSS.
  • CISA KEV: catálogo de vulnerabilidades activamente explotadas.
  • GitHub Security Advisories: vía GraphQL, para advisories de paquetes y proyectos open source.
  • Exploit-DB: base de datos de exploits públicos.
  • Zero Day Initiative (ZDI): advisories de Trend Micro.
  • CERT-EU: avisos del CERT europeo.
  • EPSS: Exploit Prediction Scoring System (probabilidad de explotación).
  • Más cuatro collectors adicionales que cubren feeds especializados.

Cada collector entrega ThreatItems que luego entran al motor de correlación.

Correlación y Deduplicación

El módulo cve_sentry/correlation/ se encarga de:

  • Engine (engine.py): deduplicación inteligente y merge de un mismo CVE reportado por varias fuentes (un CVE en NVD + MSRC + KEV se convierte en una sola entrada enriquecida con todas las señales).
  • Product Filter (product_filter.py): filtra por una lista de 91 keywords de productos Azure y M365 para reducir ruido. Configurable vía PRODUCT_FILTER_ENABLED.
  • Scoring (scoring.py): categorización de riesgo previa al score final.

Enriquecimiento con MITRE ATT&CK y D3FEND

Aquí está una de las piezas que más valor aporta al analista:

  • mitre_attack.py: mapea cada amenaza a las técnicas y tácticas de ATT&CK relevantes. Esto alimenta el heatmap del Threat Pulse.
  • d3fend.py: traduce esas técnicas ofensivas en contramedidas defensivas categorizadas como Harden, Detect, Isolate, Deceive o Evict.

El resultado: cada CVE no solo dice “esto es malo”, sino “esto es malo, así te atacan, y esto es lo que puedes hacer para defenderte”.

Análisis con LLM

El módulo cve_sentry/analysis/ aporta resúmenes ejecutivos:

  • llm_summarizer.py: usa OpenAI o Anthropic (configurable con LLM_PROVIDER) para generar resúmenes en lenguaje natural a partir de los datos crudos.
  • fallback_summarizer.py: si no hay API key configurada, genera resúmenes basados en plantillas. El pipeline nunca se queda sin output.

Sentry Priority Score

El risk_engine.py calcula el score 0-10 que vimos en el post anterior, combinando KEV, exploit availability, EPSS, recencia y CVSS. Este score es lo que ordena la cola del analista.

Servicios Adicionales

  • delta_tracker.py: detecta qué cambió entre runs (nuevas amenazas, escaladas en score, llegadas al KEV).
  • data_retention.py: auto-purga a 90 días por defecto (RETENTION_DAYS), configurable.
  • json_exporter.py: genera el dashboard_data.json que consume el frontend.
  • html_dashboard.py: reporte HTML standalone para distribución offline.

Dashboard Next.js 16

Stack y Autenticación

El frontend está en sentry/ e implementa:

  • Next.js 16 con App Router.
  • Auth.js v5 (auth.ts) con tres providers: Microsoft Entra ID, GitHub, Google.
  • Middleware (middleware.ts) que protege todas las rutas excepto el login y el feed RSS público.
  • 43 componentes React organizados en components/.

Páginas Principales

Dentro de app/(dashboard)/:

  • page.tsx: dashboard home con la priorización diaria (Act Now / This Week / Monitor).
  • pulse/: Threat Pulse en tiempo real con tendencias, top productos, severidad, heatmap ATT&CK y calendario.
  • threat/[id]/: vista de detalle de cada amenaza, con todas las señales correlacionadas y el mapeo D3FEND.
  • watchlists/: gestión de listas personalizadas por vendor/producto/keyword.
  • workflow/: tablero Kanban de incidentes con drag-and-drop.

API Interna

Hay 16 route handlers en app/api/. Los más relevantes:

MétodoEndpointDescripción
GET/api/threatsLista de amenazas filtrable por severidad, KEV, exploit
GET/api/threats/[id]Detalle de una amenaza
GET/api/metaMetadatos del pipeline (sin datos sensibles)
GET/api/feedRSS feed (público, sin auth)
GET/POST/api/bookmarksBookmarks del usuario
GET/POST/api/watchlistsCRUD de watchlists
GET/POST/api/workflowGestión de incidentes
POST/api/workflow/[id]/ticketExportación a Jira/ServiceNow/GitHub
GET/api/exportExportación CSV/JSON
POST/api/data-sync/importImport de datos sincronizados

Todos los endpoints (excepto /api/feed) requieren sesión JWT válida.

Despliegue: Contenedor Único

El Dockerfile es multi-stage y combina ambas piezas:

  1. Stage 1: build del pipeline Python con dependencias.
  2. Stage 2: build del dashboard Next.js.
  3. Stage final: runtime con Python + Node.js, orquestado por startup.sh.

Esto permite desplegar todo en un único Azure App Service con WEBSITES_PORT=8080. El CI/CD vive en .github/workflows/ y dispara build y deploy en cada push a main.

Variables de Entorno Clave

Pipeline

VariableDefaultDescripción
LLM_PROVIDER(vacío)openai o anthropic
DAYS_LOOKBACK7Días de histórico a recolectar
RETENTION_DAYS90Auto-purga
SCHEDULE_INTERVAL_HOURS4Frecuencia del pipeline
PRODUCT_FILTER_ENABLEDtrueFiltro Azure/M365

Dashboard

VariableDescripción
AUTH_SECRETSecret para firmar JWT (requerido)
AUTH_URLURL base (ej. https://sentry.d3fend.me)
AUTH_MICROSOFT_ENTRA_ID_*Configuración de Entra ID
AUTH_GITHUB_*OAuth de GitHub
AUTH_GOOGLE_*OAuth de Google
CVE_SENTRY_DATA_PATHRuta al dashboard_data.json

Conclusión

La arquitectura de Sentry es deliberadamente simple: un pipeline Python que produce un JSON, un dashboard que lo consume. Pero entre medio hay enriquecimientos que multiplican el valor para el analista — correlación entre fuentes, mapeo a MITRE ATT&CK y D3FEND, y un score unificado que dirige la atención.

En el próximo post repaso las mejoras recientes del producto: multi-tenant, Cloud Connect, executive report y los fixes de seguridad del último sprint.