Instalando y configurando OpenCTI parte II
Foto de Clay Banks en Unsplash
Con la configuración base explicada en la entrega anterior, ya obtenemos la ingesta automática de la matriz **MITRE ATT&CK**. Esta información es más que suficiente para que nuestro flujo integrador (**Wazuh ➔ Shuffle ➔ OpenCTI ➔ TheHive**) proporcione un contexto rico y detallado de cada alerta recibida.
Para cuidar la salud del sistema y mantener un laboratorio ágil, hemos dejado estos conectores adicionales comentados (desactivados con `#`) dentro del archivo `docker-compose-connectors.yml`. De esta manera, el sistema no consume recursos innecesarios, pero la infraestructura queda 100% lista para ser activada en cualquier momento.
Arquitectura modular: ¿Por qué usamos dos archivos Compose?
Volvemos al servidor 2 y vemos los archivos.
Rutas de archivos:
Ruta absoluta al directorio de trabajo de OpenCTI (Servidor 2):
/opt/soc-stack/opencti/

Archivo del Núcleo de OpenCTI (Motor principal):
/opt/soc-stack/opencti/docker-compose.ymlArchivo de Conectores (Ingesta de Inteligencia / MITRE / Feeds adicionales):
/opt/soc-stack/opencti/docker-compose-connectors.ymlCopia de seguridad del archivo principal:
/opt/soc-stack/opencti/docker-compose.yml.bakTodos los ficheros de configuración de la plataforma se encuentran centralizados en el directorio /opt/soc-stack/opencti/. En él diferenciamos el archivo del motor principal (docker-compose.yml) del archivo dedicado exclusivamente a la gestión de fuentes de inteligencia externa (docker-compose-connectors.yml).
La separación de responsabilidades en la instalación de OpenCTI responde a una buena práctica de ingeniería de sistemas:
`docker-compose.yml`: Gestiona el núcleo (core) de OpenCTI. Aquí residen los motores principales: la interfaz web, el servidor GraphQL y las bases de datos (Elasticsearch, Redis y MinIO).
`docker-compose-connectors.yml`: Funciona como la puerta de entrada modular de información. En él se definen de forma independiente todos los conectores que ingieren inteligencia desde fuentes externas hacia OpenCTI.
¿Qué conectores adicionales dejamos listos y para qué sirven?
1. AlienVault OTX (Reputación de Amenazas - IPs, Dominios y URLs)
Función: Ingiere feeds comunitarios sobre direcciones IP, dominios y URLs maliciosas conocidas en tiempo real.
Requisito: Crear una cuenta gratuita en la plataforma de [AlienVault OTX](https://otx.alienvault.com/) y obtener una API Key personal


2. NVD CVE (Base de Datos Oficial de Vulnerabilidades del NIST)
Función: Importa el catálogo completo de vulnerabilidades conocidas (*Common Vulnerabilities and Exposures*).
Requisito: Se recomienda solicitar una *API Key* gratuita en el portal para desarrolladores de la [NVD NIST API](https://nvd.nist.gov/developers/request-an-api-key) para agilizar el ritmo de descargas.
Jose
Pregunta de examen. Estoy registrado en AlienVault OTX Y ahora no recuerdo porque...Sabes tu si a lo largo de la configuración de este SOC hemos utilizado la API de AlienVault...Me suena y no se de que.
Gemini Web
1. En Wazuh (Enriquecimiento e integración de IOCs)
Es muy probable que en los primeros pasos con Wazuh o Suricata configuraras una integración para que Wazuh consulte automáticamente las IPs, hashes o dominios sospechosos contra AlienVault OTX (mediante un script de integración o un rule extension).
2. En TheHive / Cortex (Corta/Larga investigación de observables)
En TheHive, cuando te llega una alerta y quieres analizar un observable (por ejemplo, una IP pública de la que ha saltado una alerta), Cortex utiliza el analizador de AlienVault OTX usando precisamente esa clave OTX para decirte de un vistazo si esa IP está metida en "pulsos" de malware o botnets conocidos.
Pero por ahora tu ossec.conf está impecable, limpio y perfectamente enfocado a enviar los eventos hacia Shuffle/TheHive. No le añadas el bloque de AlienVault a Wazuh; guarda esa API Key en tus notas para cuando nos pongamos manos a la obra con el lienzo de Shuffle.
Fin de Gemini Web
2. NVD CVE (Base de Datos Oficial de Vulnerabilidades del NIST)
Función: Importa el catálogo completo de vulnerabilidades conocidas (Common Vulnerabilities and Exposures).
Requisito: Se recomienda solicitar una API Key gratuita en el portal para desarrolladores de la [NVD NIST API](https://nvd.nist.gov/developers/request-an-api-key) para agilizar el ritmo de descargas.

3. CISA KEV (Known Exploited Vulnerabilities)
Función: Recopila la lista oficial de vulnerabilidades que los ciberdelincuentes están explotando de forma activa en el mundo real.
Requisito: No requiere clave API; basta con descomentar el bloque del servicio para activarlo.
Estructura final del archivo `docker-compose-connectors.yml`
Para mantener la jerarquía YAML intacta, los conectores adicionales comentados deben ubicarse dentro de la sección `services:`, situándolos justo debajo del conector activo de MITRE y por encima de la declaración de la red (`networks:`):
Vamos a editar el archivo con nano:
sudo nano docker-compose-connectors.ymlPegamos el código:
version: '3'
services:
connector-mitre:
image: opencti/connector-mitre:6.2.18
restart: unless-stopped
environment:
- OPENCTI_URL=http://opencti:8080
- OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
- CONNECTOR_ID=dd803323-9dcd-4d89-98ff-a02ff0afdc64
- CONNECTOR_TYPE=EXTERNAL_IMPORT
- CONNECTOR_NAME=MITRE ATT&CK
- CONNECTOR_SCOPE=identity,attack-pattern,course-of-action,intrusion-set,malware,tool,report
- CONNECTOR_CONFIDENCE_LEVEL=100
- CONNECTOR_UPDATE_EXISTING_DATA=true
- CONNECTOR_LOG_LEVEL=info
- MITRE_ENTERPRISE_URL=https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json
- MITRE_PRE_ATTACK_URL=https://raw.githubusercontent.com/mitre/cti/master/pre-attack/pre-attack.json
- MITRE_MOBILE_URL=https://raw.githubusercontent.com/mitre/cti/master/mobile-attack/mobile-attack.json
- MITRE_ICS_URL=https://raw.githubusercontent.com/mitre/cti/master/ics-attack/ics-attack.json
- MITRE_INTERVAL=7 # Se actualiza cada 7 días
networks:
- opencti_default
# ------------------------------------------------------------
# CONECTOR: AlienVault OTX (IPs, Dominios y URLs maliciosas)
# ------------------------------------------------------------
# connector-alienvault:
# image: opencti/connector-alienvault:6.2.18
# restart: unless-stopped
# environment:
# - OPENCTI_URL=http://opencti:8080
# - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
# - CONNECTOR_ID=cambiar_por_un_uuid_v4_unico
# - CONNECTOR_TYPE=EXTERNAL_IMPORT
# - CONNECTOR_NAME=AlienVault OTX
# - CONNECTOR_SCOPE=alienvault
# - CONNECTOR_CONFIDENCE_LEVEL=75
# - CONNECTOR_UPDATE_EXISTING_DATA=true
# - CONNECTOR_LOG_LEVEL=info
# - ALIENVAULT_API_KEY=AQUI_TU_API_KEY_DE_ALIENVAULT
# - ALIENVAULT_CREATE_OBSERVABLES=true
# - ALIENVAULT_INTERVAL=30 # En minutos
# networks:
# - opencti_default
# ------------------------------------------------------------
# CONECTOR: NVD (CVEs / Vulnerabilidades Oficiales NIST)
# ------------------------------------------------------------
# connector-cve:
# image: opencti/connector-cve:6.2.18
# restart: unless-stopped
# environment:
# - OPENCTI_URL=http://opencti:8080
# - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
# - CONNECTOR_ID=cambiar_por_otro_uuid_v4_unico
# - CONNECTOR_TYPE=EXTERNAL_IMPORT
# - CONNECTOR_NAME=NVD CVE
# - CONNECTOR_SCOPE=vulnerability
# - CONNECTOR_CONFIDENCE_LEVEL=90
# - CONNECTOR_UPDATE_EXISTING_DATA=true
# - CONNECTOR_LOG_LEVEL=info
# - CVE_API_KEY=AQUI_TU_API_KEY_NVD
# - CVE_IMPORT_HISTORY=true
# - CVE_INTERVAL=24 # En horas
# networks:
# - opencti_default
# ------------------------------------------------------------
# CONECTOR: CISA KEV (Known Exploited Vulnerabilities)
# ------------------------------------------------------------
# connector-cisa-kev:
# image: opencti/connector-cisa-kev:6.2.18
# restart: unless-stopped
# environment:
# - OPENCTI_URL=http://opencti:8080
# - OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
# - CONNECTOR_ID=cambiar_por_otro_uuid_v4_unico_2
# - CONNECTOR_TYPE=EXTERNAL_IMPORT
# - CONNECTOR_NAME=CISA KEV
# - CONNECTOR_SCOPE=vulnerability
# - CONNECTOR_CONFIDENCE_LEVEL=100
# - CONNECTOR_UPDATE_EXISTING_DATA=true
# - CONNECTOR_LOG_LEVEL=info
# - CISA_KEV_INTERVAL=24 # En horas
# networks:
# - opencti_default
networks:
opencti_default:
external: true
name: opencti_default
Este seria el final del archivo.

Vemos al principio del archivo version: `3`
Al ejecutar
sudo docker compose -f docker-compose-connectors.yml up -d
Nos da como vemos dos advertencias y Gemini Web nos lo aclara:
Aviso 1: the attribute 'version' is obsolete...
- Causa: Las versiones modernas de Docker Compose (V2) ya no necesitan que pongas
version: '3'al principio del fichero. Se considera obsoleto porque ahora Docker detecta automáticamente el formato. - ¿Cómo quitarlo? Si quieres que no vuelva a salir ese aviso, abre el fichero con
sudo nano docker-compose-connectors.ymly borra directamente la primera línea que poneversion: '3'. El archivo debe empezar directamente conservices:.
Aviso 2: Found orphan containers...
- Causa: Te avisa de que en esa carpeta existen otros contenedores (los de OpenCTI como
redis,elasticsearch,rabbitmq, etc.) que no están definidos endocker-compose-connectors.yml. - Es 100% normal: Como dividimos la infraestructura en dos archivos (
docker-compose.ymlpara el motor ydocker-compose-connectors.ymlpara los conectores), este aviso siempre saldrá al lanzar los conectores por separado. Puedes ignorarlo con total tranquilidad o añadir--remove-orphanssolo si quisieras limpiarlos (que en nuestro caso no queremos porque tumbaría el OpenCTI principal).
¡Tu conector de MITRE está verde y corriendo (Running)! Ya tienes el fichero recuperado, con todo el código estructurado y funcionando como un reloj.
Guía paso a paso para activarlos (Entornos con +16/32 GB de RAM)
Si se dispone de un servidor con recursos suficientes y se desea activar cualquiera de estos feeds de inteligencia, el procedimiento consiste en:
1. Editar el archivo:
sudo nano docker-compose-connectors.yml2. Descomentar el bloque: Eliminar el carácter `#` de las líneas del conector que se desea poner en marcha.
3. Generar un identificador único (Regla de oro):
Cada conector necesita su propio "DNI" o pasaporte único en OpenCTI para evitar colisiones en la base de datos. En la terminal de Linux, se debe ejecutar:
uuidgen¿Por qué cada conector necesita su propio UUID?
Para OpenCTI, el `CONNECTOR_ID` es como el DNI o número de pasaporte del conector.
Cuando un conector se conecta a OpenCTI y le dice “hola, te traigo datos”, OpenCTI mira esa clave única (el UUID) para registrarlo en su panel de administración (*Data ➔ Connectors*).
Si usaras el*mismo UUID para dos conectores diferentes (por ejemplo, para AlienVault y para NVD), OpenCTI se volvería loco pensando que son la misma máquina, se sobrescribirían el uno al otro y daría error.
Por eso, cada servicio que descomentes debe tener su propia identidad única.
El código resultante generado se debe copiar y pegar en la variable `CONNECTOR_ID=` del bloque correspondiente.
4. Asignar la clave API: Introducir la API Key obtenida en la variable correspondiente (`ALIENVAULT_API_KEY` o `CVE_API_KEY`).
5. *Re-desplegar la infraestructura: Guardar los cambios en nano (`Ctrl + O`, `Enter`, `Ctrl + X`) y aplicar la nueva configuración con:
sudo docker compose -f docker-compose-connectors.yml up -dDe esta forma, la plataforma queda perfectamente preparada para escalar a nivel Enterprise en función de las necesidades y capacidad de hardware de cada infraestructura.
Fin de Gemini Web
Yo no he aplicado los nuevos conectores.
Si alguno/a lo intenta y le sale bien ¡¡¡Chapo!!!
Barakaldo 26 de julio de 2026
Etiquetas:
También te podría interesar...
🔥 Lo más leído en el blog
Sobre Jose
Este autor prefiere mantener el misterio y aún no ha escrito su biografía.
Comentarios (0)
Inicia sesión para unirte a la conversación.
No hay comentarios aún. ¡Sé el primero en comentar!