Как использовать команду docker scout compare для анализа различий между образами

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь эффективно использовать команду docker scout compare для анализа различий между двумя Docker-образами. Этот процесс является важным для понимания изменений в уязвимостях, пакетах и других компонентах образа между разными версиями или сборками.

С помощью практических упражнений вы изучите сравнение образов с настройками по умолчанию, игнорирование уязвимостей базового образа, фильтрацию результатов по уровню серьезности и типу пакета, а также создание отчета в формате markdown о результатах сравнения. К концу этого практического занятия вы будете свободно использовать команду docker scout compare для получения ценной информации о безопасности и составе ваших контейнерных образов.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/ls -.-> lab-555200{{"Как использовать команду docker scout compare для анализа различий между образами"}} docker/pull -.-> lab-555200{{"Как использовать команду docker scout compare для анализа различий между образами"}} docker/images -.-> lab-555200{{"Как использовать команду docker scout compare для анализа различий между образами"}} docker/build -.-> lab-555200{{"Как использовать команду docker scout compare для анализа различий между образами"}} end

Сравнение двух образов с настройками по умолчанию

На этом этапе вы научитесь сравнивать два Docker-образа с помощью инструмента для сканирования на уязвимости. Сравнение образов является важным для выявления угроз безопасности и понимания различий между разными версиями или сборками ваших контейнерных образов. Для этого мы будем использовать инструмент под названием trivy. trivy - это простой и комплексный сканер уязвимостей для контейнеров и других артефактов.

Сначала установим trivy. Поскольку trivy не предустановлен в среде LabEx, вам нужно скачать и установить его.

sudo apt-get update
sudo apt-get install -y wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) stable main" | sudo tee /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install -y trivy

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

Теперь, когда trivy установлен, давайте загрузим Docker-образы, которые мы хотим сравнить. Мы сравним две разные версии образа ubuntu: ubuntu:20.04 и ubuntu:22.04.

docker pull ubuntu:20.04
docker pull ubuntu:22.04

Эти команды загружают указанные версии образа ubuntu из Docker Hub. Вы должны увидеть вывод, показывающий ход загрузки и успешное скачивание образов.

Теперь мы можем использовать trivy для сравнения этих двух образов. Базовая команда для сравнения двух образов - это trivy image --diff-image [image1] [image2].

trivy image --diff-image ubuntu:20.04 ubuntu:22.04

Эта команда проанализирует как ubuntu:20.04, так и ubuntu:22.04 и отобразит различия в найденных уязвимостях между этими двумя образами. Вывод покажет уязвимости, присутствующие в одном образе, но отсутствующие в другом, или уязвимости с разной степенью серьезности. Это поможет вам понять, как обновление или изменение версий образов может повлиять на вашу безопасность.

Вывод будет содержать список уязвимостей, категорированных по степени серьезности (UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL). Он покажет уязвимости, добавленные во втором образе (ubuntu:22.04 в данном случае) по сравнению с первым (ubuntu:20.04), а также уязвимости, которые были удалены.

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

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

Для демонстрации этого сначала создадим простой Dockerfile, который использует ubuntu:20.04 в качестве базового образа и добавляет простой файл.

Перейдите в директорию проекта:

cd ~/project

Создайте файл с именем Dockerfile с помощью nano:

nano Dockerfile

Вставьте следующее содержимое в Dockerfile:

FROM ubuntu:20.04
RUN echo "This is a test file" >/app/test.txt

Сохраните файл и выйдите из nano (Ctrl+X, Y, Enter).

Этот Dockerfile очень простой. Он использует образ ubuntu:20.04 и затем выполняет команду для создания файла с именем test.txt в директории /app.

Теперь создадим Docker-образ на основе этого Dockerfile. Мы пометим его как my-ubuntu-app:latest.

docker build -t my-ubuntu-app:latest .

Команда docker build создает образ на основе Dockerfile. Флаг -t my-ubuntu-app:latest помечает образ именем my-ubuntu-app и тегом latest. Точка в конце указывает, что Dockerfile находится в текущей директории. Вы должны увидеть вывод, показывающий процесс сборки и успешное создание образа.

Теперь у нас есть два образа: ubuntu:20.04 (базовый образ) и my-ubuntu-app:latest (образ, созданный на основе базового образа). Мы можем сравнить my-ubuntu-app:latest с ubuntu:20.04 и игнорировать уязвимости, которые уже присутствуют в ubuntu:20.04. Это покажет нам только уязвимости, введенные изменениями в нашем Dockerfile.

Для этого мы используем флаг --ignore-base с командой trivy image.

trivy image --ignore-base --diff-image ubuntu:20.04 my-ubuntu-app:latest

Эта команда сравнивает my-ubuntu-app:latest с ubuntu:20.04, но отображает только уязвимости, присутствующие в my-ubuntu-app:latest и отсутствующие в ubuntu:20.04. Поскольку наш Dockerfile только добавил простой файл и не установил никаких новых пакетов, вы должны увидеть очень мало или вообще не увидеть новых уязвимостей по сравнению с выводом предыдущего этапа. Это демонстрирует, как флаг --ignore-base помогает сосредоточиться на безопасности вашего приложения.

Сравнение образов с фильтрацией по уровню серьезности и типу пакета

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

Сравним снова ubuntu:20.04 и ubuntu:22.04, но на этот раз отфильтруем результаты так, чтобы показать только уязвимости с уровнем серьезности HIGH или CRITICAL. Это полезно, когда вы хотите приоритизировать исправление наиболее серьезных уязвимостей.

Мы используем флаг --severity, чтобы указать минимальный уровень серьезности для отображения. Вы можете указать список уровней серьезности, разделенных запятыми.

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --severity HIGH,CRITICAL

Эта команда сравнит два образа ubuntu и отобразит только уязвимости, классифицированные как HIGH или CRITICAL в любом из образов. Вы заметите, что вывод намного короче, чем при сравнении по умолчанию, так как он исключает уязвимости с более низким уровнем серьезности (UNKNOWN, LOW, MEDIUM).

Помимо фильтрации по уровню серьезности, вы также можете фильтровать по типу пакета, в котором была обнаружена уязвимость. trivy может сканировать на уязвимости в пакетах операционной системы (таких, как установленные с помощью apt, yum и т.д.) и зависимостях приложения (таких, как библиотеки, используемые вашим кодом).

Сравним образовы еще раз, но на этот раз будем искать только уязвимости в пакетах операционной системы. Для этого используем флаг --vuln-type.

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --vuln-type os

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

Вы также можете комбинировать эти фильтры. Например, чтобы увидеть только уязвимости уровня HIGH или CRITICAL в пакетах операционной системы:

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --severity HIGH,CRITICAL --vuln-type os

Эта команда дает более детальное представление о наиболее серьезных уязвимостях в слое операционной системы ваших образов. Фильтрация помогает управлять выводом и эффективно приоритизировать усилия по обеспечению безопасности.

Сравнение образов и создание отчета в формате Markdown

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

Создание отчета в формате Markdown полезно, так как Markdown - это легковесный язык разметки, который легко читается и может быть легко преобразован в другие форматы, такие как HTML или PDF.

Для создания отчета в формате Markdown при сравнении образов мы используем флаг --format и указываем markdown. Также мы перенаправляем вывод в файл с помощью оператора >.

Сравним снова ubuntu:20.04 и ubuntu:22.04 и сохраним вывод в файл Markdown с именем comparison_report.md в директории ~/project.

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --format markdown > ~/project/comparison_report.md

Эта команда выполняет то же сравнение, что и на первом этапе, но форматирует вывод в виде Markdown и сохраняет его в указанный файл. На этот раз вы не увидите вывод прямо в терминале.

После завершения команды вы можете просмотреть сгенерированный файл Markdown с помощью cat или nano.

cat ~/project/comparison_report.md

Эта команда отобразит содержимое файла comparison_report.md в вашем терминале. Вы должны увидеть результаты сравнения уязвимостей, отформатированные с использованием синтаксиса Markdown, включая заголовки, списки и таблицы.

Вы также можете открыть файл с помощью nano для просмотра в текстовом редакторе:

nano ~/project/comparison_report_markdown.md

Не забудьте выйти из nano после просмотра файла (Ctrl+X).

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

Резюме

В этом практическом занятии вы научились использовать инструмент trivy для сравнения двух Docker-образов. Вы начали с установки trivy в среде LabEx, что включало добавление репозитория trivy и установку пакета с помощью apt. После установки вы загрузили две разные версии образа ubuntu, ubuntu:20.04 и ubuntu:22.04, с Docker Hub. Наконец, вы выполнили базовую команду trivy image --diff-image для сравнения этих двух образов и анализа различий в их уязвимостях и пакетах.