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

В этой статье описаны инструменты для сканирования образов 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/ .

Напомню, что у меня есть 3 файла из предыдущих тем [[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 .