Сканирование безопасности загружает в пайплайн Software Bill of Materials (SBOM) в формате CycloneDX. Две страницы проекта читают этот артефакт и показывают его содержимое:

СтраницаАдресЧто показывает
«Список зависимостей»/-/security/dependenciesКомпоненты SBOM: имя, версия, тип, лицензия, идентификатор пакета
«Соответствие лицензий»/-/security/licensesЛицензии этих компонентов и количество компонентов под каждой

Обе страницы доступны только для чтения и открываются из раздела «Безопасность» в боковом меню проекта.

Условия доступности

Обе страницы есть в разделе «Безопасность», пока выполнены все условия; иначе их адреса отвечают 404:

  • в настройках проекта включена функция «Безопасность и соблюдение норм»;
  • у пользователя в проекте роль Developer, Maintainer или Owner;
  • на инстансе включён фича-флаг fe_security_scan_policies;
  • лицензия установки включает сканирование безопасности.

Фича-флаг fe_security_scan_policies по умолчанию выключен. Пока он выключен, обе страницы скрыты вместе со страницами политик и интеграций со сканерами. Попросите администратора инстанса включить его.

Откуда берутся данные

Обе страницы читают последний пайплайн ветки по умолчанию проекта в любом его статусе: у выполняющегося пайплайна артефакта ещё нет, а у упавшего остаются отчёты, которые задания загрузили с artifacts:when: always.

Из этого пайплайна берутся все артефакты заданий с типом отчёта cyclonedx. Такой отчёт пишет сканирование codescoring: задание codescoring_sca публикует gl-sbom.cdx.json как artifacts:reports:cyclonedx. Задание из собственного .gitlab-ci.yml проекта, которое загружает отчёт того же типа, попадает на эти страницы так же.

Компоненты из всех таких артефактов объединяются в одну таблицу. Компонент остаётся в ней один раз и опознаётся по идентификатору пакета, а если идентификатора нет — по имени и версии. Поэтому обе страницы показывают всё, что сообщили анализаторы пайплайна вместе.

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

Над таблицей обе страницы показывают, откуда взят SBOM: статус пайплайна, его номер, коммит, время запуска и кнопку скачивания для каждого артефакта CycloneDX — «Скачать SBOM» или «Скачать SBOM (<имя задания>)», если в пайплайне их несколько. Пользователю без доступа к артефактам заданий проекта кнопка не показывается. Строка ниже называет ветку: «Данные взяты из последнего пайплайна в ветке main. Запустите новый пайплайн, чтобы обновить их.»

Для проекта, в ветке по умолчанию которого нет ни одного пайплайна, этого блока нет.

Список зависимостей

Список зависимостей

Столбцы таблицы:

СтолбецЧто содержит
«Компонент»Имя компонента из SBOM
«Версия»Версия компонента
«Тип»Тип компонента по CycloneDX: library, application, container и другие
«Лицензия»Лицензии, объявленные компонентом, через запятую; «Неизвестно», если он не объявил ни одной
«Идентификатор»Идентификатор пакета в формате purl

На страницу выводится 50 строк. Над таблицей стоит количество компонентов в SBOM, а при заданном фильтре — «Фильтрам соответствует 6 из 194 компонентов.»

Элементы управления над таблицей:

ЭлементЧто делает
«Поиск»Оставляет компоненты, в имени которых есть введённый текст, без учёта регистра
«Тип»Оставляет компоненты одного типа
«Лицензия»Оставляет компоненты под одной лицензией; «Неизвестно» оставляет те, что не объявили ни одной
«Сортировка»Задаёт порядок строк: «Имя, от А до Я» (по умолчанию), «Имя, от Я до А», «Тип», «Лицензия»

Кнопка «Применить» применяет выбранные значения. Кнопка «Сбросить фильтры» появляется, когда задан хотя бы один фильтр, и возвращает полный список. Списки «Тип» и «Лицензия» строятся по всему SBOM, поэтому сужение одного из них сохраняет варианты другого.

Список зависимостей с фильтром по лицензии

Выбранные значения хранятся в адресе, поэтому отфильтрованный список можно сохранить в закладки или отправить коллеге: /-/security/dependencies?license=GPL-3.0-only&sort=name_desc.

Фильтр, которому ничего не соответствует, показывает «Нет зависимостей, соответствующих фильтрам» и подсказку «Измените или сбросьте фильтры, чтобы увидеть больше компонентов.»

Соответствие лицензий

Соответствие лицензий

Столбцы таблицы:

СтолбецЧто содержит
«Лицензия»Идентификатор лицензии из SBOM; «Неизвестно» собирает компоненты, которые не объявили лицензию
«Компоненты»Сколько компонентов под этой лицензией. Число ведёт в список зависимостей, отфильтрованный по ней
«Примеры»До десяти имён компонентов; ссылка «и ещё N» ведёт в тот же отфильтрованный список

Строки упорядочены по количеству компонентов, от большего к меньшему, а при равном количестве — по алфавиту. Компонент, объявивший несколько лицензий, посчитан под каждой из них, поэтому сумма по строкам больше количества компонентов в SBOM.

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

Состояния отчёта

Что в пайплайнеЧто показывают страницы
Артефакта CycloneDX нет«Пока нет результатов SBOM» и «Запустите пайплайн с включённым сканером CodeScoring, чтобы увидеть здесь зависимости проекта.»
Артефакты есть, но ни один не удалось прочитать«Не удалось прочитать отчёт SBOM» и «Не удалось прочитать последний артефакт сканирования. Проверьте логи задания CodeScoring и перезапустите пайплайн.»
Хотя бы один артефакт прочитанТаблицы. Для SBOM без компонентов — «Зависимости не найдены» или «Лицензии не найдены»

Один нечитаемый артефакт оставляет остальные на месте: страницы показывают то, что сообщили прочитанные. Блок с пайплайном и кнопками скачивания показывается во всех трёх состояниях, поэтому нечитаемый артефакт можно скачать и разобрать.

Диагностика

Страниц нет в разделе «Безопасность»

Проверьте условия из раздела «Условия доступности»: настройку проекта, свою роль в проекте, фича-флаг и лицензию установки.

«Пока нет результатов SBOM» после успешного пайплайна

Последний пайплайн ветки по умолчанию не загрузил ни одного артефакта с типом отчёта cyclonedx. Проверьте, что:

  • пайплайн со сканированием запущен в ветке по умолчанию: пайплайн другой ветки или мерж-реквеста оставляет эти страницы пустыми;
  • задание сканирования завершилось и загрузило артефакты — это видно на вкладке «Задания» пайплайна;
  • путь в ключе artifacts:reports:cyclonedx задания указывает на файл, который задание записало.

«Не удалось прочитать отчёт SBOM»

Скачайте артефакт из блока с пайплайном и откройте его: страницы читают документ CycloneDX в формате JSON. Задание codescoring_sca пишет формат, заданный переменной FE_SCANS_CODESCORING_BOM_FORMAT, по умолчанию cyclonedx_v1_6_json; другой формат загружается в тот же артефакт и здесь не читается.

Дополнительные ресурсы