- openCTI 101 – Instalación
OpenCTI es una herramienta de software libre que nos va a permitir construir una base de datos de ciberinteligencia (CTI) donde modelar el conocimiento sobre amenazas, actores… Se basa en la implementación del modelo STIX 2.1, un estándar que se basa en nodos de información y elementos de relación entre dichos nodos. Por ejemplo:

A un actor (threat actor) se le atribuye una campaña (Campaign) que está relacionada con una TTP que realiza una explotación (ExploitTarget)… Como veis, se basa en nodos de información y su relación. Solo para que vaya sonando, la lista de los diferentes tipos de nodos que se puede crear se llaman SDO (STIX Domain Object) y a sus posibles relaciones SRO (STIX Relationship Object).
Con esto nos vale de base. Conforme vayamos avanzando vemos las posibilidades y flujos de datos, que no son pocos. En este primer artículo solo vamos a hacer un despliegue sencillo con Docker Compose.
Os dejo el artículo de Docker Compose que escribimos en el blog: https://dfirpills.com/sysadmin/docker/docker-para-ciberseguridad-parte-5-docker-compose-1/
Instalación con Docker
Para la guía de instalación se ha usado la documentación oficial: https://docs.opencti.io/latest/deployment/installation/
Lo primero es tener Docker Compose instalado. Con eso ya descargamos la versión oficial del Docker Compose de openCTI.
$> sudo apt install docker-compose-v2
$> mkdir opencti
$> cd opencti
$> git clone https://github.com/OpenCTI-Platform/docker.git
$> cd docker
Ya con esto editamos el Compose antes de lanzarlo. El fichero «docker-compose.yml» controla los parámetros con los que se van a lanzar los servicios. Aunque suele venir por defecto en el proyecto de GitHub, nos aseguramos que tenga el siguiente valor:
elasticsearch:
environment:
- thread_pool.search.queue_size=5000
Hacemos lo mismo con el fichero «rabbitmq.conf»:
max_message_size = 536870912
consumer_timeout = 86400000
Las variables que controlan la instalación se encuentran en un fichero oculto de nombre «.env.sample». Para que haga «efecto» debemos renombrarlo únicamente como «.env»:
mv .env.sample .env
Al ser una instalación local en entorno de laboratorio, edito las variables imprescindibles. Podemos usar el comando que indica la documentación para un despliegue sencillo:
sudo apt install -y jq
cd ~/docker
(cat << EOF
OPENCTI_ADMIN_EMAIL=admin@opencti.io
OPENCTI_ADMIN_PASSWORD=ChangeMePlease
OPENCTI_ADMIN_TOKEN=$(cat /proc/sys/kernel/random/uuid)
OPENCTI_BASE_URL=http://localhost:8080
OPENCTI_HEALTHCHECK_ACCESS_KEY=$(cat /proc/sys/kernel/random/uuid)
MINIO_ROOT_USER=$(cat /proc/sys/kernel/random/uuid)
MINIO_ROOT_PASSWORD=$(cat /proc/sys/kernel/random/uuid)
RABBITMQ_DEFAULT_USER=guest
RABBITMQ_DEFAULT_PASS=guest
ELASTIC_MEMORY_SIZE=4G
CONNECTOR_HISTORY_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_EXPORT_FILE_STIX_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_EXPORT_FILE_CSV_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_IMPORT_FILE_STIX_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_EXPORT_FILE_TXT_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_IMPORT_DOCUMENT_ID=$(cat /proc/sys/kernel/random/uuid)
CONNECTOR_ANALYSIS_ID=$(cat /proc/sys/kernel/random/uuid)
SMTP_HOSTNAME=localhost
EOF
) > .env
Además debemos de configurar el siguiente valor para elasticsearch:
$> sudo sysctl -w vm.max_map_count=1048575
# Para hacerlo permanente
$> nano /etc/sysctl.conf
vm.max_map_count=1048575
Con esto listo. Ya podemos lanzar los servicios con Docker Compose:
$> sudo systemctl start docker.service
# Run docker-compose in detached
$> docker compose up -d
Con la IP de la máquina y el puerto 8080 accedemos al servicio web de openCTI.
EXTRA: Arquitectura
Como un capítulo opcional vamos a repasar la arquitectura de los servicios que levanta openCTI.
Veamos cada elemento del diagrama.
Plataforma (platform)
Es el elemento central. La consola web a la que entran los usuarios. Gestiona el control de acceso, los grupos… Además, también expone los datos vía API usando GraphQL API.
La clave de este elemento y en general de openCTI es como almacenamos los datos. Para ello se implementan 3 tecnologías:
- Elasticsearch: Donde se almacena toda la estructura de nodos y relaciones, lo que denominamos el knowledge
- Redis: Almacenamiento caché principalmente para agilizar el flujo de trabajo dentro de openCTI
- S3 Bucket: Se usa para almacenar los datos más pesados como ficheros
Workers
Los workers proveen la capacidad de trabajar de forma asíncrona en openCTI. Normalmente se ejecutan operaciones que requieren de mover grandes volúmenes de datos. Consultas, importaciones y exportaciones, creación y procesado… Los workers permiten que estas operaciones se ejecuten de forma asíncrona, sin interrumpir la operación hasta su finalización.
Esto aun así es limitado. OpenCTI nos recomienda limitar a 3 workers por plataforma.
Conectores
Es código Python que se usa para interactuar con sistemas externos, tanto para tratar, importar o exportar datos. Hay 5 tipos de conectores:
- EXTERNAL_IMPORT: Obtiene datos del exterior, los transforma a STIX y los introduce en openCTI. Por ejemplo, los de MITRE Datasets, MISP, CVE, AlienVault, Mandiant, etc.
- INTERNAL_ENRICHMENT: Se lanzan ante triggers de creación o modificación de entidades internas. Por ejemplo cuando se crea un observable de tipo URL. Entonces ejecutan un código. Normalmente usado para consultar en sistemas externos y enriquecer la entidad. Algunos como Shodan, DomainTools, IpInfo, etc.
- INTERNAL_IMPORT_FILE: Extrae datos de un fichero como PDF, Text, HTML, etc.
- INTERNAL_EXPORT_FILE: Genera ficheros basados en la información contenida en openCTI. Algunos como STIX 2.1, CSV, PDF, etc.
- STREAM: Basado en eventos dentro de la plataforma
El listado oficial de conectores soportado se puede encontrar en: https://filigran.notion.site/OpenCTI-Ecosystem-868329e9fb734fca89692b2ed6087e76
Requisitos
Os dejo la tabla de requisitos que se recoge en la documentación oficial:
Conclusión
Software instalado. En las próximas entradas entramos en detalle de la solución y varios detalles importantes sobre openCTI como herramienta y su implementación de STIX.



