Поиск по сайту:

Как использовать Trivy для поиска уязвимостей в контейнерах Docker


Сканирование Trivy проверяет базовый образ вашего Dockerfile, чтобы найти неустраненные уязвимости, которые унаследуют ваши контейнеры. Trivy также может просматривать пакеты операционной системы и зависимости исходного кода, добавленные через популярные менеджеры пакетов.

Trivy имеет три типа сканирования: контейнер, репозиторий Git и каталог файловой системы. В этой статье мы сосредоточимся на сканировании контейнеров. Документы Trivy предоставляют дополнительную информацию о том, как вы можете анализировать исходный код и его среду.

Установка Триви

Trivy доступен в большинстве популярных дистрибутивов Linux. Возможно, вам потребуется добавить репозиторий разработчика. Вы можете найти нужную ссылку для своего дистрибутива в документации Trivy.

Если вы предпочитаете использовать конкретную версию, вы можете загрузить двоичный файл со страницы релизов проекта на GitHub. Существует также сценарий автоматической установки, который загрузит соответствующий двоичный файл для вашей операционной системы.

Наконец, у Trivy появился собственный образ Docker, который можно использовать вместо установки на «голое железо»:

docker run --rm -v trivy-cache:/root/.cache/ -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:latest

Эта команда привязывает ваш каталог trivy-cache к пути кеша контейнера Trivy. Это повышает производительность, позволяя Trivy кэшировать данные вне Docker между сканированиями.

Сокет Docker вашего хоста также монтируется в контейнер. Это позволяет Trivy сканировать другие контейнеры, работающие на хосте. Теперь вы готовы приступить к поиску уязвимостей.

Первый забег

Контейнерный движок Trivy поддерживает локальные и удаленные образы. Он работает с Docker, Podman, экспортированными архивами изображений (docker save) и изображениями в реестрах, таких как Docker Hub и GitHub Container Registry.

Вы можете запустить базовое сканирование с помощью команды trivy image. Это принимает тег изображения.

trivy image my-image:latest

Trivy загрузит свою базу данных уязвимостей при первом запуске. База данных будет кэширована и повторно использована для будущих сканирований.

Результаты сканирования передаются прямо на ваш терминал. Сводка вверху показывает обнаруженную операционную систему контейнера и разбивку найденных уязвимостей по серьезности. В таблице представлен полный список проблем, включая библиотеку, в которой была обнаружена каждая из них, описание и идентификатор CVE, если он доступен.

Уменьшение шума

Trivy поддерживает несколько флагов, позволяющих настроить его вывод. По умолчанию будут отображаться все обнаруженные уязвимости, если отсутствуют флаги. Сюда могут входить уязвимости, которые не были исправлены в вышестоящем проекте.

Вы можете исключить неисправленные проблемы, добавив флаг --ignore-unfixed. Это уменьшает шум, скрывая проблемы, которые вы не сможете решить.

trivy image --ignore-unfixed my-image:latest

Иногда вы можете намеренно принять уязвимость. Не все проблемы одинаково влияют на все проекты. Если вы не пострадали или готовы рискнуть, Trivy позволит вам исключить определенные идентификаторы CVE из ваших сканирований.

Добавьте файл .trivyignore в свой рабочий каталог. Введите список идентификаторов CVE, по одному в каждой строке. Trivy найдет и использует файл при запуске сканирования. CVE, присутствующие в .trivyignore, не будут отображаться в результатах сканирования. Рекомендуется добавлять комментарий к каждому исключаемому CVE; это гарантирует, что другие участники будут проинформированы о том, почему риск был принят.

# .trivyignore
# This issue is not relevant to our usage
CVE-2021-1234

Фильтрация уязвимостей

Вы можете отфильтровать, чтобы показать уязвимости определенного типа, используя флаг --vuln-type. В качестве значения принимает либо library, либо os.

Использование library выявит проблемы, возникающие из-за зависимостей языков программирования. Параметр os ограничивает сканирование пакетами операционной системы.

Вы также можете фильтровать по серьезности уязвимости. Это поможет вам сосредоточиться на важных проблемах, скрывая относительно незначительные уязвимости. Передайте список уровней серьезности CVSS, разделенных запятыми, чтобы включить:

trivy image --severity MEDIUM,HIGH,CRITICAL my-image:latest

Теперь любые проблемы «низкой» серьезности будут исключены из отчета.

Trivy по умолчанию представляет собой визуальную таблицу, предназначенную для использования человеком в терминале. Вместо этого вы можете получить машинно-разборный JSON, добавив --format json.

Также есть поддержка настраиваемых стилей вывода с использованием шаблонов. Включено несколько шаблонов, таких как xml и html:

trivy image --format template @contrib/html.tpl -o scan.html my-image:latest

Это сканирование создаст отчет в формате HTML, сохраненный в scan.html. Графические отчеты быстрее читаются и ими легче делиться, особенно при обнаружении большого количества проблем.

Использование Trivy в CI

Вы можете легко включить Trivy в свои сценарии CI. Помните, что по умолчанию код выхода всегда равен 0, даже если обнаружены уязвимости. Добавьте флаг --exit-code 1, чтобы Trivy завершил работу с ненулевым кодом при наличии проблем.

У вас есть несколько вариантов включения Trivy в ваши сборки. Официальные шаблоны интеграции доступны для популярных поставщиков CI, включая GitHub, GitLab, Travis и CircleCI.

Когда вы создаете образы в своем конвейере, вы можете либо запустить Trivy для окончательного вывода сборки, либо использовать инструмент внутри контейнера. Многоэтапные сборки Docker позволяют ссылаться на образ Trivy и прерывать сборку в случае сбоя сканирования. Убедитесь, что вы используете режим filesystem вместо image, так как вы сканируете работающий контейнер изнутри.

COPY --from=aquasec/trivy:latest /usr/local/bin/trivy /usr/local/bin/trivy
RUN trivy filesystem --exit-code 1 --no-progress /

Обычно лучше всего запускать Trivy ближе к концу вашего Dockerfile, после того как будут установлены все программные зависимости. После этого запустите rm /usr/local/bin/trivy, чтобы уменьшить размер окончательного изображения.

Режим сервера

Trivy может работать в режиме клиент-сервер. Это перемещает базу данных уязвимостей на сервер, поэтому клиентам не нужно поддерживать свои собственные версии.

Бинарные файлы Trivy поставляются со встроенным режимом сервера. Запустите trivy server, чтобы запустить экземпляр сервера на вашем компьютере. Порт по умолчанию — 4594; вы можете изменить это, добавив --listen localhost:8080 и указав выбранный порт.

Сервер загрузит базу данных уязвимостей при запуске. Он будет проверять наличие обновлений в фоновом режиме и автоматически получать новые версии.

Вы подключаете Trivy-клиент к своему серверу с помощью trivy client:

trivy client --remote http://localhost:8080 image my-image:latest

Если вам нужна аутентификация, добавьте флаг --token в команды сервера и клиента. Сервер будет принимать новых клиентов только в том случае, если они представят правильный токен.

Краткое содержание

Использование Trivy для сканирования ваших контейнеров Docker поможет вам найти уязвимости до того, как они станут проблемой в рабочей среде. Вы можете быть более уверены в своих контейнерах, регулярно проверяя устаревшие пакеты ОС и зависимости от языка программирования.

Trivy получает свои списки уязвимостей из нескольких разных источников. Некоторые из этих источников предназначены только для некоммерческого использования, поэтому вам следует убедиться, что ваш проект соответствует требованиям, прежде чем добавлять Trivy в свои сборки.