Плагины¶
Плагины расширяют Hub, не требуя его пересборки: добавляют сведения к находкам из ваших систем учёта, приносят находки из внешних источников, добавляют каналы уведомлений и провайдеров учёта задач.
Главное свойство: плагин исполняется в отдельном процессе, а не внутри backend. У него нет прямого доступа к базе данных Hub, и всё общение с внешним миром идёт через фиксированный набор обращений к среде исполнения.
С 0.33 плагины несут интеграции целиком: шесть каналов уведомлений, три провайдера задач, обогащение и источники находок — всё это плагины, а не код ядра.
Что умеют плагины¶
| Возможность | Что делает | Плагины в поставке |
|---|---|---|
finding_enricher — обогащение находок |
Добавляет находке метки по данным внешней системы | БДУ ФСТЭК, Threat Intelligence, Metabase CMDB |
finding_source — источник находок |
Периодически опрашивает внешнюю систему и приносит из неё находки | FleetDM |
| Канал уведомлений | Добавляет способ доставки уведомлений | Telegram, Slack, Microsoft Teams, Mattermost, MAX, почта |
ticketing_provider — учёт задач |
Заводит и ведёт задачи во внешнем трекере | Jira, GitHub Issues, Trello |
Подробности по каналам — в Уведомлениях, по задачам — в Учёте задач. Пошаговая установка и перечень настроек каждого плагина из каталога — в Официальных плагинах.
Два способа исполнения¶
| Tier 1 — WASM | Tier 2 — нативный | |
|---|---|---|
| Как исполняется | Модуль WebAssembly в песочнице внутри среды исполнения | Отдельный процесс, общение по gRPC |
| Доступ к системе | Только через обращения к среде исполнения | Только через обращения к среде исполнения, плюс изоляция средствами ОС |
| Когда используется | Обогащение, источники находок, провайдеры задач | Каналы уведомлений |
| Разрешение оператора | Не требуется | Требуется: источнику каталога отдельно разрешается исполнение нативных плагинов |
Нативный плагин исполняется вне песочницы WASM
Поэтому разрешение на нативные плагины — решение о доверии, и Hub не принимает его за оператора. На свежей инсталляции официальный каталог подключён, а нативные плагины (все шесть каналов уведомлений) видны, но не ставятся, пока источнику не выдано разрешение. Отказ не молчаливый: такие записи в каталоге помечены, кнопка установки выключена, а карточка объясняет причину и куда нажать.
Обратное правило тоже жёсткое: провайдер задач не может быть нативным. Смысл этой возможности в том, чтобы адаптер под свою систему учёта написал сам заказчик, и безопасно это ровно потому, что такой плагин исполняется в песочнице WASM. Запрет проверяется и при установке, и при вызове — плагин, установленный до появления правила, всё равно не будет вызван.
Выдача и отзыв разрешения записываются в журнал аудита.
Модель изоляции¶
flowchart TD
Backend["Backend Hub"]
Runner["Среда исполнения<br/>отдельный процесс"]
Plugin["Код плагина"]
Ext["Внешняя система"]
DB[("PostgreSQL Hub")]
Backend --> |"запуск с задачей"| Runner
Runner --> Plugin
Plugin --> |"только разрешённые обращения"| Runner
Runner --> |"HTTP по списку разрешённых узлов"| Ext
Runner --> |"результат"| Backend
Backend --> DB
Plugin -.-> |"прямого доступа нет"| DB
classDef hub fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#111827
classDef ext fill:#f3f4f6,stroke:#9ca3af,stroke-width:1px,stroke-dasharray:4 3,color:#111827
classDef store fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#111827
class Backend,Runner,Plugin hub
class Ext ext
class DB store
Плагину доступен фиксированный набор обращений к среде исполнения:
| Обращение | Назначение |
|---|---|
| Выполнить HTTP-запрос | Единственный способ обратиться наружу |
| Получить секрет | Токен доступа к внешней системе |
| Получить секрет проекта | Тот же механизм, но со значением, заданным для конкретного проекта |
| Отправить письмо | Отправку выполняет Hub; плагин не называет SMTP-сервер и не может доставить письмо чужому адресату |
| Спросить, известен ли CVE | Плагин узнаёт, что Hub уже знает, и не резолвит это заново. В ответе только идентификаторы, без значений |
| Записать сообщение в журнал | Диагностика |
Секрет выдаётся под конкретное событие: для какого проекта его сейчас можно прочитать, решает Hub, а не плагин. Значения секретов вычищаются из журналов и записей аудита точной заменой, а не по образцу.
Исходящие обращения ограничены:
- по умолчанию запрещены схема
httpи обращения к локальным и внутренним адресам — это защита от подделки запросов на стороне сервера; - разрешённые узлы задаются либо в описании плагина, либо через его
настройки: если адрес внешней системы вводит администратор (как
mattermost_base_urlу Mattermost), он же и становится разрешённым; - ослабить ограничения можно переменными
PLUGIN_EGRESS_ALLOW_HTTP,PLUGIN_EGRESS_ALLOW_LOCAL_DIAL,PLUGIN_EGRESS_ALLOWLIST— делайте это осознанно.
Секреты плагина хранятся отдельно от его обычных настроек: поля, помеченные как секретные, нельзя записать через обычное сохранение настроек — попытка отклоняется.
Каталог и установка¶
Плагины распространяются как артефакты реестра образов, подписанные ключом издателя.
Официальный каталог подключён из коробки
Источник hub-official заводится при установке и обновлении —
регистрировать его руками не нужно. Инсталляции, зарегистрировавшие тот же
каталог раньше, дубля не получают; удалённая запись при следующем
обновлении не возвращается. Разрешение на нативные плагины при этом не
выдаётся — см. выше.
Порядок работы:
- Просмотреть каталог. Раздел плагинов в административном интерфейсе: список с описаниями, поиском и панелью подробностей — там же видны координаты артефакта и история версий.
- Установить плагин. Проверяются подпись, совместимость с этой версией Hub и версия артефакта. Несовместимый плагин отклоняется при установке, а не при первом вызове.
- Заполнить настройки и секреты, затем включить плагин. Плагин проверяет свою конфигурацию при сохранении — ошибка видна сразу, а не при первой доставке.
Дополнительно:
- Выбор версии и откат. Запись каталога несёт всю историю
(
available_versions); в панели подробностей можно поставить конкретную версию. Понижение требует подтверждения: более старая версия могла быть отозвана из-за уязвимости, и защита от отката для неё снимается. У записи без истории выбор не показывается. - Установка из файла (sideload) — для закрытых контуров и отладки.
- Отзыв подписи по digest'у: отозванный артефакт не ставится, а перечень отзывов можно перечитать внеочередным запросом.
- Свои источники каталога добавляются рядом с официальным; ограничения на них
задают
PLUGIN_CATALOG_ALLOW_HTTP,PLUGIN_CATALOG_ALLOW_LOCAL_DIAL,PLUGIN_CATALOG_ALLOWLIST, а на загрузку самих артефактов —PLUGIN_OCI_*.
Изменение набора возможностей при обновлении
Если новая версия плагина заявляет возможности, которых не было у
установленной, обновление не применяется молча — требуется явное
подтверждение администратора
(POST /api/v1/admin/installed-plugins/<id>/acknowledge-capability-change).
Так обновление не может незаметно расширить права плагина.
Обогащение находок¶
Плагин обогащения получает находку и возвращает набор меток. Метки сохраняются у находки и доступны для отбора, поиска и правил маршрутизации. Метки обогащения защищены от ручной правки — руками ставятся свои теги, см. Жизненный цикл находки.
Запускается двумя способами:
- автоматически — появление находки ставит фоновую задачу обогащения;
- вручную — кнопкой в карточке находки
(
POST /api/v1/findings/<id>/enrich-tags/<plugin_id>), что удобно для находок, накопленных до установки плагина.
Частота ручного обогащения ограничена переменной
ENRICH_TAGS_RATE_LIMIT_PER_MINUTE.
Список доступных плагинов обогащения отдаёт
GET /api/v1/plugins/capabilities/finding-enrichers.
Источники находок¶
Плагин-источник опрашивает внешнюю систему по расписанию и приносит из неё
находки. Расписание задаётся в описании плагина и переопределяется при
установке; опрос можно запустить вручную —
POST /api/v1/admin/installed-plugins/<id>/sync-now.
Принесённые находки проходят тот же путь, что и загруженные извне: та же дедупликация, те же состояния, те же интеграции.
Проход по большому парку разбит на куски и сообщает, куда уходит время: источник перестал быть чёрным ящиком на часы. Плагин при этом спрашивает Hub, какие CVE тому уже известны, и тратит бюджет обогащения только на новое.
Перечень установленных источников инвентаря отдаёт
GET /api/v1/plugins/capabilities/inventory-sources.
Пустой ответ и удалённые узлы
Плагин-источник обязан сообщать об ошибке, если не смог опросить свою систему. Пустой корректный ответ означает «в системе действительно ноль узлов» — а это, в свою очередь, может привести к массовому закрытию находок как относящихся к исчезнувшим узлам.
Hub дополнительно защищён: если опрос вернул пустой перечень, а сведения об узлах в базе есть, сверка исчезнувших узлов не выполняется. Но это вторая линия обороны, а не замена корректному поведению плагина.
Каналы уведомлений¶
Плагин-канал добавляет способ доставки. Его настройки задаются на уровне проекта: у разных проектов могут быть разные получатели и разные токены.
| Метод и путь | Назначение |
|---|---|
GET /api/v1/projects/<id>/plugin-channels |
Доступные каналы проекта |
GET /api/v1/projects/<id>/plugin-channels/<plugin_id>/config |
Настройки канала |
PUT /api/v1/projects/<id>/plugin-channels/<plugin_id>/config |
Изменение настроек |
Для изменения требуется право manage_notifications. Оно даёт доступ к
токенам ботов — выдавайте его так же осторожно, как административные права.
Секрет канала (bot_token, webhook_url) никогда не возвращается в ответах и
не затирается пустым значением при сохранении.
Провайдеры учёта задач¶
Плагин-провайдер заводит задачи во внешнем трекере и ведёт их дальше: цели заведения, шаблоны полей, привязка существующей задачи, опрос статусов, переходы, приём вебхуков. Разбор вебхука делает плагин, решение принимает Hub.
Настройка — попроектная, из интерфейса. Подробности и порядок перехода со встроенной интеграции Jira — в Учёте задач.
Настройки среды исполнения¶
Общие:
| Переменная | Назначение |
|---|---|
PLUGIN_RUNNER_GLOBAL_LIMIT |
Предел одновременно работающих процессов плагинов (по умолчанию 20) |
PLUGIN_RUNNER_PER_PLUGIN_LIMIT |
Предел одновременных запусков одного плагина (по умолчанию 4) |
PLUGIN_RUNNER_KEEP_WARM_SECONDS |
Сколько держать процесс готовым после работы (по умолчанию 300 с) |
PLUGIN_FINDING_SOURCE_SYNC_WORKERS |
Параллелизм опроса источников |
WASM_RUNNER_BINARY_PATH |
Путь к исполняемому файлу среды исполнения |
Число обработчиков очереди обогащения выводится из
PLUGIN_RUNNER_PER_PLUGIN_LIMIT: оно на единицу меньше, чтобы задачи
обогащения не занимали все доступные запуски плагина и не блокировали ручной
вызов.
Нативные плагины (Tier 2) — отдельная группа с префиксом PLUGIN_NATIVE_:
ограничение памяти, тайм-ауты вызова и остановки, политика перезапуска после
аварийного завершения, аренда процесса при нескольких репликах и ограничение
частоты обращений. Значения по умолчанию рассчитаны на то, что аварийно
завершающийся плагин не должен ни перезапускаться бесконечно, ни оставаться
выключенным навсегда. Полный перечень — в
переменных Hub.
Плагины в поставке¶
Официальный каталог содержит тринадцать плагинов (настройки каждого — в Официальных плагинах):
| Плагин | Возможность | Что делает |
|---|---|---|
bdu-fstec-enricher |
Обогащение | Сведения из банка данных угроз ФСТЭК по номеру CVE: идентификатор БДУ, уровень опасности, статус устранения. Работает по зеркалу публичной выгрузки |
threat-intel-enricher |
Обогащение | CVSS и затронутые продукты, признак активной эксплуатации по каталогу CISA KEV, репутация адреса. Обращения к внешним сервисам репутации выключены по умолчанию |
metabase-cmdb |
Обогащение | Сведения об узле из таблицы Metabase по адресу находки: владелец, окружение, роль. Соответствие «колонка → тег» задаёт администратор |
fleetdm |
Источник находок | Узлы и их уязвимости из FleetDM; команды сопоставляются с продуктами, удалённый узел закрывает свои находки |
telegram-notifier |
Канал | Доставка через бота Telegram |
slack-notifier |
Канал | Входящий webhook Slack |
teams-notifier |
Канал | Webhook Microsoft Teams (Workflows) |
mattermost-notifier |
Канал | Входящий webhook Mattermost; адрес сервера задаётся при установке |
maxru-notifier |
Канал | Бот MAX |
email-notifier |
Канал | Письмо на каждого адресата; отправку выполняет Hub |
jira-ticketing |
Учёт задач | Задачи в Jira: шаблоны полей, курируемый список проектов, маркер против дублей, переходы, комментарии, вебхуки |
github-issues-ticketing |
Учёт задач | Issue в GitHub: комментарии, переходы, ссылка на форму создания |
trello-ticketing |
Учёт задач | Карточки Trello; «переход» выражается перемещением между списками |
Точный набор настроек каждого плагина и перечень переносимых полей заданы в его описании в каталоге и могут отличаться между версиями.