
Плагин Zabbix для оценки уязвимостей
# Zabbix Threat Control (ztc)
**Превратите уже используемый вами Zabbix в консоль управления уязвимостями.**
`ztc` читает инвентаризацию ПО каждого хоста через штатный **zabbix-agent2**
(без установки дополнительного агента), сверяет её с [Vulners](https://vulners.com) и
отправляет обратно в Zabbix **оценённые находки по каждому хосту** — проблемы,
дашборды и CVSS-графики. Один статический бинарник — устанавливается одной командой.
[](https://github.com/vulnersCom/zabbix-threat-control/actions/workflows/ci.yml)
[](https://github.com/vulnersCom/zabbix-threat-control/releases)
[](LICENSE)

## Почему ztc
- **Никакого нового агента, никакого RCE.** Хосты передают инвентаризацию через стандартные `UserParameter`s zabbix-agent2. Устранение уязвимостей выполняется через один разрешённый ключ и узкий sudoers — никогда через произвольный `system.run`.
- **Linux _и_ Windows.** Пакеты Linux — через Vulners `audit/linux`; программы из реестра Windows — через **Smart Audit**, а установленные KB — через `audit/kb` (с CVSS для каждого CVE). Smart Audit не зависит от версии Zabbix.
- **Zabbix 6.0, 7.0, 7.4 и 8.0.** Версия API определяется автоматически; вам не нужно поддерживать отдельные ветки под каждую версию.
- **Практически применимо, а не просто список.** Находки становятся **проблемами Zabbix с оценкой severity по CVSS**, фильтруются **по хосту** и отображаются **графиками медианного CVSS и распределения оценок** на готовом дашборде.
- **Один бинарник.** Установка одной командой; **самообновляется**.
## Быстрый старт
На вашем сервере Zabbix (или любом Linux-хосте, которому доступны Zabbix и Vulners):
```sh
curl -fsSL https://raw.githubusercontent.com/vulnersCom/zabbix-threat-control/master/deploy/install.sh | sudo sh
```
Установщик запросит ваш Vulners API-ключ и параметры подключения к Zabbix, установит systemd-сервис и предложит создать объекты Zabbix (`ztc provision --all`). Затем привяжите шаблон сбора данных к хостам, которые нужно сканировать, — см. [`docs/guide.md`](https://github.com/vulnerscom/zabbix-threat-control/blob/master/docs/guide.md).
Прочие варианты (Docker, установка вручную, автономная среда, bootstrap через Zabbix): [`deploy/README.md`](https://github.com/vulnerscom/zabbix-threat-control/blob/master/deploy/README.md).
## Как это работает
```
hosts: zabbix-agent2 UserParameter
Linux → vulners.os / version / arch / packages
Windows → vulners.os / version / win.software / win.kb
│ (polled into Zabbix items)
▼
ztc scan ─► collect (Zabbix API) ─► audit (Vulners) ─► aggregate ─► sender ─► Zabbix
│
problems (CVSS severity) · dashboard · graphs · vulners.host tags ◄┘
```
`ztc scan --daemon` запускает цикл по расписанию; `ztc provision` создаёт шаблон Zabbix, отчётные хосты, триггеры и дашборд.
## Что вы получаете в Zabbix
- **Отчётные хосты:** `Vulners - Hosts`, `- Bulletins`, `- Packages`, `- Statistics`.
- **Дашборд** с обзором **Problems-by-severity**, списками проблем по каждому отчёту, трендом **Median CVSS Score** и круговой диаграммой **CVSS score distribution**.
- **Проблемы с оценкой severity** — каждая находка срабатывает как Disaster / High / Average / Warning в зависимости от её CVSS, поэтому *Problems by severity* имеет смысл.
- **Фильтр по хосту** — каждая находка несёт тег `vulners.host`. В *Monitoring → Problems* примените фильтр `Tags: vulners.host Equals <host>`, чтобы увидеть уязвимости конкретного хоста. (Одна находка = одна пара (уязвимость, хост).)
**Медианный CVSS: тренд и распределение оценок по всему парку:**

**Разбивка по severity** — реальные значения Disaster / High / Average / Warning, а не один серый столбец «Not classified»:

**Уязвимости одного хоста** с помощью фильтра по тегу `vulners.host`:

**Отдельная находка** — с оценкой по CVSS, тегом хоста и ссылкой на vulners.com:

## Конфигурация
Для всего есть значение по умолчанию; секреты передавайте через переменные окружения (они переопределяют YAML-файл). Полный пример: [`config.example.yaml`](https://github.com/vulnerscom/zabbix-threat-control/blob/master/config.example.yaml).
| Переменная окружения | Назначение |
|-----|---------|
| `VULNERS_API_KEY` | Ключ API Vulners (обязательно) |
| `VULNERS_BASE_URL` | эндпоинт self-hosted / прокси для Vulners (необязательно) |
| `ZABBIX_URL` | URL веб-интерфейса Zabbix (JSON-RPC API) |
| `ZABBIX_TOKEN` | API-токен (предпочтительно) … |
| `ZABBIX_USER` / `ZABBIX_PASSWORD` | … или пользователь + пароль |
| `ZABBIX_SERVER_FQDN` / `ZABBIX_SERVER_PORT` | адрес назначения zabbix-sender |
| `ZTC_SCHEDULE` | интервал сканирования демона (например, `1h`) |
| `ZTC_MIN_CVSS` | не создавать объекты для находок с CVSS ниже этого значения |
`ztc --help` выводит полный список.
## Команды
```sh
ztc scan --daemon # run the scan loop on a schedule
ztc scan --once # a single cycle
ztc provision --all # create/reconcile templates, report hosts, dashboard
ztc fix --host H --package P # remediate a package (whitelisted, opt-in)
ztc upgrade # self-update, then re-run `provision --all`
ztc version --check # print version and check for updates
```
## Устранение уязвимостей
`ztc fix` обновляет уязвимый пакет через включённый в белый список ключ агента `vulners.fix[<pkg>]`, который забирает worker на стороне хоста, — без произвольного выполнения команд. Его можно запускать вручную или, с `scan --daemon --auto-fix`, управлять им через подтверждение проблемы доверенным пользователем в Zabbix. Обоснование: [`docs/adr/0001-remediation-mechanism.md`](https://github.com/vulnerscom/zabbix-threat-control/blob/master/docs/adr/0001-remediation-mechanism.md).
## Матрица поддержки
| | |
|---|---|
| **Zabbix** | 6.0 и 7.0 LTS, 7.4, 8.0 (определяется автоматически) |
| **Аудируемые ОС** | Linux (deb/rpm/apk/…), Windows (ПО + KB) |
| **Где запускается ztc** | Linux amd64 / arm64 |
## Переход с Python-версии
Оригинальная Python-реализация осталась в истории git этого репозитория (коммиты до переписывания на Go) и в release-тегах до Go. Она использует те же имена на стороне Zabbix (группу, отчётные хосты, дашборд), но собирает данные через штатные ключи агента вместо поставляемого `report.py`, разделяет шаблон на две части и убирает Action для исправлений. Пошаговая инструкция (перенос конфигурации, очистка объектов, повторная настройка хостов, переключение механизма исправления): **[`docs/MIGRATION.md`](https://github.com/vulnerscom/zabbix-threat-control/blob/master/docs/MIGRATION.md)**.
## Разработка
```sh
go build ./... # compile
go test ./... # unit tests (no network)
go vet ./... && gofmt -l .
make build # -> bin/ztc
```
Тестовый стенд на Docker (Zabbix + agent + ztc) описан в [`deploy/docker/README.md`](https://github.com/vulnerscom/zabbix-threat-control/blob/master/deploy/docker/README.md). CI (сборка/тесты/линтер) запускается при каждом push; коммит с тегом `v*` публикует бинарники и GHCR-образ.
## Лицензия
См. [`LICENSE`](https://github.com/vulnerscom/zabbix-threat-control/blob/master/LICENSE).