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

Docker: исправление уязвимостей образов с помощью Trivy и Copa


Образы контейнеров Docker часто содержат уязвимости безопасности, унаследованные от базовых пакетов операционной системы. Вместо того чтобы пересобирать образы с нуля, вы можете использовать Trivy для сканирования уязвимостей и Copa для их прямого исправления. В этом руководстве показано, как выявлять и устранять уязвимости контейнеров в системах Ubuntu, Debian, RHEL, CentOS и Fedora с помощью этих двух мощных открытых инструментов.

В этом руководстве вы узнаете:

  • Как установить сканер уязвимостей Trivy на Ubuntu/Debian
  • Как установить инструмент для патчирования контейнеров Copa
  • Как сканировать образы Docker на наличие уязвимостей ОС
  • Как автоматически исправлять уязвимости контейнера
  • Как проверить, что исправленные изображения не содержат уязвимостей

Краткое содержание статьи: Сканируйте Docker-образы на наличие уязвимостей с помощью Trivy и автоматически исправляйте их с помощью Copa.

ШагКоманда/Действие
1. Сканировать изображение
sudo trivy image --vuln-type os --ignore-unfixed IMAGE_NAME
2. Экспортировать JSON-отчет
trivy image --vuln-type os --ignore-unfixed -f json -o report.json IMAGE_NAME
3. Запустить BuildKit
sudo docker run --detach --rm --privileged -p 127.0.0.1:8888:8888/tcp --name buildkitd --entrypoint buildkitd moby/buildkit:v0.11.4 --addr tcp://0.0.0.0:8888
4. Изображение патча
sudo copa patch -i IMAGE_NAME -r report.json -t patched -a tcp://0.0.0.0:8888

Шаг 1: Установите сканер уязвимостей Trivy

Trivy — это открытый сканер уязвимостей, разработанный компанией Aqua Security. Он обнаруживает уязвимости в пакетах ОС, зависимостях приложений и образах контейнеров.

Ubuntu/Debian

  1. Установите зависимости: Сначала установите пакеты wget и gnupg, необходимые для добавления репозитория:

    $ sudo apt-get install wget gnupg -y
  2. Добавьте GPG-ключ Trivy: Скачайте и добавьте ключ подписи репозитория Trivy:

    $ wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null
  3. Добавьте репозиторий Trivy: добавьте официальный репозиторий Trivy в свой список источников:

    $ echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
  4. Установите Trivy: обновите список пакетов и установите Trivy:

    $ sudo apt-get update
    $ sudo apt-get install trivy -y

RHEL/CentOS/Fedora

  1. Добавьте репозиторий Trivy: создайте файл репозитория Trivy:

    # sudo tee /etc/yum.repos.d/trivy.repo << 'EOF'
    [trivy]
    name=Trivy repository
    baseurl=https://aquasecurity.github.io/trivy-repo/rpm/releases/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://aquasecurity.github.io/trivy-repo/rpm/public.key
    EOF
  2. Установите Trivy: Используйте dnf или yum для установки:

    # sudo dnf install trivy -y

Проверьте установку, проверив версию:

$ trivy --version

Шаг 2: Установите утилиту Copa Patching

Copa (Copacetic) — это проект CNCF в стадии песочницы, который напрямую исправляет образы контейнеров без необходимости полной пересборки. Он использует отчёты об уязвимостях от сканеров, таких как Trivy, для применения обновлений безопасности. Copa распространяется как один исполняемый файл, который работает на всех дистрибутивах Linux.

  1. Скачать бинарный файл Copa: Получите предварительно скомпилированный бинарный файл на официальной странице релизов Copa на GitHub:

    $ wget https://github.com/project-copacetic/copacetic/releases/download/v0.9.0/copa_0.9.0_linux_amd64.tar.gz
  2. Распакуйте архив: Разархивируйте загруженный tar-файл:

    $ tar -xzf copa_0.9.0_linux_amd64.tar.gz
  3. Установите Copa: Переместите бинарный файл в ваш системный путь:

    $ sudo mv copa /usr/local/bin/
  4. Проверка установки: Подтвердите, что Copa установлена правильно:

    $ copa --version

Шаг 3: Сканирование образа контейнера на наличие уязвимостей

Прежде чем применять патчи, необходимо выявить уязвимости в вашем образе контейнера. В следующих шагах используется linuxconfig/instantprivacy в качестве примера — замените его на имя вашего собственного образа.

  1. Загрузите образ контейнера: Скачайте образ, который хотите просканировать:

    $ sudo docker pull linuxconfig/instantprivacy
  2. Сканирование на наличие уязвимостей: Запустите Trivy, чтобы проверить наличие уязвимостей на уровне ОС. Флаг --ignore-unfixed исключает уязвимости, для которых нет доступных исправлений:

    $ sudo trivy image --vuln-type os --ignore-unfixed linuxconfig/instantprivacy
  3. Экспорт отчета в формате JSON: Copa требует результаты сканирования в формате JSON:

    $ trivy image --vuln-type os --ignore-unfixed -f json -o instantprivacy.json linuxconfig/instantprivacy

Шаг 4: Обновление образа контейнера с помощью Copa

Copa использует BuildKit для применения исправлений к образам контейнеров.

  1. Запустить контейнер BuildKit: Запустите BuildKit как контейнер с привилегиями:

    $ sudo docker run --detach --rm --privileged \
      -p 127.0.0.1:8888:8888/tcp \
      --name buildkitd \
      --entrypoint buildkitd \
      moby/buildkit:v0.11.4 \
      --addr tcp://0.0.0.0:8888
  2. Проверьте, запущен ли BuildKit: Убедитесь, что контейнер запустился успешно:

    $ sudo docker ps

  3. Обновите образ контейнера: Используйте Copa для применения исправлений безопасности. Флаг -t указывает тег для обновленного образа:

    $ sudo copa patch \
      -i docker.io/linuxconfig/instantprivacy \
      -r instantprivacy.json \
      -t patched \
      -a tcp://0.0.0.0:8888

    Copa загружает обновления безопасности и создает новый слой образа с примененными исправлениями. Обновленный образ будет помечен как linuxconfig/instantprivacy:patched.

Шаг 5: Проверка исправленного изображения

  1. Просканируйте исправленное изображение: Убедитесь, что все уязвимости устранены:

    $ sudo trivy image --vuln-type os --ignore-unfixed linuxconfig/instantprivacy:patched
  2. Проверьте исправленное изображение: Убедитесь, что исправленное изображение работает правильно:

    $ sudo docker run --name=instantprivacy -d -p 8118:8118 linuxconfig/instantprivacy:patched
    $ export http_proxy="http://localhost:8118"
    $ curl api.ipify.org
    45.84.107.174
  3. Очистка: Остановите контейнер BuildKit после завершения:

    $ sudo docker stop buildkitd

Заключение

Вы успешно просканировали образ контейнера Docker на наличие уязвимостей с помощью Trivy и автоматически устранили их с помощью Copa. Этот подход быстрее, чем полная перестройка образов, и добавляет лишь один слой исправления, сохраняя структуру исходного образа. Для производственных сред интегрируйте эти инструменты в вашу CI/CD-пайплайн, чтобы автоматически сканировать и исправлять образы контейнеров перед развертыванием. Для получения дополнительной информации обратитесь к официальной документации Trivy и веб-сайту проекта Copa.

Часто задаваемые вопросы

  1. Какие типы уязвимостей может исправить Copa? Copa исправляет только уязвимости на уровне пакетов ОС (например, пакеты Debian, Ubuntu, Alpine или RHEL). Она не может исправлять зависимости на уровне приложений, такие как npm-пакеты, модули Python pip или модули Go. Для этого необходимо пересобрать приложение с обновлёнными зависимостями.
  2. Почему мне нужен BuildKit для запуска Copa? Copa использует возможности diff и merge BuildKit для создания нового слоя образа, содержащего только исправленные файлы. BuildKit работает как контейнер с привилегиями и обрабатывает низкоуровневую манипуляцию образами. Без BuildKit Copa не сможет применять патчи к файловой системе контейнера.
  3. Могу ли я патчить изображения из приватных реестров? Да, Copa поддерживает приватные реестры. Необходимо авторизоваться с помощью docker login перед запуском команды патча. Copa использует ваши учетные данные Docker для получения базового изображения и, при необходимости, отправки патченого результата.
  4. Что произойдет, если Copa не сможет исправить все уязвимости? Некоторые уязвимости могут еще не иметь доступных исправлений. Флаг --ignore-unfixed в Trivy исключает их из отчета. Copa исправит все, для чего есть доступные патчи. Запустите Trivy снова без --ignore-unfixed, чтобы увидеть все уязвимости, включая те, которые ожидают исправления.
  5. Как обновить Copa до последней версии? Скачайте последнюю версию с страницы релизов Copa на GitHub и замените бинарный файл в /usr/local/bin/. Проверьте текущую версию с помощью copa --version.