Гид по технологиям

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

7 min read Контейнеры Обновлено 11 Dec 2025
Syft: генерация SBOM для контейнеров
Syft: генерация SBOM для контейнеров

Иллюстрация талисмана Syft

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: список команд и примеры

Сканирование образа

Основная команда для извлечения пакетов — syft packages. Передайте тег образа или путь к архиву:

syft packages alpine:latest

Syft скачает образ (если нужен регистр), просканирует файловую систему и выведет список найденных пакетов в табличном виде: имя пакета, версия, тип.

Скриншот вывода Syft с табличным списком пакетов

Для минимальных базовых образов (например, 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 и Type
  • json — структурированный JSON (удобно для автоматизации)
  • cyclonedx — стандарт CycloneDX в XML
  • spdx / spdx-json — форматы SPDX

Пример: сохранить JSON-результат в файл и передать в сканер уязвимостей:

syft packages alpine:latest -o json > alpine-packages.json

CycloneDX и SPDX упрощают интеграцию в CI/CD и совместную работу с экосистемой SBOM-инструментов.

Скриншот экспорта SBOM в формате JSON/CycloneDX

Syft хорошо интегрируется с Grype — инструментом Anchore для поиска уязвимостей. Передайте JSON в Grype:

syft packages example-image:latest -o json > sbom.json
grype sbom:./sbom.json

Grype сопоставит список пакетов с индексом известных уязвимостей и выделит проблемные пакеты.

Использование других источников образов

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 автоматически запускается проверка уязвимостей

Инцидентный план: если найдены уязвимости

  1. Классифицировать уязвимости по критичности и эксплуатируемости.
  2. Найти затронутые образы/сервисы и отследить, где они развернуты.
  3. Приоритетно обновить пакеты или заменить образ на новую сборку с исправлениями.
  4. Прогнать тесты и регрессии, пересобрать и задеплоить обновлённый образ.
  5. Сохранить 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 даёт видимость, но только совместные процессы разработки, обновления и мониторинга приводят к реальному снижению рисков безопасности.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство