Перейти к основному содержимому
Версия: 2.0

OpenCTI

Интеграция с OpenCTI​

Данное руководство описывает быструю настройку интеграции Solar TI Feeds Agent с OpenCTI для автоматической загрузки индикаторов компрометации (IoC).


Предварительные требования​

  • Установленный и настроенный Solar TI Feeds Agent
  • Действительный JWT-токен для доступа к Solar TI Feeds API
  • Учётные данные для доступа к OpenCTI API (JWT-аутентификация)

Конфигурация интеграции​

Интеграция автоматизирует выгрузку индикаторов из Solar TI Feeds в OpenCTI. Для подключения к системе используется аутентификация типа JwtAuth.

Основные компоненты интеграции:

КомпонентНазначение
FeedsAPIGeneratorЗагрузка данных из Solar TI Feeds API
FeedsDBSinkСохранение данных в локальную SQLite-базу
FeedsDBGeneratorЧтение данных из базы для обработки
FeedsFailedDBGeneratorПовторная обработка ошибочных записей
OpenCTISinkОтправка данных в OpenCTI через API

Переменные окружения​

Для работы интеграции необходимо определить следующие переменные окружения в файле docker-compose.yml:

ПеременнаяНазначениеЗначение по умолчанию
TIC_AGENT_OPENCTI_ADDRESSURL-адрес сервера OpenCTI API-
TIC_AGENT_OPENCTI_TOKENJWT-токен для аутентификации в OpenCTI-
TIC_AGENT_OPENCTI_TLPУровень TLP: red, amber, green, whitered
TIC_AGENT_OPENCTI_TYPEТип сущности: indicator или observedindicator
TIC_AGENT_OPENCTI_API_VERSIONВерсия API: 6 или 77
TIC_AGENT_OPENCTI_PROXYСтрока подключения к прокси-серверу для OpenCTI (например, socks5://user:password@proxy.domain:port)-

Структура pipeline для OpenCTI​

В актуальной версии конфигурации используется один комплексный pipeline, а не отдельные pipeline для каждого фида. Pipeline состоит из двух частей:

Pipeline 1: feeds-api (загрузка данных)​

КомпонентПараметрыОписание
FeedsAPIGeneratorname = "feeds-api-generator"Запрос данных из Solar TI Feeds API с настраиваемыми интервалом и размером пакета. Запрашиваются все поля (fields = "all").
server = templates.TICApiCfg (адрес и токен из TIC_AGENT_API_URL / TIC_AGENT_API_TOKEN)
schedule = (read?("env:TIC_AGENT_API_POOL_INTERVAL") ?? 3600).toInt().s
filter.pagination.limit = (read?("env:TIC_AGENT_API_BATCH_SIZE") ?? 1000).toInt()
FeedsDBSinkname = "feeds-db-sink"
inputs = ["feeds-api-generator"]
Сохранение всех полученных данных в SQLite-базу для последующей обработки.

Pipeline 2: open-cti (обработка и выгрузка)​

КомпонентПараметрыОписание
FeedsDBGeneratorname = "open-cti-feeds-db-generator"Чтение индикаторов из БД с настраиваемыми интервалом, задержкой и размером пакета.
schedule = (read?("env:TIC_AGENT_DB_POOL_INTERVAL") ?? 600).toInt().s
delay = (read?("env:TIC_AGENT_DB_START_DELAY") ?? 60).toInt().s
batchSize = (read?("env:TIC_AGENT_DB_BATCH_SIZE") ?? 100).toInt()
batchDelay = (read?("env:TIC_AGENT_DB_BATCH_DELAY") ?? 100).toInt().ms
FeedsFailedDBGeneratorname = "open-cti-feeds-db-failed-generator"Повторная обработка индикаторов, отправка которых ранее завершилась ошибкой. Привязан к основному генератору через feedGenName. Параметры schedule и delay не задаются – используются значения по умолчанию, заданные в компоненте.
feedGenName = "open-cti-feeds-db-generator"
OpenCTISinkname = "open-cti-sink"Отправка подготовленных индикаторов в OpenCTI. Аутентификация – JWT. Поддерживается прокси. Параметры vendor, vendorId, connectorId, support используются со значениями по умолчанию.
inputs = ["open-cti-feeds-db-generator", "open-cti-feeds-db-failed-generator"]
server = new agent.ServerCfg {
  address = read("env:TIC_AGENT_OPENCTI_ADDRESS")
  credentials = new agent.JwtAuth {
    token = read("env:TIC_AGENT_OPENCTI_TOKEN")
  }
  proxy = read?("env:TIC_AGENT_OPENCTI_PROXY")
}
tlpLevel = (read?("env:TIC_AGENT_OPENCTI_TLP") ?? "red") as agent.OpenCTILevel
type = (read?("env:TIC_AGENT_OPENCTI_TYPE") ?? "indicator") as agent.OpenCTIType
apiVersion = (read?("env:TIC_AGENT_OPENCTI_API_VERSION") ?? "7") as agent.OpenCTIAPIVersion
idleTO = 30.min

Справочник параметров для OpenCTI​

Параметры ServerCfg (подключение к OpenCTI)​

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписаниеПример
credentialsJwtAuthnew NoAuth ДаДанные для аутентификацииcredentials = new JwtAuth token = read("env:TIC_AGENT_OPENCTI_TOKEN")
addressAddressДаURL-адрес сервера OpenCTI APIaddress = "https://opencti.example.com:4000"
timeoutDuration1.minНетТаймаут запросовtimeout = 120.s
retriesInt5НетКоличество повторных попытокretries = 3
retryTimeoutDuration10.sНетНачальная задержка между попыткамиretryTimeout = 5.s
retryMaxTimeoutDuration50.sНетМаксимальная задержка между попыткамиretryMaxTimeout = 30.s
insecureSkipVerifyBooleanfalseНетОтключение проверки SSL-сертификатаinsecureSkipVerify = true
proxyStringnullНетПрокси-сервер для подключенияproxy = "http://proxy.example.com:8080"

Параметры OpenCTISink​

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписание
serverServerCfgДаКонфигурация подключения к серверу OpenCTI
vendorString"Solar"НетИмя вендора
vendorIdString"bd38130d-9bfb-426a-8c3b-ecc46e92ff83"НетИдентификатор вендора в OpenCTI
connectorIdString"cf0c51c7-5580-4511-8787-a6d569e78ef7"НетИдентификатор коннектора в OpenCTI
supportString"support.tic@solar-rt.ru"НетАдрес поддержки
tlpLevelOpenCTILevelДаУровень TLP: red, amber, green, white
typeOpenCTITypeДаТип сущности: indicator или observed
apiVersionOpenCTIAPIVersion"7"НетВерсия API OpenCTI: 6 или 7
idleTODuration30.min (в данной конфигурации)НетТаймаут бездействия перед закрытием соединения

Доступные уровни TLP​

ЗначениеОписание
redИнформация предназначена только для конкретных получателей
amberИнформация может распространяться только внутри организации
greenИнформация может распространяться внутри сообщества
whiteИнформация может распространяться неограниченно

Доступные типы сущностей​

ЗначениеОписание
indicatorИндикатор компрометации (STIX Indicator)
observedНаблюдаемая сущность (STIX Observed Data)

Полный код конфигурационного файла для интеграции с OpenCTI​

📄 Нажмите, чтобы показать/скрыть opencti_pipeline.pkl
amends "package://pkg.pkl-lang.org/github.com/pipelane/pipelaner/pipelaner@1.3.1#/Pipelaner.pkl"
import "package://pkg.pkl-lang.org/github.com/pipelane/pipelaner/pipelaner@1.3.1#/source/Components.pkl"
import "../pkl/internal/agent.pkl"
import "../pkl/internal/templates.pkl"

pipelines {
new Components.Pipeline {
name = "feeds-api"
inputs {
new agent.FeedsAPIGenerator {
name = "feeds-api-generator"
server = templates.TICApiCfg
schedule = (read?("env:TIC_AGENT_API_POOL_INTERVAL") ?? 3600).toInt().s
filter = new agent.FeedsAPIRequestParams {
fields = new Listing {
"all"
}
pagination = new agent.Pagination {
limit = (read?("env:TIC_AGENT_API_BATCH_SIZE") ?? 1000).toInt()
}
}
}
}
sinks {
new agent.FeedsDBSink {
name = "feeds-db-sink"
inputs {
"feeds-api-generator"
}
}
}
}

new Components.Pipeline {
name = "open-cti"
inputs {
new agent.FeedsDBGenerator {
name = "open-cti-feeds-db-generator"
schedule = (read?("env:TIC_AGENT_DB_POOL_INTERVAL") ?? 600).toInt().s
delay = (read?("env:TIC_AGENT_DB_START_DELAY") ?? 60).toInt().s
batchSize = (read?("env:TIC_AGENT_DB_BATCH_SIZE") ?? 100).toInt()
batchDelay = (read?("env:TIC_AGENT_DB_BATCH_DELAY") ?? 100).toInt().ms
}
new agent.FeedsDBFailedGenerator {
name = "open-cti-feeds-db-failed-generator"
feedGenName = "open-cti-feeds-db-generator"
}
}
sinks {
new agent.OpenCTISink {
name = "open-cti-sink"
inputs {
"open-cti-feeds-db-generator"
"open-cti-feeds-db-failed-generator"
}
server = new agent.ServerCfg {
address = read("env:TIC_AGENT_OPENCTI_ADDRESS")
credentials = new agent.JwtAuth {
token = read("env:TIC_AGENT_OPENCTI_TOKEN")
}
proxy = read?("env:TIC_AGENT_OPENCTI_PROXY")
}
tlpLevel = (read?("env:TIC_AGENT_OPENCTI_TLP") ?? "red") as agent.OpenCTILevel
type = (read?("env:TIC_AGENT_OPENCTI_TYPE") ?? "indicator") as agent.OpenCTIType
apiVersion = (read?("env:TIC_AGENT_OPENCTI_API_VERSION") ?? "7") as agent.OpenCTIAPIVersion
idleTO = 30.min
}
}
}
}

settings = templates.baseSettings

Мониторинг результатов работы интеграции​

После запуска агента убедитесь в корректности работы интеграции:

ПроверкаДействие
Проверка логов агентаПросмотрите логи в директории ./workdir/logs на наличие ошибок или предупреждений
Верификация в OpenCTIВ интерфейсе OpenCTI перейдите в раздел Indicators и убедитесь, что индикаторы загружаются с указанным вендором "Solar"
Проверка TLP уровняВ карточке индикатора проверьте, что установлен корректный уровень TLP
Проверка типа сущностиУбедитесь, что индикаторы создаются с правильным типом (indicator или observed)

Примечание: Логи агента также можно просмотреть в реальном времени с помощью команды docker logs {CONTAINER_NAME}.