02 дек. 2025 г.·8 мин

SBOM в CI/CD: внедрение CycloneDX, SPDX и Dependency-Track

Практический план, как внедрить SBOM в CI/CD и закупки: выбор CycloneDX или SPDX, генерация, хранение, анализ в Dependency-Track и быстрые проверки.

SBOM в CI/CD: внедрение CycloneDX, SPDX и Dependency-Track

Проблема: зависимости есть, а прозрачности нет

Почти любое приложение сегодня собирается из десятков и сотен чужих компонентов. Когда появляется новая уязвимость в популярной библиотеке, первый вопрос звучит просто: затронуты ли мы? На практике ответ часто превращается в переписку на дни, потому что точного списка компонентов под рукой нет.

Без явного перечня обычно теряются три вещи. Во-первых, точные версии: в репозитории есть package.json или pom.xml, но в прод ушло что-то другое. Во-вторых, транзитивные зависимости: вы их не выбирали, но они попали в сборку через другие пакеты. В-третьих, происхождение: откуда пришел артефакт, какой источник использовался при сборке, какие хэши и метаданные у бинарников.

SBOM закрывает этот пробел. Это единый документ, который фиксирует состав поставки: что именно внутри, в каких версиях и как связано. Если SBOM встроен в CI/CD, вы не гадаете по логам и не ищете вручную по репозиториям, а быстро сверяете факт поставки с конкретной уязвимостью и понимаете масштаб работ.

Больше всего выигрывают команды, которым нужно действовать согласованно:

  • Разработка быстрее находит, где обновлять и что может сломаться.
  • Безопасность быстрее оценивает риск и приоритизирует патчи.
  • ИТ-эксплуатация понимает, какие сервисы и окружения реально затронуты.
  • Закупки получают прозрачные требования к составу поставляемого ПО.

Простой сценарий: выходит критическая уязвимость в компоненте X. Без SBOM вы проверяете десятки проектов и контейнеров, а часть зависимостей скрыта. С SBOM вы фильтруете по компоненту и версии и сразу видите, какие сборки затронуты и какие нет. Это экономит часы и снижает риск пропустить проблемный сервис.

Что такое SBOM и что в нем должно быть

SBOM (Software Bill of Materials) - это понятный список того, из чего состоит ваше приложение: какие библиотеки, модули и пакеты в него входят, и какие у них версии. Проще всего представить SBOM как "состав" на упаковке: не про то, как вы готовили продукт, а из каких компонентов он реально собран.

Хороший SBOM отвечает на главный вопрос безопасности: "Где именно у нас используется этот компонент, и какой он версии?" Это особенно важно, когда всплывает новая уязвимость в популярной зависимости, и времени на ручной поиск по репозиториям нет.

Что должно быть внутри SBOM

Минимальный набор полей, который обычно помогает и в инцидентах, и при проверках:

  • название компонента (пакета/библиотеки) и его версия
  • идентификатор компонента (например, package URL), чтобы избежать путаницы с "однофамильцами"
  • лицензия, чтобы понимать риски использования и ограничения
  • контрольные суммы (хэши) или другие признаки целостности, чтобы отличать "тот же" файл от подмененного
  • источник (откуда получен компонент: реестр, репозиторий, внутренний артефакт)

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

SBOM как артефакт поставки

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

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

CycloneDX и SPDX: как выбрать формат без лишней теории

CycloneDX и SPDX решают похожую задачу - описать состав ПО, - но обычно их выбирают под разные потребности. Если важно быстро находить уязвимости в библиотеках и не тормозить релизы, чаще всего проще начать с CycloneDX. Если на первом месте юридическая чистота, лицензии и обмен документами между организациями, удобнее SPDX.

CycloneDX хорошо ложится на AppSec и DevSecOps: его часто поддерживают инструменты, которые принимают SBOM в CI/CD, строят граф зависимостей и связывают компоненты с уязвимостями. Он удобен, когда цель - быстро ответить на вопрос "где у нас используется эта версия пакета?".

SPDX сильнее в части соответствия требованиям: лицензии, авторство, поставщики, доказуемость происхождения. Это полезно, когда вы закупаете ПО у подрядчиков или сами поставляете решения крупным заказчикам и нужно формально подтвердить состав и лицензирование.

При выборе формата смотрите не на "популярность", а на то, какие поля критичны именно вам:

  • точная идентификация компонента (name, version и желательно purl)
  • лицензия и тип поставки (особенно для закупок и аудита)
  • хэши/подписи для проверки целостности
  • связь "что от чего зависит" (граф зависимостей)
  • метаданные сборки (как и чем собрали, чтобы повторить)

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

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

Подготовка: инвентаризация, охват и правила

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

Определите охват. Обычно в него попадают приложения (бэкенд, фронтенд, desktop), контейнерные образы, библиотеки, которые вы публикуете внутри компании, а также базовые инфраструктурные пакеты (например, агенты, утилиты, компоненты ОС в образах). Важно записать это как правило. Иначе одна команда будет делать SBOM только для кода, а другая - для всего контейнера.

Составьте карту технологий: какие языки и менеджеры пакетов реально используются (npm/yarn/pnpm, Maven/Gradle, NuGet, pip/Poetry, Go modules и т.д.). Это влияет на инструменты генерации и на качество результата. Если часть сборок не попадает в SBOM из-за "экзотики", появляются слепые зоны.

Договоритесь о глубине. Для поиска уязвимостей почти всегда нужны не только прямые, но и транзитивные зависимости. Иначе при новой CVE вы будете видеть "чистый" список, а проблема окажется глубже.

Заранее введите правила идентификации, чтобы не плодить дубли: единый способ писать имя компонента, версию, поставщика и тип. Даже мелочь вроде разных регистров или "react 18.2.0" против "[email protected]" потом ломает поиск и отчеты.

Назначьте владельцев. У каждого продукта должен быть ответственный за SBOM (часто тимлид или релиз-инженер), а у безопасности - роль контроля политики. Пример: команда выпускает релиз, CI собирает SBOM, а владелец подтверждает, что он сформирован для нужного артефакта и по согласованным правилам.

Как генерировать SBOM для разных типов сборок

Самый надежный путь - генерировать SBOM прямо из тех файлов, которые управляют зависимостями в сборке: манифестов и lock-файлов. Lock-файл особенно важен: он фиксирует точные версии, без него SBOM часто получается "примерным", а не пригодным для расследований.

Для библиотек и приложений (Java, .NET, Node.js, Python и т.д.) обычно достаточно опираться на манифест, lock-файл и данные сборщика. Так вы получаете и прямые, и транзитивные зависимости, а также их точные версии.

С контейнерами сложнее: важно учитывать не только ваше приложение, но и базовый образ и пакеты ОС внутри него. Частая ошибка - выпустить SBOM только для кода, забыв про OpenSSL, glibc или системные утилиты, которые тоже попадают под уязвимости. Практичный подход - делать два слоя: SBOM приложения и SBOM контейнера, а затем хранить их рядом как один набор артефактов релиза.

Чтобы SBOM был удобен в работе, заранее договоритесь об одном формате вывода для всех проектов (например, CycloneDX или SPDX) и о простой структуре артефактов: имя проекта, версия, номер сборки, хэш коммита, окружение.

Качество SBOM стоит проверять автоматически. Минимальные проверки:

  • нет пустых версий и "LATEST"
  • имена пакетов совпадают с экосистемой (group/artifact, npm name и т.д.)
  • присутствуют транзитивные зависимости
  • для контейнеров учтены пакеты ОС и базовый образ

Пересобирать SBOM нужно при каждом билде, который уходит дальше разработки, и обязательно при релизе и hotfix. Иначе вы будете разбирать инцидент с SBOM, который относится к "почти такой же" сборке, а не к той, что реально в проде.

Пошагово: внедряем SBOM в CI/CD

Обучение по SBOM и уязвимостям
Обучим команды разработчиков, ИБ и эксплуатации работе с SBOM и триажу уязвимостей.
Провести обучение

SBOM в CI/CD лучше внедрять как часть обычной сборки, а не как отдельный ручной документ. Тогда SBOM соответствует тому, что реально попало в артефакт, и его можно быстро поднять при разборе инцидента.

Минимальная схема пайплайна

Начните с простого, но повторяемого сценария:

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

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

Заранее решите, что ломает сборку, а что только предупреждает. Обычно провалом считают ситуации, которые делают SBOM недостоверным: не удалось собрать список зависимостей, есть компоненты с неизвестной версией, SBOM не совпадает с артефактом. Предупреждениями чаще делают то, что требует уточнения, но не блокирует релиз сразу: неполные поля, новые лицензии для ручной проверки.

Пример: команда собирает сервис, и одна библиотека подтягивается как "latest". Генератор SBOM фиксирует это как неопределенную версию, правило качества срабатывает, и сборка падает до релиза. В итоге вы не выпускаете версию, которую потом невозможно быстро сопоставить с уязвимостью в конкретной зависимости.

Хранение и целостность SBOM: чтобы ему доверяли

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

Самый практичный вариант - держать SBOM рядом с артефактом релиза в репозитории артефактов. Дополнительно можно сохранять копию в репозитории кода (например, в каталоге с релизными метаданными) или в отдельном внутреннем каталоге SBOM, если так проще управлять доступом.

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

  • commit SHA и/или tag
  • версия (SemVer) и build-id из CI
  • имя компонента и среда (prod, stage)
  • дата сборки и идентификатор пайплайна

Целостность обеспечивают хэши и подписи. Минимум - хранить SHA-256 для SBOM и проверять его в пайплайне при публикации и при скачивании. Лучше - подписывать SBOM (или подписью закрывать комплект артефактов релиза) и ограничить право публикации: только CI-сервисный аккаунт, без ручных загрузок.

Доступ разделяйте: читать SBOM могут команды разработки, ИБ и эксплуатации, а менять или публиковать - только автоматизация. Любое изменение после релиза должно оставлять след: кто, когда и почему.

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

Dependency-Track: анализ SBOM и разбор уязвимостей

Dependency-Track - это система, которая берет ваш SBOM и превращает его в понятную картину рисков: какие компоненты используются, где именно, и какие уязвимости к ним привязаны. Он дополняет обычные сканеры (SAST, контейнерные и IaC-сканеры): сканер находит проблемы в коде и образах, а Dependency-Track держит фокус на зависимостях и их версиях во времени. Это особенно удобно, когда SBOM в CI/CD генерируется на каждый релиз.

Импорт CycloneDX и SPDX: проекты и версии

Практика, которая работает лучше всего: заводить отдельный проект на приложение или сервис, а SBOM загружать как версию (релиз, билд, тег). Тогда вы видите, когда именно уязвимость появилась (или исчезла) и какой релиз затронут.

Если у вас несколько сборок одного продукта (например, on-prem и cloud, разные платформы), разделите их на разные проекты или ветки версий. Иначе triage превратится в спор, что именно пострадало.

Триаж, оповещения и фиксация решений

Когда прилетает новая CVE, triage удобнее вести по простому порядку:

  • Затронуты ли мы: есть ли компонент и уязвимая версия в SBOM.
  • Где используется: какой сервис и какой релиз.
  • Есть ли путь эксплуатации: используется ли уязвимый модуль или функция.
  • Приоритет: критичность, внешняя доступность, наличие публичного эксплойта.
  • План: кто делает и к какому сроку.

Оповещения настраивайте так, чтобы не тонуть в шуме: критичные события сразу в рабочий канал, средние - в ежедневный дайджест, а повторы по одному и тому же компоненту объединяйте.

Решение фиксируйте по ходу работы: обновить зависимость, заменить компонент (если обновления нет) или принять риск с понятной причиной и сроком пересмотра. Если уязвимость есть в библиотеке, но модуль не используется, это повод поставить низкий приоритет, но оставить запись для аудита.

SBOM в закупках: требования к поставщикам и приемка

SBOM для закупок и подрядчиков
Сделаем шаблон требований к SBOM для тендеров и приемки поставляемого ПО.
Подготовить требования

Если SBOM появляется только после инцидента, он не помогает. В закупках его стоит требовать так же явно, как инструкции и условия поддержки. Тогда у команды ИБ и эксплуатации есть опора: что именно поставлено, из чего состоит и как это будет обновляться.

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

  • SBOM обязателен для поставляемого ПО и для каждого обновления (патч, минорная и мажорная версия).
  • Формат на выбор: CycloneDX или SPDX, плюс указание версии схемы.
  • Минимальные поля: название компонента, версия, поставщик/источник, тип (библиотека, образ, пакет), лицензия, хеши, зависимости.
  • Правила для коммерческих модулей: что можно скрыть и как это помечается (например, компонент без публичного имени, но с уникальным идентификатором).
  • Сроки: SBOM передается вместе с поставкой и хранится весь срок поддержки.

На приемке важно не просто получить файл, а проверить, что он соответствует поставке. Обычно достаточно трех проверок: SBOM есть, он относится к нужной версии, и ему можно доверять.

Короткий набор контрольных шагов:

  • Сверить версию продукта и сборки с метаданными SBOM.
  • Проверить целостность (подпись или хеш) и неизменность после передачи.
  • Убедиться, что перечислены ключевые зависимости, а не только верхний уровень.
  • Отметить закрытые компоненты как отдельные позиции, чтобы их можно было учитывать в рисках.
  • Зафиксировать SBOM как артефакт приемки (как акт и комплект поставки).

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

Пример: как SBOM ускоряет реакцию на новую уязвимость

Представьте: утром выходит сообщение о критической уязвимости в популярной библиотеке, например в JSON-парсере. В новости часто пишут одно: "обновитесь до версии X.Y.Z". Но главный вопрос для вашей команды другой: затронуты ли ваши продукты и где именно.

Если у вас настроен SBOM в CI/CD, вы не начинаете с ручного поиска по репозиториям. Вы открываете последний SBOM для каждой сборки и за минуту находите компонент по названию и версии. В инструментах вроде Dependency-Track это обычно еще быстрее: он показывает, в каких приложениях и сборках библиотека встречается, и подсвечивает уязвимые версии.

Дальше важно не паниковать и правильно расставить приоритеты. Одна и та же библиотека может:

  • реально выполняться в проде (прямой импорт, код вызывается)
  • быть транзитивной зависимостью, но не использоваться по факту
  • лежать в dev/test инструментах и не попадать в прод-артефакт
  • присутствовать в образе или дистрибутиве, но не загружаться

В первые сутки помогает простой план:

  • подтвердить, какие сборки уязвимы (по SBOM и версиям)
  • понять экспозицию: интернет-доступ, затронутые сервисы, критичность данных
  • выпустить патч или обновить зависимость и пересобрать артефакты
  • если патча нет, включить временные меры (конфиг, WAF-правило, отключение функции)
  • сообщить владельцам систем и зафиксировать статус для руководства

После инцидента SBOM тоже помогает. Сохраните, какие SBOM использовались для проверки, и обновите правила генерации: чтобы SBOM был привязан к конкретной сборке, хранился с подписью или хешем и всегда включал транзитивные зависимости. Тогда следующий срочный CVE будет не недельной охотой, а часами понятной работы.

Частые ошибки и ловушки при внедрении SBOM

Dependency-Track в рабочем контуре
Настроим прием SBOM и работу с уязвимостями в Dependency-Track под вашу структуру проектов.
Заказать настройку

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

Что обычно ломает внедрение

  • SBOM не привязан к версии и сборке. Если у вас нет идентификатора релиза (тег, номер сборки, хэш), то при инциденте вы тратите время на угадывание: какой именно SBOM правильный.
  • Неполный состав зависимостей. Часто в отчет попадают только прямые библиотеки, а транзитивные остаются за кадром. При появлении новой уязвимости кажется, что вас это не касается, пока сканер не находит компонент в глубине дерева.
  • Разнобой в именах и координатах компонентов. Одна команда пишет "log4j", другая "org.apache.logging.log4j:log4j-core". Поиск, дедупликация и сопоставление CVE начинают давать хаос.
  • Слепое доверие SBOM от поставщика. Даже если документ пришел вместе с продуктом, без приемочных проверок легко получить устаревший файл или SBOM, собранный с другими флагами и репозиториями.
  • Слишком жесткие правила с первого дня. Если сразу блокировать сборки по любому предупреждению, команды начнут обходить процесс или отключать генерацию.

Хорошая стартовая тактика для SBOM в CI/CD: сначала сделать покрытие и сопоставимость, а потом включать ограничения постепенно. Например, в первый месяц фиксируйте SBOM для каждого релиза и проверяйте полноту, а блокировки вводите только для критических уязвимостей и только для новых изменений. Это снижает сопротивление и дает быстрый эффект при разборе инцидентов.

Быстрый чеклист перед запуском в прод

Перед релизом важно не только сгенерировать SBOM, но и убедиться, что ему можно доверять и что по нему реально умеют работать. Этот чеклист помогает поймать типовые пробелы, из-за которых SBOM превращается в формальность.

Проверьте ключевые пункты:

  • На каждый релиз есть SBOM, и он доступен тем, кто будет разбирать инциденты: безопасность, DevOps, владельцы продукта, поддержка.
  • В составе SBOM есть точные версии и уникальные идентификаторы компонентов (например, Package URL или CPE там, где уместно), чтобы не гадать, какая именно библиотека попала в сборку.
  • Учтены транзитивные зависимости, а если вы деплоите контейнеры, то добавлены компоненты образа (пакеты ОС, базовый образ). Иначе часть рисков останется за кадром.
  • SBOM привязан к конкретной сборке: build-id, commit или тегу, и хранится неизменно. После релиза документ не перезаписывают, а выпускают новый для следующей версии.
  • Есть понятный процесс реакции: кто смотрит алерты, кто принимает решение (обновить, компенсировать, принять риск), какие сроки для критичных уязвимостей и как фиксируется итог.

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

Следующие шаги: пилот, стандарты и поддержка внедрения

Начните с небольшого, но законченного пилота. Выберите 1-2 продукта, где есть реальная ценность от прозрачности зависимостей (например, публичный сервис и внутренний API), и доведите цепочку до конца: генерация SBOM, загрузка в хранилище, поиск уязвимостей, триаж, исправление, повторная проверка.

Хороший пилот для SBOM в CI/CD выглядит так:

  • определить владельца процесса (разработка + ИБ) и SLA на разбор алертов
  • зафиксировать точки генерации SBOM (сборка, релиз, контейнер)
  • настроить правило: релиз без SBOM не проходит
  • протестировать кейс: новая CVE в популярной библиотеке и время реакции
  • подготовить отчет: что сломалось, что мешало, что автоматизировать

Дальше важнее всего согласовать единые правила, иначе SBOM превратится в набор файлов, которым никто не доверяет. Закрепите стандарт на уровне компании и сделайте его частью приемки.

В стандарте обычно достаточно договориться о следующем:

  • формат и профиль (CycloneDX или SPDX), обязательные поля и идентификаторы
  • где хранится SBOM, кто имеет доступ, сколько хранить
  • как подтверждать целостность (подпись, контрольные суммы, неизменяемые артефакты)
  • что считать приемлемым риском и когда блокировать релиз

Параллельно подготовьте шаблон требований для закупок и договоров на ПО: срок предоставления SBOM, обновления при изменениях, правила для транзитивных зависимостей и порядок реакции на новые уязвимости.

Не пропускайте обучение: разработчикам важно понимать, как чинить зависимости, закупкам - как принимать поставку, эксплуатации - как использовать SBOM при инцидентах.

Если внутри не хватает рук для настройки пайплайнов, хранилищ артефактов, политики безопасности и инфраструктуры, имеет смысл подключить системного интегратора. Например, GSE.kz (gse.kz) как производитель и системный интегратор в Казахстане ведет комплексные ИТ-проекты и может помочь выстроить процессы, инфраструктуру и поддержку, включая круглосуточный сервис.

FAQ

Что такое SBOM простыми словами и зачем он нужен?

SBOM — это документ со списком компонентов, которые реально попали в поставку: библиотеки, модули, пакеты и их версии. Он нужен, чтобы быстро ответить на вопрос «затронуты ли мы уязвимостью в компоненте X» без ручного поиска по репозиториям и логам.

Что выбрать: CycloneDX или SPDX?

Начните с одного формата и одной цели. Для ежедневной работы с уязвимостями и графом зависимостей обычно проще стартовать с CycloneDX, а для договоров, лицензий и обмена документами между организациями чаще выбирают SPDX.

Какие поля в SBOM должны быть обязательно?

Минимально полезный SBOM содержит название компонента, точную версию, уникальный идентификатор (например, purl), лицензию, контрольные суммы и источник получения. Если добавить связи зависимостей, становится понятнее, почему компонент оказался в сборке и является ли он транзитивным.

Почему SBOM нельзя строить только по package.json или pom.xml?

Потому что манифест показывает «что вы хотите установить», а не «что реально установилось и ушло в прод». Lock-файлы фиксируют точные версии, включая транзитивные зависимости, и делают SBOM пригодным для расследований и сопоставления с уязвимостями.

Как правильно встроить SBOM в CI/CD, чтобы он соответствовал реальному релизу?

Генерируйте SBOM как часть сборки, затем сохраняйте его как артефакт конкретного билда и прикладывайте к релизу рядом с бинарником или образом. Важно, чтобы SBOM пересоздавался на каждый релиз и был однозначно привязан к версии, build-id и commit/tag.

Почему сканер находит уязвимость, а в SBOM ее «не видно»?

Обычно причина в том, что в SBOM не попали транзитивные зависимости, зависимости из lock-файлов или пакеты ОС внутри контейнера. Еще частая проблема — разные правила именования компонентов, из-за чего совпадения по CVE «теряются» и выглядят как разные пакеты.

Нужно ли делать SBOM для контейнеров, и что туда включать?

Для контейнеров нужно учитывать два слоя: ваше приложение и содержимое образа (базовый образ и пакеты ОС). Практично хранить рядом два SBOM — на приложение и на контейнер — чтобы понимать, где именно сидит риск: в коде, в зависимостях или в системных пакетах.

Как хранить SBOM, чтобы ему можно было доверять?

Храните SBOM там же, где живут релизные артефакты, и запрещайте ручную подмену: публиковать должен CI. Минимальная защита — SHA-256 и проверка при публикации и скачивании; лучше дополнительно подписывать SBOM или весь комплект релиза и фиксировать, к какой сборке он относится.

Как использовать Dependency-Track с SBOM на практике?

Заведите проекты по сервисам или продуктам и загружайте SBOM как версии релизов, тогда станет видно, когда уязвимость появилась и в каких сборках. Оповещения настраивайте так, чтобы критичное приходило сразу, а остальное — в дайджест, и обязательно фиксируйте решение: обновление, замена или принятие риска с сроком пересмотра.

Как правильно требовать SBOM от поставщиков и проверять его на приемке?

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