Пиков / КАПО
Как читать авторский курс и нормативные материалы

Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин 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, а не абсолютное число.

Если не получилось

Критерий зачёта

Показать преподавателю: оба файла (syft-fs.json, syft-image.json), вывод jq с двумя разными числами, строку syft version. Назвать одним предложением, какие именно компоненты появились только в скане образа и почему их нет в скане исходников.

Нормативная связка