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:
- Pipeline Python que recolecta, correlaciona, enriquece y puntúa amenazas.
- 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íaPRODUCT_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 conLLM_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 eldashboard_data.jsonque 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étodo | Endpoint | Descripción |
|---|---|---|
| GET | /api/threats | Lista de amenazas filtrable por severidad, KEV, exploit |
| GET | /api/threats/[id] | Detalle de una amenaza |
| GET | /api/meta | Metadatos del pipeline (sin datos sensibles) |
| GET | /api/feed | RSS feed (público, sin auth) |
| GET/POST | /api/bookmarks | Bookmarks del usuario |
| GET/POST | /api/watchlists | CRUD de watchlists |
| GET/POST | /api/workflow | Gestión de incidentes |
| POST | /api/workflow/[id]/ticket | Exportación a Jira/ServiceNow/GitHub |
| GET | /api/export | Exportación CSV/JSON |
| POST | /api/data-sync/import | Import 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:
- Stage 1: build del pipeline Python con dependencias.
- Stage 2: build del dashboard Next.js.
- 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
| Variable | Default | Descripción |
|---|---|---|
LLM_PROVIDER | (vacío) | openai o anthropic |
DAYS_LOOKBACK | 7 | Días de histórico a recolectar |
RETENTION_DAYS | 90 | Auto-purga |
SCHEDULE_INTERVAL_HOURS | 4 | Frecuencia del pipeline |
PRODUCT_FILTER_ENABLED | true | Filtro Azure/M365 |
Dashboard
| Variable | Descripción |
|---|---|
AUTH_SECRET | Secret para firmar JWT (requerido) |
AUTH_URL | URL 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_PATH | Ruta 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.