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

Grype — легковесный CLI-инструмент для поиска уязвимостей в образах контейнеров и на файловых системах. Он использует локальную базу уязвимостей, поддерживает SBOM от Syft и подходит для интеграции в CI. Используйте Grype для быстрого обнаружения известных CVE и автоматизации проверки зависимостей.
Быстрые ссылки
- Установка Grype
- Базовое сканирование
- Сканирование файловых систем
- Фильтрация уязвимостей
- Игнорирование уязвимостей
- Работа с SBOM
- Настройка форматов вывода
- База уязвимостей
- Дополнительно: стратегии и чек-листы
- Краткое резюме
Введение
Grype — это проект с открытым исходным кодом для сканирования уязвимостей в образах контейнеров и директориях файловой системы. Разработан Anchore и поставляется в виде автономного бинарного файла. Его удобно использовать для быстрой оценки рисков в артефактах перед деплоем.
Причины появления уязвимостей в вашем софте обычно следующие: устаревшие пакеты ОС, уязвимые зависимости языков программирования и небезопасные базовые образы. Регулярное сканирование позволяет выявлять проблемы раньше, чем ими воспользуются злоумышленники.
Установка Grype
Grype распространяется как предварительно скомпилированный бинарный файл в форматах deb, rpm, исходники для Linux и для macOS. Последнюю версию можно скачать с GitHub и установить через менеджер пакетов или просто скопировать бинарник в каталог из PATH.
Для автоматической установки доступен инсталляционный скрипт:
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/binПроверьте установку, запустив команду grype. Вы увидите доступную справку по командам и опциям.
Важно: первая загрузка базы уязвимостей произойдет при первом запуске и может занять время и трафик.
Базовое сканирование
В простейшем виде Grype принимает один аргумент — образ контейнера или путь к файловой системе, который нужно просканировать. Для сканирования образа укажите его тег в реестре. Grype использует доступные Docker-учётные данные для загрузки образов из Docker Hub и приватных реестров.
Примеры:
grype alpine:latestДля сканирования экспортированного архива образа Docker:
grype saved-image.tarПри первом запуске Grype скачает локальную базу уязвимостей. В настоящее время её размер составляет примерно 90 МБ. После загрузки базы Grype скачает образ, проиндексирует программное обеспечение внутри него и сопоставит найденные пакеты с известными CVE.

Результат отображается в табличном виде в терминале. Каждая запись включает идентификатор CVE, имя уязвимого пакета и уровень серьёзности. Если проблема исправлена в более поздней версии, в колонке FIXED-IN будет указана версия патча. Это помогает понять, можно ли устранить проблему простым обновлением через пакетный менеджер.
Grype поддерживает пакеты основных дистрибутивов Linux, а также экосистемы зависимостей: Ruby Gems, npm и yarn, Python Eggs, Wheels и Poetry, Java-модули в форматах JAR, WAR, EAR, JPI и HPI.
Сканирование файловых систем
Grype умеет сканировать локальные пути на файловой системе. Это удобно для обнаружения уязвимостей в репозиториях исходного кода до сборки образа. Для этого укажите схему dir:
grype dir:/example-dirGrype рекурсивно просканирует совместимые файлы из указанной директории, индексирует их и сверит зависимости с базой уязвимостей.

Сканирование файловой системы возвращает те же типы уязвимостей, что и сканирование образов. При большом дереве директорий процесс может занять несколько минут.
Фильтрация уязвимостей
Grype поддерживает параметры фильтрации для сужения отчёта до релевантных записей:
--only-fixed— показывать только уязвимости, которые уже исправлены в более поздних релизах пакета.--fail-on high— завершать выполнение с кодом ошибки, если найдена уязвимость уровня high. Вместо high можно использовать critical, high, medium или low.
Эти параметры полезны для CI: например, задать порог, при котором сборка будет провалена.
Игнорирование уязвимостей
Если вы хотите скрыть ложные срабатывания или известные, но принятые риски, создайте конфигурационный файл Grype в формате YAML и добавьте правила игнорирования.
Пример простого файла .grype.yaml в рабочем каталоге, игнорирующего конкретный CVE:
ignore:
- vulnerability: CVE-2021-12345Пример файла, игнорирующего все проблемы для пакетов типа npm:
ignore:
- package:
type: npmФайлы конфигурации поддерживаются по пути в рабочем каталоге .grype.yaml или .grype/config.yaml. Также поддерживается глобальный файл ~/.grype.yaml. При запуске Grype объединит локальную конфигурацию с глобальной.
Если уязвимость проигнорирована, она не влияет на код возврата Grype. В JSON-отчёте такие совпадения будут перемещены в поле ignoredMatches, а табличный вывод в терминале полностью исключит их. Рекомендуется документировать причины игнорирования, чтобы команда понимала оправдания принятого риска.
Важно: игнорирование должно сопровождаться оценкой риска и сроками переоценки.
Работа с SBOM
Grype совместим с SBOM (bill of materials), сгенерированными Syft, другим проектом Anchore. Syft индексирует образ и создаёт список зависимостей, который затем можно использовать для более детального анализа.
Создание SBOM в формате JSON с помощью Syft:
syft alpine:latest -o json > alpine-sbom.jsonЗапуск Grype по SBOM:
grype sbom:/alpine-sbom.jsonПри таком подходе вы анализируете именно те компоненты, которые были зафиксированы в SBOM. Это удобно, если вы уже проводили аудит зависимостей и хотите отслеживать появление новых проблем без повторного индексирования образа.
Настройка форматов вывода
Grype предоставляет четыре основных формата вывода, которые можно выбрать через флаг -o:
- table — человекочитаемая табличная форма по умолчанию.
- json — подробный JSON-отчёт, подходящий для хранения, сравнения и CI-артефактов.
- cyclonedx — совместимый с CycloneDX XML-формат для интеграции с инструментами SBOM.
- template — гибкий формат на основе Go-шаблона, позволяющий формировать произвольные отчёты.
Пример использования шаблона из файла:
grype alpine:latest -o output-template.tmplФайл шаблона должен использовать синтаксис Go templates и переменные, которые предоставляет Grype. На их основе можно строить HTML-страницы, Markdown-отчёты, CSV или нестандартные JSON-структуры.
База уязвимостей
База уязвимостей Grype хранит сведения обо всех известных уязвимостях, которые использует сканнер. После загрузки кэш будет переиспользован до тех пор, пока не появится обновление.
Иногда потребуется принудительно скачать базу, например для подготовки air-gapped сервера. Для этого используйте команды:
grype db check
grype db updateЕсли вы хотите отключить автоматические проверки обновлений базы, установите переменную окружения в вашей оболочке:
export GRYPE_DB_AUTO_UPDATE=falseПосле загрузки базы сканирование работает офлайн.
Когда Grype не подходит
- Вам нужна централизованная политика с расширяемыми плагинами и сложными правилами приёма — для этого больше подходит Anchore Engine.
- Нужна глубокая динамическая проверка приложения на runtime или SCA в коде — Grype ориентирован на статический поиск известных уязвимостей по базе, а не на динамическое тестирование.
- Требуется сканирование бинарных артефактов нестандартных форматов, которые не поддерживаются Grype.
Альтернативы и где их применять
- Anchore Engine — для централизованной политики безопасности и интеграции в корпоративные деплои.
- Trivy — тоже легковесный сканер, часто выбирают за простоту и скорость. Подходит, если важна минимальная конфигурация.
- Snyk, Dependabot, WhiteSource — коммерческие решения с фокусом на разработку и автоматическое исправление зависимостей.
Выбор зависит от требований: скорость, точность, интеграция в CI, централизованное управление политиками и поддерживаемые форматы.
Ментальные модели и эвристики
- «Патч или компенсирующий контроль» — если уязвимость можно закрыть обновлением, делайте это; иначе применяйте компенсирующие меры (ограничение доступа, WAF, изоляция).
- «SBOM как контракт» — используйте SBOM для фиксации состава артефакта и отслеживайте изменения между релизами с помощью Grype.
- «Fail fast in CI» — конфигурируйте пороги уровня серьёзности для автоматического фейла, чтобы не деплоить критические уязвимости.
Факт-бокс
- Форматы пакетов: apt/rpm, npm, yarn, RubyGems, Python Wheels/Poetry, Java (JAR/WAR/EAR/JPI/HPI)
- Примерный размер базы при первом скачивании: ~90 МБ
- Основные форматы вывода: table, json, cyclonedx, template
- Поддержка SBOM: Syft JSON
Роли и чек-листы
DevOps
- Интегрировать Grype в pipeline сборки и релиза.
- Настроить
--fail-onпо порогу, согласованному с политикой безопасности. - Обеспечить кэширование базы в CI-артефакт для ускорения.
Разработчик
- Запускать локальные сканирования перед PR.
- Документировать и обсуждать игнорируемые CVE в PR.
- Обновлять зависимости и проверять, решается ли CVE простым апдейтом.
Команда безопасности
- Определять пороги severity для CI.
- Проводить регулярные ревью игнорируемых уязвимостей.
- Следить за изменениями в базе уязвимостей и за политиками коррекции.
Пошаговый SOP для CI
- На этапе сборки образа запускать
syftдля генерации SBOM в JSON. - Запускать Grype по SBOM:
grype sbom:/path/to/sbom.json -o json > grype-report.json. - Разбирать
grype-report.jsonи применять правила: если есть critical или high и политика требует фейла, завершать сборку с ошибкой. - Сохранять JSON-отчёт как артефакт сборки для последующего анализа.
- Внести автоматическое уведомление в канал оповещений в случае критических находок.
Пример простого шага в CI для fail-on:
grype image:tag --fail-on high -o json > report.json || exit 1Критерии приёмки
- Все критические уязвимости устранены или имеют документированное и одобренное отклонение.
- Для high-уязвимостей определён план исправления в течение оговорённых SLA.
- SBOM генерируется автоматически при сборке и используется для проверки.
- Отчёты Grype сохраняются как артефакты сборки минимум за 30 дней.
Тестовые случаи и приёмка
- Сканирование образа с известной уязвимостью возвращает CVE в отчёте.
- Параметр
--only-fixedфильтрует только фиксы. - Конфигурация игнорирования в
.grype.yamlисключает CVE из табличного вывода. - Использование SBOM и прямое сканирование образа даёт согласованные результаты по ключевым пакетам.
Шаблоны команд и быстрый перечень
- Сканирование образа:
grype alpine:latest - Сканирование архива:
grype saved-image.tar - Сканирование директории:
grype dir:/path/to/project - SBOM-скан:
grype sbom:/path/to/sbom.json - Обновление базы:
grype db update - Использование шаблона вывода:
grype image:tag -o report.tmpl
План реагирования и отката
- Идентифицировать CVE и оценить воздействие на сервисы.
- Если доступен патч, подготовить релиз с обновлением зависимости.
- Если патч отсутствует или риск принят, задокументировать исключение с датой пересмотра.
- Развернуть исправление в canary, мониторить метрики и логи.
- При проблемах с исправлением — откатить релиз и применить временные меры (firewall, ограничение соединений).
Когда доверять результатам и когда дополнительно проверять
Grype надёжно сопоставляет зависимости с известными CVE, но бывают ложные срабатывания и несовпадения версий из-за упаковки. Всегда проверяйте контекст: реально ли скомпилированный артефакт использует уязвимый код, или пакет тестовый/подменённый. Для критичных находок полезно провести ручной аудит или динамическое тестирование.
Краткое резюме
Grype — удобный инструмент для быстрой автоматической проверки образов контейнеров и файловых систем на известные уязвимости. Он прост в установке, поддерживает SBOM от Syft и хорошо подходит для интеграции в CI/CD. Для централизованных политик и расширяемой автоматизации рассмотрите Anchore Engine, а для очень быстрых проверок — Trivy.
Важно: внедряйте сканирование как часть CI и имейте процесс обработки найденных проблем, включая документирование игнорируемых уязвимостей и план их переоценки.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента