Вкладка безопасности
Доступно только в GitFlic Enterprise
Страница Безопасность используется для просмотра и обработки обнаруженных уязвимостей, найденных анализаторами безопасности проекта. Уязвимости на странице можно фильтровать по типу, снэпшоту, уровню опасности и другим параметрам.
Режим разметки позволяет выбирать классификацию для обнаружений (Ложное срабатывание или Подтвержденная уязвимость). Подробнее в статье про режим Разметки.
Для работы со страницей безопасности требуется роль, в которой предусмотрены права Просмотр уязвимостей, Управление уязвимостями, Разбор уязвимостей, Проверка разбора уязвимостей. Данное право по умолчанию есть у стандартной роли Разработчик.
Загрузка отчетов
Поддерживаемые типы отчетов
На странице безопасности поддерживаются следующие типы отчетов:
| Тип отчета | Описание | Формат | Спецификация |
|---|---|---|---|
| SAST | Результаты статического анализа безопасности исходного кода | SARIF | SARIF 2.1.0 |
| DAST | Результаты динамического анализа безопасности приложения | SARIF | SARIF 2.1.0 |
| SCA | Результаты анализа состава программного обеспечения и используемых компонентов | CycloneDX | CycloneDX в формате JSON или XML |
Отчеты можно добавить на страницу безопасности автоматически из конвейера или вручную.
Загрузка из конвейера
Анализатор безопасности запускается в задаче конвейера и формирует отчет поддерживаемого формата. После завершения задачи отчет передается в GitFlic и отображается на странице безопасности проекта.
Конфигурация и запуск анализатора выполняются на мощностях, используемых агентом CI/CD. Анализатор и сценарий его запуска необходимо выбрать и настроить для проекта самостоятельно.
Подробнее о подготовке отчетов и подключении анализаторов рассказано в статьях SAST, DAST и SCA.
Ручная загрузка
Подготовленный отчет можно загрузить без запуска анализатора в конвейере.
Для ручной загрузки отчета требуется:
- Открыть раздел управления отчетами на странице безопасности.
- Перейти к добавлению отчета.
- Загрузить подготовленный файл.
- Указать тип отчета.
- Выбрать ветку, к которой относится отчет.
- Завершить загрузку.
При ручной загрузке снэпшот связывается с последним коммитом выбранной рабочей ветки.
Ручная загрузка предназначена для случаев, когда отчёт безопасности необходимо добавить без CI/CD-конвейера.
За один раз можно передать до 30 файлов.
Загрузка пустого отчета
Корректный пустой отчёт также имеет смысл: он подтверждает, что соответствующий вид анализа был выполнен, но уязвимости в данном состоянии не обнаружены. Такой отчёт может повлиять на актуальное состояние уже известных уязвимостей с учётом истории коммитов и логической ветки.
Снэпшоты отчетов
Отчеты объединяются в снэпшоты. Снэпшот фиксирует результаты анализа для конкретного состояния проекта.
Для отчета, сформированного в конвейере, снэпшот содержит ссылку на конвейер, в котором был получен отчет. На странице конвейера доступна ссылка на коммит, определяющий состояние репозитория на момент сканирования.
Таким образом, цепочка связей имеет следующий вид:
Снэпшот отчета → конвейер → коммит
Снэпшоты можно различать по названию, которое формируется из даты создания и названия ветки или тега, для которых был запущен конвейер.
При ручной загрузке снэпшот создается для последнего коммита выбранной рабочей ветки.
Обзор страницы уязвимости
При выборе уязвимости в списке открывается её внутренняя страница. Страница показывает не только общие сведения об обнаружении, но и выбранный контекст — логическую ветку или тег, в рамках которых пользователь просматривает уязвимость.
Для каждой обнаруженной уязвимости доступна следующая информация: Важность, Ветка, Коммит, Утилита, Сканер, Актуальный снапшот, Статус, Класс.
На вкладке «По веткам» отображаются только те контексты уязвимости, которые одновременно:
- относятся к веткам, находящимся в текущих настройках LTS;
- уже были созданы для данной уязвимости при обработке отчётов.
Контексты сортируются по приоритету LTS-веток. Для каждого контекста показываются название ветки и текущее состояние исследования, если оно существует. Пользователь может переключить контекст и просмотреть ту же уязвимость в другой LTS-ветке.
Если уязвимость не встречалась ни в одной из настроенных LTS-веток, список будет пустым. Контекст фактической ветки, не входящей в текущие настройки LTS, всё ещё можно открыть прямым переходом из её снэпшота или конвейера, но он не появится в переключателе LTS-веток.
Изменение состояния
Если для выбранного контекста создан объект исследования и у пользователя есть право управления уязвимостями, на странице доступны состояния:
- Требует внимания;
- Подтверждена;
- Отклонена;
- Разрешена.
Перевод в Разрешена требует дополнительного подтверждения. Это терминальное (конечное, финальное) состояние: после него перевести тот же объект исследования обратно в другое состояние нельзя.
Кнопки изменения состояния отображаются только для уязвимостей, допущенных к исследованию.
Комментарии и дискуссии
Комментарии привязаны к контексту уязвимости. Поэтому обсуждение одной и той же обнаруженной уязвимости в разных LTS-ветках ведётся раздельно.
На странице есть два представления:
- «Текущая ветка» — дискуссии выбранного контекста;
- «Другие LTS-ветки» — дискуссии этой же уязвимости в остальных доступных LTS-контекстах.
В текущем контексте пользователь с соответствующими правами может:
- начать новую дискуссию;
- отвечать в существующей дискуссии;
- пометить дискуссию решённой;
- удалить собственный комментарий;
- при наличии расширенного права удалить чужой комментарий.
Автор корневого комментария или пользователь с соответствующим правом может завершить дискуссию. Вкладка «Другие LTS-ветки» предназначена для просмотра. Чтобы оставить комментарий в другой ветке, необходимо выбрать её на вкладке «По веткам», после чего она станет текущим контекстом.
Возможность оставлять контекстные комментарии не зависит от наличия объекта исследования: обсуждать можно в том числе уязвимость, для которой изменение состояния пока недоступно.
Настройка LTS-веток
Настройка находится в параметрах проекта в разделе «Безопасность».
LTS-ветки задают те ветки, по которым GitFlic группирует состояния уязвимостей. Это полезно, когда отчёты запускаются во множестве feature-веток, но результаты необходимо относить к ограниченному набору длительно поддерживаемых веток.
Порядок имеет значение: чем выше ветка находится в списке, тем выше её приоритет.
Работа с уязвимостями в Запросах на Слияние
При работе в Запросе на Слияние можно посмотреть не полный список уязвимостей веток (исходной и целевой), а разницу — изменения безопасности, которые вносит текущий Запрос на Слияние.
На вкладку Безопасность входят два типа уязвимостей:
- уязвимость привносится запросом на слияние;
- уязвимость решается запросом на слияние.
Для расчёта обнаружений необходимо включить «Конвейер слияния».
Расчёт привязан к состоянию веток на момент запуска конвейера:
- коммит исходной ветки, для которого запущен конвейер;
- коммит целевой ветки, зафиксированный при запуске конвейера.
Если целевая ветка продвинется во время выполнения конвейера, это не изменит уже запущенный расчёт. Для сравнения с новым состоянием целевой ветки необходимо запустить новый конвейер слияния.
Для одного вида анализа используются множества уязвимостей выбранных снэпшотов:
- уязвимость считается привнесённой, если она есть в исходной, но отсутствует в актуальном для расчёта состоянии целевой ветки;
- уязвимость считается решенной, если она существовала в общей базовой истории, по-прежнему присутствует в целевой, но отсутствует в исходной.
Пограничные случаи:
- Если подходящего снэпшота исходной ветки нет нет, возвращается пустая разница: сравнивать исходную ветку не с чем.
- Если в target нет ни базового, ни более нового снэпшота, все уязвимости source считаются привнесёнными.
- Пустой, но корректный отчёт означает, что проверка выполнена и уязвимости не обнаружены. Это отличается от отсутствия отчёта.
- Ошибка обработки хотя бы одного артефакта делает расчёт соответствующего вида анализа неуспешным.
- Если в новом конвейере слияния нет отчётов безопасности, новый расчёт создаётся только тогда, когда target-ветка изменилась относительно последнего готового результата. Если target не менялся, сохраняется предыдущий результат.