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_ADDRESS | URL-адрес сервера OpenCTI API | - |
TIC_AGENT_OPENCTI_TOKEN | JWT-токен для аутентификации в OpenCTI | - |
TIC_AGENT_OPENCTI_TLP | Уровень TLP: red, amber, green, white | red |
TIC_AGENT_OPENCTI_TYPE | Тип сущности: indicator или observed | indicator |
TIC_AGENT_OPENCTI_API_VERSION | Версия API: 6 или 7 | 7 |
TIC_AGENT_OPENCTI_PROXY | Строка подключения к прокси-серверу для OpenCTI (например, socks5://user:password@proxy.domain:port) | - |
Структура pipeline для OpenCTI
В актуальной версии конфигурации используется один комплексный pipeline, а не отдельные pipeline для каждого фида. Pipeline состоит из двух частей:
Pipeline 1: feeds-api (загрузка данных)
| Компонент | Параметры | Описание |
|---|---|---|
FeedsAPIGenerator | name = "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() | ||
FeedsDBSink | name = "feeds-db-sink"inputs = ["feeds-api-generator"] | Сохранение всех полученных данных в SQLite-базу для последующей обработки. |
Pipeline 2: open-cti (обработка и выгрузка)
| Компонент | Параметры | Описание |
|---|---|---|
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 | ||
FeedsFailedDBGenerator | name = "open-cti-feeds-db-failed-generator" | Повторная обработка индикаторов, отправка которых ранее завершилась ошибкой. Привязан к основному генератору через feedGenName. Параметры schedule и delay не задаются – используются значения по умолчанию, заданные в компоненте. |
feedGenName = "open-cti-feeds-db-generator" | ||
OpenCTISink | name = "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 { | ||
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)
| Параметр | Тип данных | Значение по умолчанию | Обязательность | Описание | Пример |
|---|---|---|---|---|---|
credentials | JwtAuth | new NoAuth | Да | Данные для аутентификации | credentials = new JwtAuth token = read("env:TIC_AGENT_OPENCTI_TOKEN") |
address | Address | Да | URL-адрес сервера OpenCTI API | address = "https://opencti.example.com:4000" | |
timeout | Duration | 1.min | Нет | Таймаут запросов | timeout = 120.s |
retries | Int | 5 | Нет | Количество повторных попыток | retries = 3 |
retryTimeout | Duration | 10.s | Нет | Начальная задержка между попытками | retryTimeout = 5.s |
retryMaxTimeout | Duration | 50.s | Нет | Максимальная задержка между попытками | retryMaxTimeout = 30.s |
insecureSkipVerify | Boolean | false | Нет | Отключение проверки SSL-сертификата | insecureSkipVerify = true |
proxy | String | null | Нет | Прокси-сервер для подключения | proxy = "http://proxy.example.com:8080" |
Параметры OpenCTISink
| Параметр | Тип данных | Значение по умолчанию | Обязательность | Описание |
|---|---|---|---|---|
server | ServerCfg | Да | Конфигурация подключения к серверу OpenCTI | |
vendor | String | "Solar" | Нет | Имя вендора |
vendorId | String | "bd38130d-9bfb-426a-8c3b-ecc46e92ff83" | Нет | Идентификатор вендора в OpenCTI |
connectorId | String | "cf0c51c7-5580-4511-8787-a6d569e78ef7" | Нет | Идентификатор коннектора в OpenCTI |
support | String | "support.tic@solar-rt.ru" | Нет | Адрес поддержки |
tlpLevel | OpenCTILevel | Да | Уровень TLP: red, amber, green, white | |
type | OpenCTIType | Да | Тип сущности: indicator или observed | |
apiVersion | OpenCTIAPIVersion | "7" | Нет | Версия API OpenCTI: 6 или 7 |
idleTO | Duration | 30.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}.