Перейти к содержанию

Официальные плагины: установка и настройка

На этой странице — как подключить каталог официальных плагинов, установить из него плагин и что в каждом из них настраивается. Устройство самой платформы, модель изоляции и ограничения описаны отдельно: Плагины.

Каталог официальных плагинов

Официальные плагины публикуются издателем в открытом каталоге. Для подключения нужны два значения:

Что Значение
Адрес каталога https://gitlab.com/hub_public/plugins/-/raw/main/catalog.json
Открытый ключ https://gitlab.com/hub_public/plugins/-/raw/main/publickey.txt

Открытый ключ не является секретом — он проверяет подпись, а не даёт прав. Закрытая половина ключа не покидает сборочный контур издателя, поэтому подменить содержимое каталога, сохранив верную подпись, нельзя.

Сами артефакты плагинов лежат в открытом реестре образов registry.gitlab.com/hub_public/plugins; исходный код плагинов туда не публикуется.

В каталоге тринадцать плагинов: три обогатителя, источник инвентаря, шесть каналов уведомлений и три провайдера задач. Устройство каждого вида — в Плагинах.

Ключ вводится один раз и осознанно

Каталог, зарегистрированный без открытого ключа, считается неподписанным: подпись у устанавливаемых из него плагинов не проверяется. Это допустимо для вашего внутреннего каталога, который вы сами и наполняете, но для официального каталога ключ указывать обязательно — иначе теряется весь смысл подписи.

Шаг 1. Подключить каталог

С версии 0.33 источник уже подключён

Официальный каталог hub-official заводится при обновлении и виден в списке источников сразу — регистрировать его руками больше не нужно. Разделы ниже нужны, если вы поднимаете своё зеркало, работаете в закрытом контуре или удалили предустановленную запись.

Что предустановка не делает: разрешение на нативные плагины остаётся выключенным (см. следующий раздел) — это решение оператора, а не наше.

Инсталляции, зарегистрировавшие тот же каталог раньше, дубля не получат: запись добавляется, только если источника с таким адресом ещё нет.

Через интерфейс

Административный раздел → Плагины (/admin/plugins-management) → вкладка источников → Добавить. Заполните имя, адрес каталога и открытый ключ из таблицы выше.

Через API

curl -X POST https://hub.example.com/api/v1/admin/plugin-marketplaces \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "hub-official",
    "catalog_url": "https://gitlab.com/hub_public/plugins/-/raw/main/catalog.json",
    "public_key": "AKT8z1ROWc2/V/ZC1sktlTVR2x8Lqei16D5BPTlYn3U=",
    "is_active": true
  }'

Обязательны name и catalog_url. В ответе открытого ключа нет — он не возвращается ни одной ручкой, чтобы значение нельзя было прочитать обратно и перепутать с секретом.

У источника, которому уже разрешено исполнение вне песочницы, ключ сменить нельзя: иначе подменой ключа можно было бы переназначить доверие у разрешённого источника. Сначала снимите разрешение, потом меняйте ключ.

Закрытый контур

В сети без выхода наружу выложите catalog.json, publickey.txt и сами артефакты на внутреннее зеркало и укажите его адрес. Формат каталога и порядок установки при этом не меняются. Если зеркало отдаёт HTTP или отвечает по внутреннему адресу, потребуются PLUGIN_CATALOG_ALLOW_HTTP и PLUGIN_CATALOG_ALLOW_LOCAL_DIAL — см. Плагины. Включайте их вместе с PLUGIN_CATALOG_ALLOWLIST, а не по отдельности: второй флаг снимает защиту от обращений во внутреннюю сеть по адресу каталога.

Каналы уведомлений требуют отдельного разрешения

Плагины каналов исполняются не в песочнице, а обычным процессом рядом с Hub. Поэтому источник, из которого их ставят, должен нести отдельное разрешение — иначе установка отклоняется.

Разрешение выдаётся после добавления источника: откройте его управление и включите «разрешить исполнение вне песочницы». Интерфейс попросит подтверждение — это не формальность: плагин получает те же права, что процесс Hub, тогда как обычный плагин ограничен средой исполнения.

Обратное выключение подтверждения не требует.

Через API — тем же обновлением источника:

curl -X PUT https://hub.example.com/api/v1/admin/plugin-marketplaces/<id> \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"allows_native": true}'

При создании источника это поле не принимается

allows_native задаётся только обновлением, и это не описка API: разрешение отделено от заведения намеренно, чтобы оно не проскочило вместе с остальными полями. Источник без него выглядит настроенным, а каналы уведомлений из него не ставятся.

Второе условие — источник обязан быть подписанным: без открытого ключа разрешение не действует.

Шаг 2. Установить плагин

Через интерфейс

В списке источников — Обзор каталога, затем Установить у нужного плагина. Проверяются подпись и версия: установка более старой версии поверх более новой отклоняется.

Через API

curl -X POST https://hub.example.com/api/v1/admin/installed-plugins \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "source_type": "marketplace",
    "marketplace_id": "<id источника из шага 1>",
    "catalog_plugin_id": "jira-ticketing"
  }'

Поле runtime не задано, поэтому подставляется wasm. Для каналов уведомлений его нужно указать явно — "runtime": "native", — и источник при этом обязан нести разрешение из предыдущего раздела.

Установка из файла идёт другим маршрутом: у неё два файла (модуль и описание), то есть multipart, а не JSON — POST /api/v1/admin/installed-plugins/sideload. Запрос с source_type: sideload на маршрут выше отвергается с ошибкой, а не выполняется наполовину.

Шаг 3. Заполнить настройки

Настройки плагина заполняются в его карточке (Настроить) либо через PUT /api/v1/admin/installed-plugins/<id>. Поля, помеченные как секретные, хранятся отдельно от остальной конфигурации и обратно не отдаются: пустое значение при сохранении означает «не менять», а не «стереть».

После заполнения плагин нужно включить — установка сама по себе его не запускает.

У тикетинга настройки ещё и попроектные

Плагины заведения задач читают конфигурацию установки как основу, а поверх неё — настройки конкретного проекта (правка проекта → раздел учёта задач). Так один установленный плагин обслуживает несколько проектов с разными досками, ключами и шаблонами. Секрет при этом тоже попроектный.

Что есть в каталоге

Обогащение находок

metabase-cmdb — теги из CMDB

Подтягивает сведения об узле (владелец, окружение, роль сервера) из таблицы Metabase по IP-адресу находки и превращает их в теги.

Настройка Обяз. Назначение
metabase_base_url да Адрес Metabase
database_id да Идентификатор базы в Metabase
servers_table_id да Идентификатор таблицы с узлами
column_to_tag_key Соответствие «колонка таблицы → имя тега»
api_token Токен Metabase (секрет)

Запускается автоматически при появлении находки и кнопкой в карточке — второе нужно для находок, накопленных до установки плагина.

Источники находок

fleetdm — узлы и их уязвимости из FleetDM

Периодически забирает из FleetDM хосты вместе с уязвимостями и заводит по ним находки. Умеет сопоставлять команды FleetDM с продуктами Hub.

Настройка Обяз. Назначение
fleet_base_url да Адрес FleetDM
target_project_id да Проект Hub, в который попадают находки
fleet_edition Редакция FleetDM; для Premium доступно сопоставление команд с продуктами
default_product_name Продукт для хостов без команды
stale_host_ignore Пропускать хосты, давно не выходившие на связь
cve_severity_max_lookups Потолок обращений за критичностью CVE за один проход
cve_severity_budget_seconds Потолок времени на те же обращения
api_token Токен FleetDM (секрет)

Расписание опроса задаётся при установке; опрос можно запустить и вручную.

Требует Hub 0.33 или новее

Версия 1.0.8 объявляет hub_version: >=0.33. На более старом Hub она не установится — это защита, а не ошибка: плагин пользуется возможностями, которых там нет.

Заведение задач

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

jira-ticketing — задачи в Jira

Настройка Обяз. Назначение
base_url да Адрес Jira
project_key да Ключ проекта по умолчанию
auth_method Способ входа: по паре «почта + токен» либо OAuth
email, api_token Пара для базового способа (второе — секрет)
client_id, client_secret Пара для OAuth (второе — секрет)
issue_type, issuetype_id Тип задачи
issuetype_by_engine Тип задачи в зависимости от сканера
projects Курируемый список целей, из которого выбирает оператор
labels, priority_id Метки и приоритет создаваемой задачи
summary_template, description_template Шаблоны заголовка и описания
partial_* Те же шаблоны для полуручного режима
extra_fields, extra_params, value_maps Дополнительные поля Jira и их соответствия
transition_fields Поля, требуемые при переводе по статусу

github-issues-ticketing — issue в GitHub

Настройка Обяз. Назначение
owner да Владелец репозитория
repo да Репозиторий
token да Токен доступа (секрет)
api_base_url Адрес API — для GitHub Enterprise
html_base_url Адрес веб-интерфейса — для GitHub Enterprise
labels Метки создаваемого issue

trello-ticketing — карточки в Trello

Настройка Обяз. Назначение
board_id да Идентификатор доски
list_name да Список на доске, куда попадают карточки
api_key да Ключ приложения (секрет)
api_token да Токен пользователя (секрет)
labels Метки карточки
summary_template, description_template Шаблоны заголовка и описания
api_base_url Адрес API

Каналы уведомлений

С версии 0.33 уведомления доставляют плагины: в ядре Hub канальных настроек не осталось. Плагин ставится из каталога, как любой другой, а параметры задаются для каждого проекта — кроме отдельно оговорённых ниже настроек уровня установки.

Плагин Канал Куда обращается
telegram-notifier Telegram api.telegram.org
slack-notifier Slack hooks.slack.com
teams-notifier Microsoft Teams webhook.office.com
maxru-notifier MAX botapi.max.ru
mattermost-notifier Mattermost ваш сервер — см. ниже
email-notifier Электронная почта ваш SMTP-сервер

Общие настройки проекта у всех каналов одинаковы:

Настройка Назначение
enabled Включить доставку в этот проект
min_severity Порог критичности для новых находок
notify_on_close Сообщать о закрытии находок
fixed_min_severity Порог для сводки об исправленном

Сверх них у каждого канала свои поля адресации:

Плагин Поля проекта
telegram-notifier chat_id, bot_token (секрет)
slack-notifier, teams-notifier webhook_url (секрет)
mattermost-notifier webhook_url (секрет), channel
maxru-notifier chat_id, access_token (секрет), base_url
email-notifier recipients, subject_prefix, при необходимости — свой SMTP

Mattermost: адрес сервера задаётся один раз на установку

Остальным каналам адрес известен заранее и записан в подписанном описании плагина. Mattermost вы размещаете у себя, поэтому его адрес называете вы — в настройках установки плагина:

Настройка Значение
mattermost_base_url https://mattermost.example.com — адрес сервера целиком, без пути к webhook

Без него установка и настройка проходят, а доставка отклоняется. Нужна версия плагина 1.0.1 и новее.

Переменная PLUGIN_EGRESS_ALLOWLIST для этого не подходит

Название похоже, но это другой слой защиты — про обращения внутрь сети. Перечень адресов, разрешённых плагину, он не расширяет.

Электронная почта: SMTP на установку или на проект

email-notifier отправляет письма средствами Hub, а не собственным соединением. SMTP задаётся на уровне установки:

Настройка Назначение
smtp_host, smtp_port Сервер отправки
smtp_username, smtp_password Учётные данные (пароль — секрет)
smtp_from Адрес отправителя
smtp_tls_mode Режим шифрования
allow_project_smtp Разрешить проектам задавать свой SMTP
smtp_allowed_hosts Перечень серверов, допустимых для проектов

Проект может переопределить SMTP только при allow_project_smtp: true. Перечень smtp_allowed_hosts действует только если он задан: пустой означает, что проекту разрешён любой сервер. Заполняйте его — иначе право настраивать проект становится способом отправлять почту откуда угодно от имени Hub.

Двойной доставки не бывает

Если плагин канала установлен и включён, доставку ведёт он. Встроенных путей для Telegram, Mattermost, MAX, Slack и Teams в 0.33 не осталось вовсе, поэтому продублировать сообщение нечем.

Обновление и удаление

  • Обновить до последней версии — кнопка в карточке плагина. Подпись проверяется заново.
  • Поставить конкретную версию или откатиться — выбор версии в панели подробностей: запись каталога несёт всю историю. Понижение требует подтверждения — более старая версия могла быть отозвана из-за уязвимости, и защита от отката для неё снимается. У записи без истории выбор не показывается.
  • Выключить — плагин остаётся установленным вместе с настройками, но не запускается.
  • Удалить — снимает установку.

Обновление не расширяет права молча

Если новая версия заявляет возможности, которых не было у установленной, обновление требует явного подтверждения администратора.

Если что-то не работает

Признак Куда смотреть
Каталог не открывается Доступность адреса из пода Hub; в закрытом контуре — PLUGIN_CATALOG_ALLOW_HTTP и PLUGIN_CATALOG_ALLOW_LOCAL_DIAL
Установка отклонена по подписи Открытый ключ источника; он должен быть ключом того же издателя, что подписал плагин
Установка отклонена по версии Установка более старой версии поверх более новой запрещена намеренно
Плагин установлен, но ничего не делает Включён ли он; заполнены ли обязательные настройки; для тикетинга — привязан ли к проекту
Обращения плагина наружу не проходят Список разрешённых адресов плагина; см. Плагины