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

Сценарии применения

Эта страница отвечает на вопрос «из чего складывается работающее решение целиком» для четырёх сценариев, ради которых Security Hub обычно и внедряют. Для каждого показано, кто с кем взаимодействует, в каком порядке и что при этом входит в поставку, а что вы разворачиваете и администрируете сами.

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

Как читать схемы

Одна и та же нотация используется на всех схемах ниже:

  • Синие блоки со сплошной рамкой — компоненты, входящие в поставку Security Hub: backend, worker, веб-интерфейс, DomainScope, плагины.
  • Серые блоки с пунктирной рамкой — то, что вы разворачиваете и администрируете сами: система сборки и её сканеры, Jira, мессенджеры, провайдер SSO, NetBox, LLM-сервис.
  • Блоки-цилиндры — хранилища данных.

Двусторонние обмены показаны одной стрелкой с двумя номерами (например «4, 7»), а порядок шагов — отдельной схемой последовательности: так на структурной схеме не возникает пересечений. Номера шагов совпадают на обеих схемах и в таблице под ними.

Backend, worker и база данных во всех сценариях одни и те же и разворачиваются один раз — см. Развёртывание.

Сценарий 1. Консолидация находок из системы сборки

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

Кто с кем взаимодействует

flowchart TD
    subgraph CustomerCI["Ваш контур"]
        Scanner["Сканеры<br/>SAST, SCA, образы, IaC"]
        CI["Задание сборки"]
    end

    subgraph HubBox["Входит в Security Hub"]
        API["Backend<br/>REST API"]
        Queue["Очередь задач"]
        Worker["Worker<br/>разбор и дедупликация"]
        UI["Веб-интерфейс"]
    end

    DB[("PostgreSQL")]
    Files[("Хранилище отчётов")]

    Scanner --> |"1"| CI
    CI --> |"2, 4"| API
    API --> |"3"| Files
    API --> |"5"| Queue
    Queue --> |"6"| Worker
    Worker <--> |"7, 8"| DB
    Worker --> |"9"| Queue
    UI --> |"10"| API

    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 API,Queue,Worker,UI hub
    class Scanner,CI ext
    class DB,Files store

В каком порядке это происходит

sequenceDiagram
    autonumber
    participant CI as Задание сборки
    participant API as Backend
    participant FS as Хранилище отчётов
    participant Q as Очередь задач
    participant W as Worker
    participant DB as PostgreSQL
    participant UI as Веб-интерфейс

    CI->>CI: запуск сканера, получен SARIF
    CI->>API: POST отчёта с ключом сервисной учётной записи
    API->>FS: сохранение файла, определение формата
    API-->>CI: 202 Accepted, идентификаторы отчёта и задачи
    API->>Q: постановка задачи разбора
    Q->>W: выдача задачи
    W->>DB: разбор, расчёт хеша дедупликации, сверка
    W->>DB: создание новых и обновление известных находок
    W->>Q: задачи-следствия: Jira, уведомления, AI-триаж
    UI->>API: аналитик работает со списком находок

Расшифровка шагов

Шаг Что происходит
1 Задание сборки запускает сканер и получает отчёт в формате SARIF 2.1.0. Поддерживается также прямой приём формата выгрузки SonarQube.
2 Задание отправляет файл на POST /api/v1/products/<id>/reports с заголовком X-API-Key. Ключ принадлежит сервисной учётной записи с правом загрузки в этот продукт.
3 Backend проверяет ключ и права, сохраняет файл в хранилище отчётов и определяет формат — по явному полю format либо по содержимому.
4 Backend сразу отвечает 202 Accepted и возвращает идентификатор отчёта и идентификатор фоновой задачи. Обработка асинхронная: счётчиков найденного в этом ответе нет.
5 Backend создаёт запись отчёта в состоянии «ожидает» и ставит задачу разбора в очередь.
6 Worker забирает задачу из очереди.
7 Worker разбирает файл под жёсткими лимитами и для каждого результата считает хеш дедупликации по правилу и местоположению — имя сканера в хеш не входит.
8 Находки, которых ещё не было, создаются со статусом «новая»; уже известные обновляются, к ним добавляется ещё один источник.
9 Worker ставит в очередь задачи-следствия: создание задачи в Jira, уведомления, разбор языковой моделью — каждая только если соответствующая интеграция включена.
10 Аналитик видит находки в интерфейсе: подтверждает, отклоняет как ложное срабатывание, назначает срок, передаёт в работу.

Что нужно с вашей стороны

  • Сканеры, умеющие выгружать SARIF. Формат стандартный: его поддерживают распространённые инструменты статического анализа, проверки зависимостей, образов и конфигураций.
  • Сервисная учётная запись в Hub и ключ к ней, положенный в защищённые переменные вашей системы сборки. Ключ показывается один раз при создании.
  • Продукт в Hub, в который загружаются отчёты. Продукты группируются в проекты; права выдаются на любом из двух уровней.

Подробности настройки: Загрузка SARIF.

Сценарий 2. Непрерывное обследование внешнего периметра

Второй сценарий не требует ни системы сборки, ни собственных сканеров. DomainScope самостоятельно обследует периметр по заданному списку доменов и диапазонов адресов: находит поддомены, проверяет, что за ними отвечает, сканирует порты, сертификаты и веб-приложения — и отдаёт результат в Hub тем же способом, что и внешние сканеры, в формате SARIF.

Отдельно DomainScope предлагает расширить периметр: обнаружив адрес или домен, которого нет в списке, он отправляет предложение, а администратор Hub подтверждает или отклоняет его в интерфейсе. Периметр не расширяется автоматически.

Кто с кем взаимодействует

flowchart TD
    subgraph DSBox["Входит в Security Hub"]
        DS["DomainScope"]
        OpenVAS["OpenVAS<br/>сканер CVE"]
        ZAP["OWASP ZAP<br/>сканер веб-приложений"]
        API["Backend Hub"]
        UI["Веб-интерфейс"]
    end

    DSDB[("БД DomainScope")]
    Perimeter["Ваш внешний периметр<br/>домены, адреса, сервисы"]
    NetBox["NetBox<br/>инвентарь адресов"]

    DS --> |"1"| Perimeter
    DS <--> |"2, 3"| DSDB
    DS <--> |"4"| OpenVAS
    DS <--> |"5"| ZAP
    DS --> |"6"| API
    DS --> |"7"| API
    NetBox <--> |"8"| DS
    UI --> |"9"| API

    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 DS,OpenVAS,ZAP,API,UI hub
    class Perimeter,NetBox ext
    class DSDB store

В каком порядке это происходит

sequenceDiagram
    autonumber
    participant DS as DomainScope
    participant Net as Внешний периметр
    participant DSDB as БД DomainScope
    participant Sc as OpenVAS и ZAP
    participant API as Backend Hub
    participant NB as NetBox
    participant UI as Веб-интерфейс

    DS->>Net: цикл обследования: поддомены, DNS, порты, TLS
    DS->>DSDB: сохранение результатов с указанием источника
    DSDB-->>DS: текущее состояние периметра
    DS->>Sc: запуск проверки CVE по найденным узлам
    DS->>Sc: запуск проверки веб-приложений
    DS->>API: выгрузка находок отчётом SARIF
    DS->>API: предложение добавить новый узел в периметр
    DS->>NB: сверка и обновление инвентаря адресов
    UI->>API: администратор подтверждает предложение

Расшифровка шагов

Шаг Что происходит
1 DomainScope по расписанию обходит периметр: перебирает поддомены, разрешает имена, сканирует порты, снимает параметры TLS-сертификатов. Периодичность каждого цикла настраивается отдельно.
2 Результаты сохраняются в собственную базу DomainScope с пометкой, откуда узел стал известен, — это позволяет потом разобраться в происхождении каждой записи.
3 Следующий цикл сверяется с сохранённым состоянием и видит изменения: появившийся порт, исчезнувший узел, истекающий сертификат.
4 По найденным узлам запускается проверка известных уязвимостей через OpenVAS.
5 По найденным веб-сервисам запускается активная проверка через OWASP ZAP.
6 DomainScope формирует отчёт SARIF и загружает его в Hub — тем же эндпоинтом и с тем же видом ключа, что и любой внешний сканер. Дальше находка проходит тот же путь, что в сценарии 1.
7 Обнаружив узел вне заданного периметра, DomainScope отправляет предложение о его добавлении.
8 Опционально: DomainScope сверяется с NetBox — берёт оттуда адреса и зоны как источник периметра и возвращает обнаруженное.
9 Администратор Hub видит предложение в интерфейсе и принимает решение. Периметр не расширяется без подтверждения.

Что нужно с вашей стороны

  • Отдельный экземпляр PostgreSQL для DomainScope — с базой Hub он не разделяется.
  • Разрешённый исходящий доступ к обследуемому периметру и, если сканеры обновляют свои базы, к источникам обновлений.
  • Согласование факта активного сканирования: OpenVAS и OWASP ZAP выполняют активные проверки, а не только наблюдение.

Подробности: Обзор DomainScope, Управление сканерами.

Сценарий 3. Триаж, задачи и контроль сроков

Находка сама по себе ничего не меняет. Этот сценарий — про то, что происходит между «сканер что-то сообщил» и «проблема устранена»: кто разбирает поток, как отсеивается шум, как работа попадает к исполнителю и что происходит, когда срок выходит.

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

Кто с кем взаимодействует

flowchart TD
    subgraph HubBox["Входит в Security Hub"]
        API["Backend"]
        Worker["Worker"]
        SLA["Контроль сроков"]
        Sandbox["Песочница<br/>проверка гипотез"]
        UI["Веб-интерфейс"]
    end

    LLM["LLM-сервис"]
    Jira["Jira"]
    Chat["Мессенджеры и почта"]
    DB[("PostgreSQL")]

    Worker <--> |"1, 2"| LLM
    Worker <--> |"3"| Sandbox
    Worker --> |"4"| DB
    UI --> |"5"| API
    Worker <--> |"6, 9"| Jira
    SLA --> |"7"| DB
    SLA --> |"8"| Chat
    Worker --> |"10"| Chat

    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 API,Worker,SLA,Sandbox,UI hub
    class LLM,Jira,Chat ext
    class DB store

В каком порядке это происходит

sequenceDiagram
    autonumber
    participant W as Worker
    participant L as LLM-сервис
    participant S as Песочница
    participant DB as PostgreSQL
    participant U as Аналитик
    participant J as Jira
    participant C as Мессенджеры

    W->>L: разбор новой находки с контекстом
    L-->>W: вердикт и предложенные проверки
    W->>S: выполнение проверок в изоляции
    W->>DB: сохранение вердикта и комментария
    U->>DB: подтверждение находки в интерфейсе
    W->>J: создание задачи по шаблону проекта
    W->>DB: запуск таймера срока устранения
    W->>C: предупреждение о приближении срока
    J-->>W: задача закрыта, статус возвращается в Hub
    W->>C: уведомление об исправлении

Расшифровка шагов

Шаг Что происходит
1 Если разбор языковой моделью включён, worker отправляет ей находку с контекстом: правило, местоположение, фрагмент кода или параметры сервиса.
2 Модель возвращает вердикт — например, «похоже на ложное срабатывание» с оценкой уверенности — и, при необходимости, набор проверок, которые подтвердили бы или опровергли догадку.
3 Проверки выполняются в изолированной песочнице с ограниченным набором разрешённых команд, лимитом времени и лимитом объёма вывода. Сама модель ничего не запускает.
4 Вердикт и обоснование сохраняются как комментарий к находке. Автоматически статус меняется только у находок, которых ещё не касался человек.
5 Аналитик просматривает находку и принимает решение: подтвердить, отклонить как ложное срабатывание, принять риск на срок, отложить до внешнего события.
6 При подтверждении, если интеграция с Jira включена, worker создаёт задачу по шаблону проекта. Тип задачи может зависеть от того, какой сканер нашёл проблему.
7 С переходом в работу запускается таймер срока устранения. Срок зависит от критичности и настроек проекта.
8 При приближении срока и при его нарушении отправляются уведомления в настроенные каналы.
9 Если включена обратная синхронизация, Hub периодически опрашивает Jira и закрывает находки, чьи задачи достигли завершающего статуса. Есть и обратный путь — приём уведомления от самой Jira.
10 Об исправлении отправляется уведомление; закрытые за период находки могут собираться в сводку.

Что нужно с вашей стороны

  • Для разбора языковой моделью — доступ к LLM-сервису, совместимому по API, и решение о том, какие данные о находках допустимо ему передавать. В промышленной среде адрес сервиса обязан использовать https.
  • Для Jira — учётная запись бота, права на создание задач в нужных проектах и шаблон задачи. Обращения к Jira по умолчанию запрещены к локальным и внутренним адресам — это защита от подделки запросов на стороне сервера, и её приходится ослаблять явно, если Jira развёрнута внутри периметра.
  • Для уведомлений — бот в Telegram или MAX, входящий webhook Mattermost либо параметры SMTP-сервера.

Подробности: AI-триаж и песочница, Jira, Уведомления.

Сценарий 4. Связь находок с инвентарём

Находка «на адресе 203.0.113.10 открыт порт 8080 с известной уязвимостью» превращается в работу только тогда, когда понятно, чей это узел, что на нём крутится и кому писать. Эти сведения лежат не в сканере, а в системе учёта активов — NetBox, CMDB, системе управления парком устройств.

Security Hub забирает их двумя способами: собственной интеграцией с NetBox и плагинами, которые исполняются в изолированном процессе и общаются с внешними системами через ограниченный набор разрешённых обращений.

Кто с кем взаимодействует

flowchart TD
    subgraph HubBox["Входит в Security Hub"]
        API["Backend"]
        Worker["Worker"]
        Runner["Среда исполнения<br/>плагинов"]
        Plugin["Плагин<br/>обогащения"]
        UI["Веб-интерфейс"]
    end

    CMDB["Система учёта активов<br/>CMDB, парк устройств"]
    NetBox["NetBox"]
    DB[("PostgreSQL")]

    Worker --> |"1"| Runner
    Runner --> |"2"| Plugin
    Plugin --> |"3, 4"| CMDB
    Runner --> |"5"| Worker
    Worker --> |"6"| DB
    API <--> |"7"| NetBox
    UI --> |"8"| API

    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 API,Worker,Runner,Plugin,UI hub
    class CMDB,NetBox ext
    class DB store

В каком порядке это происходит

sequenceDiagram
    autonumber
    participant W as Worker
    participant R as Среда исполнения плагинов
    participant P as Плагин обогащения
    participant C as Система учёта активов
    participant DB as PostgreSQL
    participant API as Backend
    participant NB as NetBox
    participant U as Аналитик

    W->>R: появилась новая находка, требуется обогащение
    R->>P: запуск плагина в отдельном процессе
    P->>C: запрос сведений об узле
    C-->>P: владелец, назначение, окружение
    R->>W: результат в виде меток
    W->>DB: метки сохраняются у находки
    API->>NB: сверка адресов периметра
    U->>API: фильтрация и разбор находок по меткам

Расшифровка шагов

Шаг Что происходит
1 Появление находки ставит фоновую задачу обогащения. Обогащение можно запустить и вручную для уже существующих находок.
2 Плагин запускается в отдельном процессе, а не внутри backend. Прямого доступа к базе данных Hub у него нет.
3 Всё общение с внешним миром идёт через фиксированный набор из четырёх обращений к среде исполнения: выполнить HTTP-запрос, получить секрет, получить секрет проекта, записать сообщение в журнал. Адреса, к которым плагину разрешено обращаться, ограничены списком; секреты выдаются по запросу и в самом плагине не хранятся.
4 Система учёта возвращает сведения об узле: владелец, назначение, окружение.
5 Плагин возвращает результат в виде меток.
6 Метки сохраняются у находки и становятся доступны для фильтрации, поиска и правил маршрутизации.
7 Параллельно работает собственная интеграция с NetBox: адреса и зоны оттуда служат источником периметра, а в карточке находки адрес становится ссылкой на поиск в NetBox.
8 Аналитик отбирает находки по владельцу, окружению или назначению узла — а не только по критичности.

Что нужно с вашей стороны

  • Система учёта активов с доступным API и учётная запись только на чтение.
  • Решение о том, какие поля из неё допустимо переносить в Hub.
  • Для NetBox — токен доступа и договорённость о метках, по которым различаются учтённые и обнаруженные адреса.

Подробности: Плагины, NetBox, Происхождение записей.