SBOM и SLSA: безопасность software supply chain

Сканер нашёл ноль уязвимостей — это ещё не значит, что в registry лежит артефакт из вашего кода. SBOM отвечает, из чего он собран. Provenance — где и как. Подпись и проверка — можно ли этому утверждению доверять. По отдельности это файлы, вместе — контроль выпуска.

Автор — Дмитрий Тыльный · опыт Senior DevOps · 7 сентября 2026 · 11 мин

Коротко. Выпускайте immutable artifact по digest, генерируйте SBOM в машиночитаемом формате, создавайте provenance на build platform, подписывайте или получайте подписанную аттестацию и проверяйте её перед deploy. SLSA — не сертификат «безопасно», а модель зрелости источника и сборки.

Что именно защищаем

Цепочка поставки начинается с commit и включает зависимости, CI, build image, registry и deployment. Атакующий может подменить зависимость, изменить workflow, украсть upload token, заменить образ после проверки или подсунуть сборку не из того commit. Обычный SAST не доказывает происхождение готового файла.

SBOM: состав, а не гарантия

Software Bill of Materials — перечень компонентов, версий, связей и идентификаторов. SPDX и CycloneDX — распространённые машиночитаемые форматы. SBOM позволяет ответить: есть ли конкретная библиотека в конкретном image и какие релизы надо проверять после новой CVE.

Генерируйте SBOM из финального артефакта или в доверенном build job, а не из ноутбука разработчика. Привязывайте его к digest. Файл без связи с образом быстро становится декоративным приложением к релизу.

AIBOM: модель тоже зависимость

В AI-сервисе одного списка библиотек мало. Зафиксируйте точный идентификатор и ревизию модели, tokenizer, формат весов, квантизацию, лицензию, источник, хеш файлов, runtime, адаптеры и системную конфигурацию. Если используются датасет или набор оценки, у них тоже должна быть версия и происхождение — без выгрузки самих чувствительных данных в публичную аттестацию.

Подписывайте не абстрактное имя модели, а конкретный manifest или digest набора файлов. На deploy проверяйте, что image, модель и конфигурация образуют разрешённую связку. Иначе подписанный контейнер может скачать после запуска другие веса, а ваша provenance будет честно доказывать происхождение только оболочки.

release-manifest.json
├── image: registry/app@sha256:...
├── model: model-store/qwen@sha256:...
├── tokenizer: sha256:...
├── runtime-config: sha256:...
└── eval-set: internal:v17

Для агента добавьте версии prompt policy, разрешённых tools и MCP-серверов. Это не повод называть любой JSON новым стандартом. Задача AIBOM — воспроизводимо ответить, что именно работало в релизе и что надо отозвать после проблемы.

Provenance: история происхождения

Provenance описывает, какой builder, процесс и входы создали artifact. В модели SLSA Build L1 provenance уже существует; на L2 его формирует и подписывает hosted build platform; L3 требует более жёсткой изоляции и защиты build platform. Это накопительные уровни гарантий, а не оценка качества кода.

Ключевая мысль: шаги самого workflow не должны иметь возможность незаметно придумать себе «правильное» происхождение. Чем выше уровень, тем меньше доверия пользовательскому build-коду и больше — изолированному control plane.

Минимальный pipeline

  1. Checkout точного commit, а не плавающей ветки.
  2. Установка зависимостей по lock-файлу.
  3. Тесты и сканирование.
  4. Сборка image без секретов в слоях.
  5. Публикация по digest.
  6. Генерация SBOM и provenance.
  7. Подпись аттестаций доверенным механизмом.
  8. Проверка политики перед допуском в окружение.

Если после подписи вы пересобрали image или перепушили tag, старое доказательство относится к другому digest. Tag удобен людям, digest нужен контролю.

Проверка важнее генерации

Склад SBOM и подписей сам по себе ничего не блокирует. На deploy проверьте digest artifact, доверенного issuer или ключ, репозиторий и workflow, ожидаемый build type, branch/tag и допустимый уровень. При несовпадении политика должна остановить выпуск, а не написать предупреждение в лог, который никто не читает.

commit → hosted build → image@sha256:...
                    ├── SBOM
                    └── signed provenance
deploy policy → verify digest + identity + source → allow / deny

Зависимости и уязвимости

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

Секреты сборки

Секрет не должен попадать в Docker layer, artifact, SBOM, provenance или лог. Используйте краткоживущую идентичность и секретные mounts, ограничивайте права workflow. Pull request из недоверенного fork не должен автоматически получать production credentials.

Проект для портфолио

Возьмите маленькое приложение и GitHub Actions. Соберите image, опубликуйте по digest, получите SBOM, provenance и проверку перед тестовым deploy. Затем покажите два отказа: попытку развернуть неподписанный image и image из чужого workflow. В README объясните threat model, что именно гарантирует каждый файл и что не гарантирует.

Сам pipeline соберите по гайду GitHub Actions, а доставку декларативного artifact — через GitOps и Argo CD.

Типичные ошибки

  • SBOM создан, но не привязан к digest;
  • tag можно перезаписать после сканирования;
  • подпись есть, но deploy её не проверяет;
  • workflow закрепляет action по плавающему tag;
  • provenance генерирует тот же недоверенный скрипт, который он должен контролировать;
  • уровень SLSA называют аудитом безопасности приложения.

Частые вопросы

SBOM делает продукт безопасным?
Нет. Он делает состав видимым и ускоряет анализ. Уязвимость всё равно надо оценить и устранить.

SLSA заменяет подпись образа?
Нет. SLSA задаёт требования и модель происхождения; конкретная реализация должна создать и проверить доверенное доказательство.

С чего начать маленькой команде?
С immutable digest, SBOM, hosted build provenance и обязательной проверки перед deploy.

Артефакт должен доказать происхождение

Иначе вы защищаете репозиторий, а запускаете неизвестно что.

Собрать CI