Как читать авторский курс и нормативные материалы
Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.
П03. Генерация SBOM через Syft
Цель
Сгенерировать два SBOM одним инструментом — по каталогу с исходниками и по собранному контейнерному образу того же приложения — и показать на цифрах, что скан образа видит больше: к npm-компонентам из package-lock.json добавляются ОС-пакеты слоёв (apk/deb), которых в исходниках нет. Проверяемый результат: два файла syft-fs.json и syft-image.json с разным числом компонентов в components[].
Команда или действие
Берём небольшой Node-проект с package-lock.json (подойдёт любой учебный сервис). Сначала собираем образ, потом сканируем обе цели и фиксируем версию инструмента.
syft version
# 1) скан каталога с исходниками — видит только объявленные npm-зависимости
syft dir:. -o cyclonedx-json=syft-fs.json
# 2) сборка образа и скан образа — добавляются базовые ОС-пакеты слоёв
docker build -t demo-app:0.1 .
syft demo-app:0.1 -o cyclonedx-json=syft-image.json
# быстрый подсчёт компонентов в каждом SBOM (jq)
jq '.components | length' syft-fs.json syft-image.json
Что вы должны увидеть
В терминале — лог обнаружения каталогов/слоёв и строка с версией; в syft-fs.json компоненты только из npm-экосистемы, в syft-image.json — те же npm-компоненты плюс пакеты базового образа (например pkg:apk/alpine/... или pkg:deb/debian/...).
Подсчёт jq даёт разные числа — ориентир: образ показывает заметно больше (десятки ОС-пакетов сверху). Например:
42 # syft-fs.json — только npm
118 # syft-image.json — npm + слои образа
Скелет компонента и блок инструмента в syft-fs.json:
{
"metadata": {
"tools": { "components": [ { "name": "syft", "version": "1.x.x" } ] }
},
"components": [
{
"type": "library",
"name": "lodash",
"version": "4.17.21",
"purl": "pkg:npm/lodash@4.17.21",
"licenses": [ { "license": { "id": "MIT" } } ]
}
]
}
Почему два файла, а не один Это и есть учебная точка модуля: «сколько компонентов в SBOM» — некорректный вопрос без указания цели скана. Скан исходников отвечает «что объявлено», скан образа — «что реально поставлено». Сравнивайте именно дельту между
syft-fs.jsonиsyft-image.json, а не абсолютное число.
Если не получилось
jq '.components | length'возвращаетnull. Файл сгенерирован в формате не CycloneDX (например, осталась дефолтная таблица). Проверьте, что у вывода стоит-o cyclonedx-json=ИМЯ, а не просто-o cyclonedx-json(тогда JSON ушёл в stdout, а файл пуст).- Числа в
syft-fs.jsonиsyft-image.jsonсовпадают. Скорее всего, образ собран изFROM scratchили distroless без пакетного менеджера — ОС-слой пуст. Возьмите базовый образ с apk/apt (alpine, debian-slim), чтобы дельта была видна. docker buildпадает или образ не находится. Сборка не выполнена/тег другой —syft demo-app:0.1сканирует несуществующий образ и завершается ошибкойno image found. Сверьте тег черезdocker images.- В
syft-fs.jsonнет ни одного npm-компонента. Syft не нашёл lockfile: запуск был не в корне проекта илиpackage-lock.jsonотсутствует (есть толькоpackage.jsonбез зафиксированных версий).
Критерий зачёта
Показать преподавателю: оба файла (syft-fs.json, syft-image.json), вывод jq с двумя разными числами, строку syft version. Назвать одним предложением, какие именно компоненты появились только в скане образа и почему их нет в скане исходников.
Нормативная связка
- Модуль: М05 Инструменты генерации SBOM
- Смежные практики: П05. Trivy как генератор и сканер · П06. Grype поверх готового SBOM · П38. Честный SBOM контейнерного образа
- Минимальный состав полей SBOM, который проверяем в выводе: NTIA Minimum Elements for SBOM · CISA Minimum Elements for SBOM
- Формат: CycloneDX ECMA-424; требование формировать и хранить SBOM — NIST SP 800-218 SSDF (PS.3.2); управляемость работ — ГОСТ Р 56939-2024.