openCTI 101 – Instalación

por Alberto Jódar
0 comentario 9 minutos lectura
Artículos de la serie
openCTI
  1. 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.

Deja un comentario

* Al utilizar este formulario usted acepta el almacenamiento y tratamiento de sus datos por parte de este sitio web.

Este sitio web utiliza cookies para mejorar su experiencia Aceptar Leer más