Как найти уязвимости в контейнерах и файлах с помощью Grype
Grype — это сканер уязвимостей с открытым исходным кодом, который находит слабые места в образах контейнеров и каталогах файловой системы. Grype разработан Anchore, но работает как отдельный двоичный файл, с которым легче разобраться, чем с Anchore Engine.
Известные уязвимости попадают в ваше программное обеспечение через устаревшие пакеты операционной системы, скомпрометированные зависимости языков программирования и небезопасные базовые образы. Активное сканирование ваших артефактов информирует вас о проблемах до того, как злоумышленники обнаружат их. Вот как можно использовать Grype для поиска проблем в вашем коде и контейнерах.
Установка Грайпа
Grype распространяется в виде предварительно скомпилированного бинарного файла в форматах deb
, rpm
, исходного кода для Linux и Mac. Вы можете получить последнюю версию с GitHub и установить ее с помощью диспетчера пакетов вашей системы или скопировав двоичный файл в папку на вашем пути. В качестве альтернативы используйте скрипт установки для автоматизации процесса:
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 извлечет образ Docker, каталогизирует в нем программное обеспечение и проанализирует известные уязвимости, присутствующие в базе данных.
Результаты отображаются в таблице в вашем терминале. Каждая уязвимость включает свой идентификатор CVE, имя уязвимого пакета и уровень серьезности. Когда проблема будет исправлена в более позднем выпуске, вы увидите номер версии этого обновления в столбце FIXED-IN
. Это поможет вам определить, можно ли легко устранить уязвимость с помощью простого обновления диспетчера пакетов.
Grype может работать с пакетами для всех самых популярных дистрибутивов Linux. Он также поддерживает пакеты Ruby Gems, NPM и Yarn, зависимости Python Eggs, Wheels и Poetry, а также модули Java в форматах JAR, WAR, EAR, JPI и HPI.
Сканирование файловых систем
Grype может сканировать пути файловой системы на вашем компьютере. Это позволяет обнаруживать уязвимости в репозиториях исходного кода до создания образа. Чтобы использовать эту функцию, укажите путь к каталогу со схемой dir:
:
grype dir:/example-dir
Grype будет искать совместимые файлы, вложенные в указанный корень каталога. Каждый найденный файл будет проиндексирован и проверен на наличие уязвимостей.
Сканирование файловой системы обнаруживает те же типы уязвимостей, что и сканирование образа контейнера. Сканирование может занять пару минут, если вы работаете с большим деревом каталогов.
Фильтрация уязвимостей
Поддерживаются два флага фильтрации, чтобы ограничить отчет только интересующими вас уязвимостями или вариантами решения:
--only-fixed
— показывать только те уязвимости, которые были исправлены в более позднем выпуске уязвимого пакета.--fail-on high
— немедленный выход с кодом ошибки при обнаружении уязвимостивысокого
уровня. Вы можете заменить любой поддерживаемый уровень ошибки (критический, высокий, средний или низкий) вместовысокий
.
Игнорирование уязвимостей
Уязвимости можно игнорировать, чтобы скрыть ложные срабатывания или проблемы, которые вы решили не решать, возможно, потому, что они не имеют отношения к использованию вами пакета.
Чтобы игнорировать уязвимость, вам нужно создать собственный файл конфигурации Grype в формате YAML. Добавьте CVE уязвимости в поле ignore
верхнего уровня:
ignore: - vulnerability: CVE-2021-12345
Поддерживаются и другие поля, например этот вариант для игнорирования всех проблем, связанных с пакетами NPM:
ignore: - package: type: npm
Сохраните файл конфигурации в .grype.yaml
или .grype/config.yaml
в своем рабочем каталоге. Он будет использоваться автоматически при следующем запуске сканирования Grype. Глобальный файл конфигурации ~/.grype.yaml
также поддерживается. Файл в вашем рабочем каталоге будет объединен с глобальным во время выполнения.
Уязвимости не повлияют на код выхода Grype, если их игнорировать. В отчете JSON они будут перемещены в отдельное поле ignoredMatches
, а в отчетах таблицы терминала они полностью исключены. Если вы игнорируете уязвимость, не забудьте задокументировать, почему она была принята, чтобы каждый участник понимал риск.
Использование SBOM
Grype может работать с SBOM, созданными Syft, еще одним проектом Anchore. Syft индексирует ваши образы контейнеров, чтобы создать список содержащихся в них зависимостей.
Используйте Syft для создания SBOM для вашего изображения в формате JSON:
syft alpine:latest -o json > alpine-sbom.json
Затем запустите сканирование Grype с помощью SBOM:
grype sbom:/alpine-sbom.json
Grype проверит указанный образ на наличие новых уязвимостей, возникающих из его списка материалов. Продолжайте использовать Grype с вашим SBOM для отслеживания возникающих проблем в зависимостях образов, которые вы уже проверили и проиндексировали.
Настройка вывода жалоб
Grype предоставляет четыре различных средства форматирования вывода, между которыми вы можете переключаться с помощью флага CLI -o
:
table
– удобочитаемая таблица по умолчанию для использования в терминале.json
— отчет в формате JSON, содержащий гораздо более полную информацию о каждой уязвимости, а также сведения о базе данных Grype, используемой для сканирования. Файлы JSON подходят для долгосрочного архивирования и сравнения или использования в качестве артефактов сборки CI.cyclonedx
— отчет, совместимый с CycloneDX, в формате XML, который можно использовать в других инструментах, поддерживающих SBOM и списки уязвимостей.шаблон
– этот расширенный модуль форматирования позволяет создавать собственные отчеты в произвольных форматах.
Средство форматирования template
принимает шаблон Go, который будет использоваться для отображения выходных данных отчета. Чтобы использовать этот форматтер, не указывайте его по имени — вместо этого передайте путь к файлу, содержащему ваш шаблон Go:
grype alpine:latest -o output-template.tmpl
Шаблон должен использовать синтаксис шаблонов Go для ссылки на переменные, предоставляемые Grype. Вы можете создать любой формат файла, который вам нужен, например HTML-страницу, файл Markdown или пользовательскую структуру JSON. В документации Grype есть пример создания CSV-файла из доступных переменных.
База данных уязвимостей
В базе данных уязвимостей хранится информация обо всех уязвимостях, известных Grype. После загрузки кешированная версия будет повторно использоваться до тех пор, пока не будет доступно обновление. Ручное взаимодействие с базой данных обычно не требуется.
В некоторых ситуациях может потребоваться принудительная загрузка базы данных. Это может быть связано с тем, что вы настраиваете изолированный сервер перед запуском сканирования. Используйте команды grype db check
и grype db update
, чтобы проверить и загрузить более новую версию базы данных.
Как только база данных будет доступна, сканирование будет работать, пока ваша система находится в автономном режиме. Вы можете отключить автоматические проверки обновлений базы данных Grype, установив для переменной среды GRYPE_DB_AUTO_UPDATE
значение false
в вашей оболочке.
Краткое содержание
Grype предупреждает вас об уязвимостях внутри ваших контейнеров и в вашей файловой системе. С отдельным бинарным файлом CLI начать работу проще, чем с полной установкой Anchore.
Если вам интересно, что выбрать, ценность Anchore заключается в его расширяемости и расширенных параметрах конфигурации. С Anchore Engine вы можете определить свои собственные наборы политик на основе шлюзов, триггеров и действий. Это позволяет точно адаптировать сканирование к конкретной среде. Grype обеспечивает более удобную работу, когда вам просто нужен список известных уязвимостей в вашем образе.
Что бы вы ни выбрали, применение той или иной формы активного сканирования уязвимостей будет держать вас в курсе слабых мест в вашей цепочке поставок программного обеспечения. Для полностью интегрированного подхода используйте Grype как часть конвейера непрерывной интеграции, чтобы получать уведомления о новых уязвимостях по мере фиксации кода.