OpenCTI: Plataforma CTI Open Source con Knowledge Graph
Guía completa de OpenCTI (Filigran): arquitectura (ElasticSearch, Redis, MinIO, RabbitMQ), modelo de datos STIX 2.1 nativo, knowledge graph, ecosistema de 80+ conectores, dashboards, workspaces de investigación, API GraphQL y comparativa con MISP.
OpenCTI modela la inteligencia de amenazas como un knowledge graph navegable con STIX 2.1 nativo
OpenCTI es la plataforma CTI open source que más ha evolucionado en los últimos años. Desarrollada por Filigran (empresa francesa, anteriormente Luatix), resuelve un problema fundamental de la inteligencia de amenazas: las relaciones entre entidades son tan importantes como las entidades mismas.
Un IOC aislado es un dato. Un IOC conectado a un malware, atribuido a un actor, usado en una campaña contra un sector específico, con TTPs mapeadas a MITRE ATT&CK y mitigaciones documentadas, es inteligencia. OpenCTI modela todo esto como un grafo de conocimiento.
Arquitectura de OpenCTI
OpenCTI no es un monolito. Es un sistema distribuido con múltiples componentes:
┌─────────────┐
│ Frontend │
│ (React) │
└──────┬──────┘
│
┌──────▼──────┐
│ API │
│ (GraphQL) │
└──┬────┬────┘
│ │
┌──────────▼┐ ┌▼──────────┐
│ ElasticSearch│ │ Redis │
│ (datos + │ │ (cache + │
│ búsqueda) │ │ colas) │
└─────────────┘ └────────────┘
│ │
┌──────────▼┐ ┌▼──────────┐
│ MinIO │ │ RabbitMQ │
│ (ficheros) │ │ (mensajes │
│ │ │ conectores)│
└────────────┘ └────────────┘
│
┌───────────▼──────────┐
│ Conectores │
│ (workers Python) │
└──────────────────────┘
Componentes
| Componente | Función | Tecnología |
|---|---|---|
| Platform | API GraphQL + interfaz web | Node.js (backend), React (frontend) |
| ElasticSearch/OpenSearch | Almacenamiento de datos y búsqueda full-text | ES 8.x / OpenSearch 2.x |
| Redis | Cache, sesiones y cola de mensajes interna | Redis 7.x |
| MinIO | Almacenamiento de ficheros (reports PDF, imágenes, exports) | S3-compatible |
| RabbitMQ | Bus de mensajes para conectores | AMQP |
| Workers | Procesamiento asíncrono de datos | Python |
| Conectores | Importación/exportación de inteligencia | Python (cada conector es independiente) |
Esta arquitectura permite escalar cada componente de forma independiente. Una organización con muchos conectores puede escalar RabbitMQ y los workers sin afectar a la UI.
Modelo de datos: STIX 2.1 nativo
La diferencia fundamental de OpenCTI con otras plataformas CTI es que usa STIX 2.1 como modelo de datos nativo. No hay un modelo propietario que se convierte a STIX para exportar: los datos viven en STIX desde el momento de la ingesta.
STIX Domain Objects (SDO)
Los SDOs son las entidades principales del grafo:
| SDO | Uso en OpenCTI | Ejemplo |
|---|---|---|
| Threat Actor | Grupos o individuos que realizan actividades maliciosas | APT28 (G0007) |
| Intrusion Set | Conjunto de comportamientos y recursos atribuidos a un actor | Fancy Bear operations |
| Malware | Familias de malware | Emotet, LockBit 3.0 |
| Tool | Herramientas legítimas usadas por adversarios | Cobalt Strike, Mimikatz |
| Attack Pattern | Técnicas y tácticas (mapeo a MITRE ATT&CK) | T1566 Phishing |
| Campaign | Campañas con atribución temporal | Op. SolarNight |
| Vulnerability | CVEs con CVSS y contexto de explotación | CVE-2023-34362 |
| Indicator | IOCs con patrón STIX | [file:hashes.SHA-256 = 'abc...'] |
| Infrastructure | Infraestructura usada por adversarios | C2 server, botnet |
| Course of Action | Mitigaciones y respuestas | D3-NM Network Monitoring |
| Report | Informes de inteligencia | "APT28 Q1 2026 Activity Report" |
| Note | Anotaciones de analistas | Hipótesis, observaciones |
| Opinion | Valoraciones de confianza | "Estoy de acuerdo con la atribución" |
STIX Cyber Observables (SCO)
Los SCOs son los datos técnicos observables:
| SCO | Ejemplo |
|---|---|
| IPv4/IPv6 Address | 203.0.113.50 |
| Domain Name | malicious-example.com |
| URL | https://malicious-example.com/payload |
| File (hash) | SHA-256: a1b2c3d4... |
| Email Address | [email protected] |
| Process | cmd.exe con argumentos sospechosos |
| Network Traffic | JA3 fingerprint |
| Software | Windows 10, Apache 2.4 |
STIX Relationship Objects (SRO)
Las relaciones conectan SDOs y SCOs:
Threat Actor ──[uses]──────────→ Malware
Malware ──────[uses]──────────→ Attack Pattern
Campaign ─────[attributed-to]─→ Threat Actor
Indicator ────[indicates]─────→ Malware
Malware ──────[exploits]──────→ Vulnerability
Course of Action ─[mitigates]─→ Attack Pattern
Infrastructure ──[used-by]────→ Threat Actor
Cada relación tiene metadatos propios: confianza, fecha de inicio y fin, fuente, descripción. Esto permite modelar atribuciones probabilísticas y evolución temporal de campañas.
Knowledge Graph: visualización de relaciones
El knowledge graph es la funcionalidad central de OpenCTI. Permite navegar las relaciones entre entidades de forma visual e interactiva.
Navegación por entidad
Al abrir cualquier entidad (por ejemplo, APT28), OpenCTI muestra:
- Overview: resumen con metadatos, descripción, aliases, confianza
- Knowledge: grafo de relaciones con otras entidades (malware, TTPs, campañas, infraestructura, víctimas)
- Analysis: informes y notas vinculados
- Indicators: IOCs asociados con patrón STIX
- Data: observables técnicos
El grafo de conocimiento se puede expandir interactivamente: click en un nodo para ver sus relaciones, expandir vecinos, filtrar por tipo de relación, ajustar la profundidad.
Vistas del grafo
OpenCTI ofrece múltiples formas de visualizar el mismo grafo:
| Vista | Uso |
|---|---|
| Graph | Grafo de fuerzas interactivo (la vista principal) |
| Timeline | Línea temporal de actividad |
| Correlation | Matriz de correlaciones entre entidades |
| Map | Geolocalización de infraestructura y víctimas |
| Matrix | Vista tipo MITRE ATT&CK Navigator |
Ecosistema de conectores
OpenCTI tiene más de 80 conectores mantenidos por la comunidad y por Filigran. Los conectores se dividen en tres categorías:
Conectores de importación externa
Traen datos de fuentes externas a OpenCTI:
| Conector | Fuente | Datos |
|---|---|---|
| MITRE ATT&CK | mitre-attack.github.io | Técnicas, tácticas, grupos, software |
| MITRE D3FEND | d3fend.mitre.org | Mitigaciones defensivas |
| MISP Feed | Instancia MISP | Eventos, atributos, galaxias |
| AlienVault OTX | otx.alienvault.com | Pulsos, IOCs |
| abuse.ch (MalwareBazaar, ThreatFox, URLhaus) | abuse.ch | Hashes, C2, URLs |
| CISA KEV | cisa.gov | CVEs explotadas activamente |
| CVE (NVD) | nvd.nist.gov | Vulnerabilidades con CVSS |
| Malpedia | malpedia.caad.fkie.fraunhofer.de | Familias de malware, actores |
| VirusTotal | virustotal.com | Enriquecimiento de hashes, IPs, dominios |
| Shodan | shodan.io | Enriquecimiento de infraestructura |
| AbuseIPDB | abuseipdb.com | Reputación de IPs |
| Mandiant (Google) | advantage.mandiant.com | Actores, campañas, malware |
| CrowdStrike | falcon.crowdstrike.com | Inteligencia de actores |
| ESET | eset.com | IOCs y campañas |
| Sekoia.io | sekoia.io | Inteligencia de amenazas |
| OpenCTI Datasets | github.com/OpenCTI-Platform | Sectores, países, regiones |
Conectores de enriquecimiento interno
Procesan datos ya existentes en OpenCTI para añadir contexto:
| Conector | Función |
|---|---|
| ImportDocument | Extrae IOCs de documentos (PDF, DOCX, texto) |
| Hygiene | Limpia datos: elimina IPs privadas, dominios legítimos, hashes inválidos |
| IpInfo | Geolocalización y ASN de IPs |
| DomainTools | WHOIS y DNS de dominios |
| AbuseIPDB Enrichment | Score de abuso de IPs |
Conectores de exportación
Envían datos desde OpenCTI a otras plataformas:
| Conector | Destino |
|---|---|
| MISP | Instancia MISP (sincronización bidireccional) |
| Splunk | SIEM Splunk (IOCs como listas de watchlist) |
| Elastic | SIEM Elastic Security |
| TheHive | Plataforma de respuesta a incidentes |
| Cortex | Motor de análisis y respuesta |
| TAXII Server | Servidor TAXII 2.1 para distribución estándar |
Instalación de conectores
Cada conector es un contenedor Docker independiente que se añade al docker-compose.yml:
connector-mitre:
image: opencti/connector-mitre:6.4.2
environment:
- OPENCTI_URL=http://opencti:8080
- OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
- CONNECTOR_ID=connector-mitre-id
- CONNECTOR_NAME=MITRE ATT&CK
- CONNECTOR_SCOPE=attack-pattern,course-of-action,intrusion-set,malware,tool
- CONNECTOR_RUN_AND_TERMINATE=false
- CONNECTOR_LOG_LEVEL=info
- MITRE_INTERVAL=7 # días entre actualizaciones
restart: always
Dashboards y analytics
OpenCTI incluye un sistema de dashboards configurable que permite crear vistas analíticas personalizadas.
Dashboards predefinidos
- Global Dashboard: resumen de entidades, indicadores activos, últimos informes
- Threat Landscape: actores activos, campañas en curso, sectores afectados
- Indicators of Compromise: IOCs por tipo, fuente, confianza, fecha
- Vulnerability Management: CVEs por severidad, explotación activa
Widgets disponibles
| Widget | Visualización |
|---|---|
| Number | Contador (total de entidades) |
| Distribution | Pie/Donut chart (distribución por tipo) |
| List | Tabla con entidades filtradas |
| Timeline | Línea temporal de actividad |
| Heatmap | Mapa de calor (ATT&CK matrix, actividad temporal) |
| Map | Mapa geográfico |
| Tree | Jerarquía de relaciones |
| Bookmark | Entidades marcadas para seguimiento |
Los dashboards se pueden exportar como JSON y compartir entre instancias.
Workspaces e investigaciones
Los workspaces son espacios de trabajo colaborativos para investigaciones en curso. Permiten a los analistas:
- Crear una investigación: seleccionar entidades de interés, agruparlas en un workspace
- Construir el grafo: añadir entidades, crear relaciones, anotar con notas
- Colaborar: múltiples analistas trabajando en el mismo workspace con historial de cambios
- Documentar: añadir notas, opiniones y referencias a fuentes
- Exportar: generar informes PDF/STIX con los hallazgos
Los workspaces son el mecanismo principal para investigaciones que requieren más de una sesión o más de un analista.
Flujo de investigación típico
1. Alerta del SOC: IP sospechosa 203.0.113.50
↓
2. Crear workspace "Investigación IP 203.0.113.50"
↓
3. Buscar la IP en OpenCTI → encontrar indicador existente
↓
4. Expandir relaciones: ¿a qué malware está asociada? ¿qué actor la usa?
↓
5. Añadir entidades relacionadas al workspace
↓
6. Buscar otros IOCs del mismo actor/campaña en la organización
↓
7. Documentar hallazgos con notas
↓
8. Exportar informe para el SOC lead
API GraphQL y automatización
OpenCTI expone toda su funcionalidad a través de una API GraphQL. Esto permite automatizar cualquier operación que se puede hacer desde la UI.
Autenticación
# Obtener token: Settings → API Access → Token
# Header: Authorization: Bearer <token>
Consultas básicas
# Buscar actores de amenaza
query {
threatActors(
filters: {
mode: and
filters: [
{ key: "entity_type", values: ["Threat-Actor-Group"] }
]
}
first: 10
orderBy: created_at
orderMode: desc
) {
edges {
node {
id
name
aliases
first_seen
last_seen
sophistication
primary_motivation
}
}
}
}
# Buscar indicadores por tipo
query {
indicators(
filters: {
mode: and
filters: [
{ key: "pattern_type", values: ["stix"] }
{ key: "valid_until", values: ["2026-01-01"], operator: gt }
]
}
first: 50
) {
edges {
node {
id
name
pattern
valid_from
valid_until
x_opencti_score
}
}
}
}
Cliente Python
from pycti import OpenCTIApiClient
# Conexión
api = OpenCTIApiClient(
url="http://opencti:8080",
token="your-api-token"
)
# Buscar malware
malware_list = api.malware.list(
first=20,
orderBy="created_at",
orderMode="desc"
)
# Crear indicador
indicator = api.indicator.create(
name="Malicious IP",
pattern="[ipv4-addr:value = '203.0.113.50']",
pattern_type="stix",
x_opencti_score=80,
valid_from="2026-06-01T00:00:00Z"
)
# Crear relación
api.stix_core_relationship.create(
fromId=indicator["id"],
toId=malware_id,
relationship_type="indicates",
confidence=85
)
OpenCTI vs MISP: comparativa
Ambas plataformas son complementarias. La elección depende del caso de uso principal:
| Aspecto | MISP | OpenCTI |
|---|---|---|
| Foco principal | Sharing de IOCs entre organizaciones | Análisis y modelización de relaciones |
| Modelo de datos | Propietario (con export STIX) | STIX 2.1 nativo |
| Knowledge graph | No (correlaciones básicas) | Sí (grafo completo navegable) |
| Sharing groups | Excelente (modelo maduro) | Básico (marking definitions) |
| Sincronización | Directa entre instancias MISP | Via conectores (MISP, TAXII) |
| UI/UX | Funcional, orientada a operaciones | Moderna, orientada a análisis |
| Conectores | Limitados (feeds y export) | 80+ (importación, enriquecimiento, export) |
| API | REST (PyMISP) | GraphQL (pycti) |
| Comunidad | Muy grande, CERTs europeos | Creciendo rápido, enterprises |
| Curva de aprendizaje | Media | Media-alta (STIX + arquitectura) |
| Recursos necesarios | Bajos (puede correr en 4GB RAM) | Altos (ElasticSearch + todos los componentes) |
| Licencia | AGPL | Apache 2.0 (community) |
Cuándo elegir cada uno
MISP es mejor cuando:
- El objetivo principal es compartir IOCs con otras organizaciones
- Se necesita interoperar con CERTs y CSIRTs que ya usan MISP
- Los recursos de infraestructura son limitados
- El equipo CTI es pequeño y necesita empezar rápido
OpenCTI es mejor cuando:
- El objetivo es análisis profundo de relaciones entre entidades
- Se necesita un knowledge graph navegable
- Hay múltiples fuentes de inteligencia que integrar
- El equipo CTI necesita workspaces colaborativos para investigaciones
Ambos cuando:
- La organización tiene madurez CTI media-alta
- Se necesita sharing (MISP) y análisis (OpenCTI)
- Hay equipo para operar ambas plataformas
Despliegue con Docker Compose
La instalación recomendada de OpenCTI es con Docker Compose:
# Clonar repositorio oficial
git clone https://github.com/OpenCTI-Platform/docker.git
cd docker
# Configurar variables de entorno
cp .env.sample .env
# Editar .env: configurar tokens, contraseñas, puertos
Variables clave en .env:
[email protected]
OPENCTI_ADMIN_PASSWORD=ChangeMeNow!
OPENCTI_ADMIN_TOKEN=<uuid-generado>
OPENCTI_BASE_URL=http://localhost:8080
OPENCTI_HEALTHCHECK_ACCESS_KEY=<uuid-generado>
ELASTICSEARCH_MEMORY=4g
MINIO_ROOT_USER=opencti
MINIO_ROOT_PASSWORD=ChangeMeNow!
RABBITMQ_DEFAULT_USER=opencti
RABBITMQ_DEFAULT_PASS=ChangeMeNow!
Requisitos mínimos para producción:
| Recurso | Mínimo | Recomendado |
|---|---|---|
| RAM | 16 GB | 32 GB+ |
| CPU | 4 cores | 8 cores |
| Disco | 100 GB SSD | 500 GB+ SSD (ElasticSearch es intensivo) |
| Red | Acceso HTTPS saliente | IP fija para acceso externo |
# Levantar la plataforma
docker compose up -d
# Verificar que todos los servicios están corriendo
docker compose ps
# Ver logs de la plataforma
docker compose logs -f opencti
Post-instalación
- Acceder a
http://localhost:8080con credenciales configuradas - Configurar conectores prioritarios (MITRE ATT&CK, abuse.ch, CVE)
- Crear organizaciones y usuarios
- Configurar marking definitions (TLP)
- Importar datos iniciales (MITRE ATT&CK tarda unos minutos)
- Crear dashboards personalizados
Escalado
Para entornos de producción con alto volumen de datos:
- ElasticSearch: cluster de 3 nodos mínimo con réplicas
- RabbitMQ: cluster para alta disponibilidad de mensajes
- Workers: escalar horizontalmente según el número de conectores activos
- MinIO: cluster para almacenamiento de ficheros redundante
Integraciones avanzadas
OpenCTI + TheHive
TheHive es la plataforma complementaria natural para respuesta a incidentes. El conector bidireccional permite:
- Crear alertas en TheHive desde indicadores de OpenCTI
- Enriquecer casos de TheHive con contexto de OpenCTI
- Sincronizar observables entre ambas plataformas
OpenCTI + Cortex
Cortex ejecuta análisis automatizados (analyzers) sobre observables. Combinado con OpenCTI:
- Enriquecimiento automático de IOCs (VirusTotal, Shodan, DomainTools)
- Respuesta automatizada a indicadores de alta confianza
- Feedback loop: resultados de Cortex actualizan el score en OpenCTI
OpenCTI + Elastic Security
Para organizaciones que usan Elastic como SIEM:
- Exportación automática de IOCs a Elastic Threat Intelligence
- Correlación de alertas de Elastic con contexto de OpenCTI
- Dashboard unificado de amenazas
Recursos
- OpenCTI (filigran.io/solutions/products/opencti). Sitio oficial de Filigran con documentación, releases y soporte.
- OpenCTI Documentation (docs.opencti.io). Documentación técnica completa: instalación, configuración, API, conectores.
- OpenCTI GitHub (github.com/OpenCTI-Platform/opencti). Código fuente, issues y releases.
- OpenCTI Connectors (github.com/OpenCTI-Platform/connectors). Repositorio oficial de 80+ conectores.
- pycti (github.com/OpenCTI-Platform/client-python). Cliente Python oficial para la API GraphQL.
- Filigran Blog (blog.filigran.io). Artículos técnicos sobre CTI, OpenCTI y casos de uso.
- STIX 2.1 Specification (docs.oasis-open.org/cti/stix/v2.1). Especificación completa del modelo de datos.
- MalwareIntel (malwareintel.es). Plataforma CTI con knowledge graph de amenazas, familias de malware y actores.
Preguntas frecuentes
Artículos relacionados
Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.