Syft: генерация SBOM для контейнеров

TL;DR
Syft — лёгкий CLI-инструмент для извлечения списка пакетов из контейнерных образов и генерации SBOM (Software Bill of Materials). Его просто установить и интегрировать в CI/CD: используйте JSON/CycloneDX/SPDX-вывод для автоматизации и передачи результатов в инструменты поиска уязвимостей.
Быстрые ссылки
- Установка Syft
- Сканирование образа
- Поддерживаемые типы пакетов
- Изменение формата вывода
- Использование других источников образов
- Когда Syft может не сработать
- Рекомендации по интеграции в CI и обязанностям команд
- Заключение
Syft — это командный инструмент (CLI), который извлекает список пакетов из файловой системы контейнерного образа и формирует SBOM — каталог зависимостей, используемых в образе. SBOM даёт прозрачность: вы видите, какие «материалы» (пакеты, библиотеки, бины) составляют файловую систему образа.
SBOM полезен для оценки длины и сложности цепочки поставок ПО, обнаружения потенциальных векторов атак типа dependency confusion и для аудита. Распространение SBOM вместе с образом помогает пользователям и командам безопасности быстрее понять состав образа и принимать решения по обновлениям и минимизации поверхности атаки.
Syft разрабатывается Anchore. CLI поддерживает извлечение пакетов из Docker и OCI образов и умеет разбирать популярные ОС и языки программирования.
Установка Syft
Самый быстрый способ — официальный инсталлятор, который скачивает последнюю сборку и добавляет бинарь в путь:
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/binНа macOS можно установить Syft через Homebrew:
brew tap anchore/syft
brew install syftПосле установки запустите syft без аргументов, чтобы увидеть доступные команды и подсказки. Для автодополнения оболочки выполните syft completion и следуйте инструкциям для вашей оболочки (bash, zsh, fish и т.д.).
Проверьте установленную версию:
syft versionПериодически сверяйтесь со страницей релизов на GitHub и обновляйте бинарь тем же инсталлятором или через Homebrew.

Сканирование образа
Основная команда для извлечения пакетов — syft packages. Передайте тег образа или путь к архиву:
syft packages alpine:latestSyft скачает образ (если нужен регистр), просканирует файловую систему и выведет список найденных пакетов в табличном виде: имя пакета, версия, тип.

Для минимальных базовых образов (например, Alpine) список будет коротким. Для больших образов количество пакетов может исчисляться сотнями или тысячами. Удобно комбинировать вывод syft с Unix-утилитами grep, awk, jq и т.д.:
syft packages example-image:latest | grep example-package-to-findПримеры полезных флагов:
-o— выбрать формат вывода (table, text, json, cyclonedx, spdx, spdx-json).-q— тихий режим, подавляет дополнительную служебную информацию.--scope— ограничить область сканирования (например,all-layers,squashed).
Как интерпретировать результаты
Каждая запись показывает: тип пакета (OS-пакет, язык), имя и версию. Если версия не найдена или пакет частично обнаружен — Syft пометит это. SBOM — это снимок состояния образа в момент сканирования; для постоянной видимости используйте регулярные сканы в CI.
Поддерживаемые типы пакетов
Syft покрывает широкий спектр форматов и экосистем:
- OS-пакеты:
APK(Alpine),DEB(Debian/Ubuntu),RPM(Fedora/CentOS/RHEL) - Распознавание дистрибутивов: Alpine, CentOS, Debian, RHEL и их производные
- Языковые экосистемы: Go modules, Java (
JAR,WAR,EAR), Node.js (npm, Yarn), Python (wheels, eggs), Ruby (bundler/gems) - Другие форматы: файлы сценариев, бинарные артефакты и пакеты локальных менеджеров
Даже если Syft не покрывает конкретный язык или менеджер, ОС-уровневое сканирование останется полезным: многие приложения зависят от системных библиотек и пакетов.
Изменение формата вывода
По умолчанию Syft выводит table. Альтернативы:
text— человекочитаемый список с полямиVersionиTypejson— структурированный JSON (удобно для автоматизации)cyclonedx— стандарт CycloneDX в XMLspdx/spdx-json— форматы SPDX
Пример: сохранить JSON-результат в файл и передать в сканер уязвимостей:
syft packages alpine:latest -o json > alpine-packages.jsonCycloneDX и SPDX упрощают интеграцию в CI/CD и совместную работу с экосистемой SBOM-инструментов.

Syft хорошо интегрируется с Grype — инструментом Anchore для поиска уязвимостей. Передайте JSON в Grype:
syft packages example-image:latest -o json > sbom.json
grype sbom:./sbom.jsonGrype сопоставит список пакетов с индексом известных уязвимостей и выделит проблемные пакеты.
Использование других источников образов
Syft поддерживает не только публичные Docker-репозитории. Поддерживаются:
- любые OCI-совместимые образы по тегу в регистре
- локальные tar-архивы образов
- директории и произвольные файловые системы (scheme
dir:)
Пример работы с локальным архивом:
docker image save my-image:latest > my-image.tar
syft packages ./my-image.tarДля приватных регистров Syft использует ваши существующие Docker-учётные данные в ~/.docker/config.json. Пример структуры файла конфигурации (без реальных паролей):
{
"auths": {
"registry.example.com": {
"auth": "BASE64_ENCODED_AUTH"
}
}
}Чтобы сканировать директорию на хосте, указывайте схему dir: — в противном случае Syft попытается интерпретировать путь как тег образа:
syft packages dir:/usr/binКогда Syft может не сработать
Важно понимать ограничения и случаи, где Syft даёт неполную картину:
- Упакованные или самодельные бинарные форматы без метаданных: если бинарник не содержит информации о версиях или пакетном менеджере, Syft не всегда сможет идентифицировать компонент.
- Приложения с динамической загрузкой модулей из сети при запуске: SBOM отражает содержимое образа, но не внешние зависимости, подгружаемые в рантайме.
- Частично повреждённые/зашифрованные слои: при ошибках распаковки Syft может пропустить файлы.
- Контейнеры с нестандартными местами установки: если ПО установлено в нестандартную структуру, Syft может не учитывать его.
Рекомендация: комбинируйте Syft с инструментами статического анализа, динамического тестирования и запросами к сборочным артефактам (build-time manifests) для более полной картины.
Альтернативные подходы и инструменты
- Trivy — универсальный сканер уязвимостей и SBOM, удобен для быстрой проверки.
- Grype — поисковик уязвимостей, работает с SBOM от Syft.
- Встроенные сборочные артефакты CI (например, build manifests) — иногда точнее, если ваша сборка уже ведёт учёт зависимостей.
Выбор зависит от целей: если нужна фокусированная генерация SBOM, Syft хорош. Для одновременного поиска уязвимостей и простоты можно использовать Trivy.
Ментальные модели и эвристики
- SBOM = снимок состояния образа в момент сборки. Для непрерывного контроля — автоматизируйте генерацию в CI.
- «Минимальная база = меньшая поверхность атаки.» Если множество пакетов не используется, рассмотрите минимальный базовый образ.
- «SBOM + CVE DB = приоритеты обновлений.» Конвертируйте SBOM в отчёт уязвимостей и сначала обновляйте пакеты с высоким риском.
Рольовые чек-листы
Для удобства добавлю короткие чек-листы по ролям:
DevOps / SRE
- Включить Syft в pipeline сборки образа
- Сохранять SBOM как артефакт сборки
- Автоматически запускать Grype/Trivy по SBOM
Разработчик
- Понимать, какие зависимости попадают в образ
- Уменьшать непомерные зависимости
- Обновлять зависимые библиотеки при уведомлении безопасности
Команда безопасности
- Нормировать формат SBOM (JSON/CycloneDX/SPDX)
- Определять SLA на обработку критичных уязвимостей
- Аудитировать SBOM и CI-правила
Плейбук: добавить Syft в CI (пример для GitHub Actions)
Простейший пример job’а в GitHub Actions, который генерирует SBOM и загрузит артефакт:
name: sbom
on:
push:
paths:
- 'Dockerfile'
jobs:
generate-sbom:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Build image
run: docker build -t example-image:latest .
- name: Install syft
run: curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
- name: Generate SBOM
run: |
syft packages example-image:latest -o cyclonedx > sbom-cyclonedx.xml
- name: Upload SBOM
uses: actions/upload-artifact@v3
with:
name: sbom
path: sbom-cyclonedx.xmlКритерии приёмки
- CI создаёт SBOM на каждом билде образа
- SBOM хранится как артефакт и доступен для аудита
- По SBOM автоматически запускается проверка уязвимостей
Инцидентный план: если найдены уязвимости
- Классифицировать уязвимости по критичности и эксплуатируемости.
- Найти затронутые образы/сервисы и отследить, где они развернуты.
- Приоритетно обновить пакеты или заменить образ на новую сборку с исправлениями.
- Прогнать тесты и регрессии, пересобрать и задеплоить обновлённый образ.
- Сохранить SBOM новой версии и закрыть инцидент с записью действий.
Тесты и критерии приёмки SBOM-процесса
- SBOM должен покрывать все произведённые образы в релизном пайплайне.
- Формат SBOM соответствует выбранной политике (JSON / CycloneDX / SPDX).
- SBOM успешно конвертируется и обрабатывается системой поиска уязвимостей.
- При изменениях зависимостей CI уведомляет ответственную группу.
Совместимость и замечания по миграции
- Syft совместим с большинством современных дистрибутивов Linux и форматов пакетов.
- При миграции с других решений проверьте сопоставление полей SBOM (название пакета, версия, тип) между инструментами.
- Стандарты CycloneDX и SPDX обеспечивают лучшую переносимость между системами.
Безопасность и конфиденциальность данных
SBOM описывает содержимое образа, но не должен содержать секреты (ключи, пароли). Убедитесь, что при генерации не включаются файлы с чувствительной информацией. Храните SBOM-артефакты в защищённых хранилищах и ограничивайте доступ для тех, кто не обязан иметь доступ.
Когда SBOM недостаточно
SBOM — важный компонент прозрачности, но не заменяет следующие практики:
- Динамическое тестирование и Fuzzing
- Статический анализ кода
- Проактивные обновления зависимостей
Используйте SBOM как часть более широкой стратегии безопасного конструирования образов.
Заключение
Syft — удобный инструмент для генерации SBOM, пригодный для автоматизации в CI/CD. С его помощью вы быстро получите список пакетов, подходящий для последующей оценки уязвимостей и аудита. Комбинируйте Syft с Grype или другими решениями поиска уязвимостей и внедряйте регулярные проверки в процессы сборки и релиза.
Краткие рекомендации:
- Генерируйте SBOM на каждом билде образа и храните как артефакт.
- Выбирайте формат (JSON/CycloneDX/SPDX) в зависимости от интеграций.
- Автоматизируйте анализ SBOM на уязвимости и назначьте ответственных за реакцию.
Важно: SBOM даёт видимость, но только совместные процессы разработки, обновления и мониторинга приводят к реальному снижению рисков безопасности.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone