Сканирование образов Docker и анализ уязвимостей

🕒 3 мин.

В этой статье описаны инструменты для сканирования образов Docker на уязвимости: docker scan и trivy. Но основное внимание уделено именно trivy.

docker scan

Выявлять уязвимости в Docker-образах можно с помощью команды docker scan. Это инструмент от Docker, который интегрирован с Snyk (система анализа уязвимостей). Данная система:

  • Сканирует образ на наличие CVE (уязвимостей);
  • Показывает уровень опасности;
  • Предлагает пути исправления;
  • Работает как с локальными образами, так и с образами из Docker Hub.

Устанавливается этот инструмент как дополнительный плагин Docker:

$ sudo apt install docker-scan-plugin

Но для работы требует авторизацию в Docker Hub и использование двух-факторной авторизации. Поэтому мы будем использовать другой инструмент.

trivy

Можно использовать альтернативу — инструмент trivy. Его можно установить на хост с помощью apt, но я буду запускать официальный контейнер trivy из Docker Hub.

Про trivy можете почитать здесь — https://github.com/aquasecurity/trivy. Если вкратце то это сканер уязвимостей и misconfigurations (неправильной конфигурации, которая может привести к взлому). Trivy умеет сканировать не только Docker контейнеры, а также Kubernetes, образы виртуальных машин, репозитории кода и другое. Официальный сайт — https://trivy.dev/.

Напомню, что у меня есть 4 файла из предыдущих тем [Docker Compose — установка и базовое использование] и [Продвинутые инструкции в Dockerfile]:

$ ls -l
итого 16
-rw-r--r-- 1 alex alex 1220 янв 29 17:35 app.py
-rw-r--r-- 1 alex alex 1401 янв 29 17:05 docker-compose.yml
-rw-r--r-- 1 alex alex  438 янв 29 17:35 Dockerfile
-rw-r--r-- 1 alex alex   48 янв 15 12:44 requirements.txt

И с помощью Dockerfile у меня создался образ docker_compose-web:latest:

$ docker images | grep web
WARNING: This output is designed for human readability. For machine-readable output, please use --format.
docker_compose-web:latest   a9f3c3ba5e9e        224MB           55MB

Вот так с помощью trivy мы можем просканировать этот образ:

$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy \
 image docker_compose-web:latest
  • /var/run/docker.sock — Это сокет, через который Docker общается с Docker демоном (движком). Он находится на хосте и даёт доступ к Docker API. Когда мы пишем docker ps, отправляется запрос через этот сокет. Таким образом мы даём доступ контейнеру Trivy к этому сокету, чтобы он мог сканировать локальные образы.

По желанию, вы можете просканировать любой другой образ.

Вывод имеет формат таблицы с найденными уязвимостями и общей статистикой. Пример вывода не могу показать, так как он очень большой.

В моём случае было найденно:

  • в docker_compose-web:latest (debian 13.3) — 136 всего уязвимостей, из них 3 критических:
    • Total: 103 (UNKNOWN: 0, LOW: 51, MEDIUM: 41, HIGH: 8, CRITICAL: 3);
  • в Python (python-pkg) — 5 уязвимостей, из них 3 с высоким уровнем опасности:
    • Total: 5 (UNKNOWN: 0, LOW: 1, MEDIUM: 1, HIGH: 3, CRITICAL: 0).

В выводе можно почитать комментарий о каждой найденной уязвимости. Например, у меня была обнаружена уязвимость в openssl — CVE-2025-15467. Которая уже исправлена в более свежей версии (3.5.4-1~deb13u2). Возможно, если я обновлю образ, то эта уязвимость пропадёт.

Сравнение docker scan и trivy

Сравним docker scan и trivy.

  • docker scan
    • Это не самостоятельный сканер, а обёртка, которая отправляет информацию об образе в облачный сервис Snyk.
    • Требует интернет и авторизации в Docker Hub.
  • trivy
    • Это инструмент с открытым кодом, который работает локально.
    • База уязвимостей загружается на компьютер (~/.cache/trivy/db).
    • Анализирует образ полностью автономно, без отправки данных в облако.

Чем меньше образ, тем в нём меньше уязвимостей:

  • python:3.11-slim — основан на Debian и имеет больше уязвимостей;
  • python:3.11-alpine — основан на Alpine и имеет меньше уязвимостей.

Если понравилась статья, подпишись на мой канал в VK или Telegram.

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Отказаться
Политика конфиденциальности