如何使用 docker scout compare 命令分析镜像差异

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何有效地使用 docker scout compare 命令来分析两个 Docker 镜像之间的差异。这个过程对于理解不同版本或构建中镜像的漏洞、软件包和其他组件的变化至关重要。

通过实践练习,你将探索如何使用默认设置比较镜像、忽略基础镜像的漏洞、按严重程度和软件包类型过滤结果,以及生成比较结果的 Markdown 报告。在本实验结束时,你将熟练掌握 docker scout compare 的使用,从而深入了解容器镜像的安全性和组成。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) 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.04ubuntu:22.04

docker pull ubuntu:20.04
docker pull ubuntu:22.04

这些命令会从 Docker Hub 拉取指定的 ubuntu 镜像版本。你应该会看到显示下载进度和镜像成功拉取的输出信息。

现在,我们可以使用 trivy 来比较这两个镜像。比较两个镜像的基本命令是 trivy image --diff-image [image1] [image2]

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

此命令将分析 ubuntu:20.04ubuntu:22.04 这两个镜像,并报告在这两个镜像中发现的漏洞差异。输出将显示一个镜像中存在而另一个镜像中不存在的漏洞,或者严重程度不同的漏洞。这有助于你了解升级或更改镜像版本可能会如何影响你的安全状况。

输出将按严重程度(UNKNOWN、LOW、MEDIUM、HIGH、CRITICAL)列出漏洞。它将显示与第一个镜像(在本例中为 ubuntu:20.04)相比,第二个镜像(ubuntu:22.04)中新增的漏洞以及已移除的漏洞。

比较镜像并忽略基础镜像的漏洞

在上一步中,我们比较了两个 ubuntu 镜像,并查看了漏洞方面的差异。有时,在比较镜像时,你可能更关注应用程序代码或依赖项引入的漏洞,而不是从基础镜像继承的漏洞。trivy 允许你忽略指定基础镜像中存在的漏洞。

为了演示这一点,让我们首先创建一个简单的 Dockerfile,它使用 ubuntu:20.04 作为基础镜像并添加一个简单的文件。

导航到你的项目目录:

cd ~/project

使用 nano 创建一个名为 Dockerfile 的文件:

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 镜像为基础,然后运行一个命令在 /app 目录下创建一个名为 test.txt 的文件。

现在,让我们根据这个 Dockerfile 构建一个 Docker 镜像。我们将其标记为 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:latestubuntu:20.04,并忽略 ubuntu:20.04 中已经存在的漏洞。这将只显示我们的 Dockerfile 更改所引入的漏洞。

我们在 trivy image 命令中使用 --ignore-base 标志来实现这一点。

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

这个命令将 my-ubuntu-app:latestubuntu:20.04 进行比较,但只报告 my-ubuntu-app:latest 中存在而 ubuntu:20.04不存在 的漏洞。由于我们的 Dockerfile 只是添加了一个简单的文件,没有安装任何新的软件包,与上一步的输出相比,你应该会看到很少或没有新的漏洞报告。这展示了 --ignore-base 如何帮助你关注应用层的安全影响。

比较镜像并按严重程度和软件包类型过滤

在前面的步骤中,我们进行了基本的镜像比较。然而,输出有时可能会非常详细,特别是对于存在大量漏洞的镜像。trivy 允许你根据严重程度和软件包类型过滤结果,这有助于你专注于最关键的问题或特定类型的漏洞。

让我们再次比较 ubuntu:20.04ubuntu:22.04,但这次我们将过滤结果,只显示严重程度为 HIGHCRITICAL 的漏洞。当你想优先修复最严重的漏洞时,这很有用。

我们使用 --severity 标志来指定要报告的最低严重程度。你可以提供一个用逗号分隔的严重程度列表。

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

这个命令将比较两个 ubuntu 镜像,并且只显示在任一镜像中被归类为 HIGHCRITICAL 的漏洞。你会注意到,输出比默认比较的输出短得多,因为它排除了严重程度较低(UNKNOWN、LOW、MEDIUM)的漏洞。

除了按严重程度过滤,你还可以根据发现漏洞的软件包类型进行过滤。trivy 可以扫描操作系统软件包(如通过 aptyum 等安装的软件包)和应用程序依赖项(如代码使用的库)中的漏洞。

让我们再次比较这些镜像,但这次我们只查找操作系统软件包中的漏洞。我们为此使用 --vuln-type 标志。

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

这个命令将比较两个镜像,并且只报告在操作系统软件包中发现的漏洞。如果你主要关注镜像的基础操作系统层的安全性,这会很有帮助。

你还可以组合使用这些过滤器。例如,要查看操作系统软件包中仅为 HIGHCRITICAL 的漏洞:

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.04ubuntu:22.04,并将输出保存到 ~/project 目录下一个名为 comparison_report.md 的 Markdown 文件中。

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

这个命令执行的比较与第一步相同,但将输出格式化为 Markdown 并保存到指定的文件中。这次你不会直接在终端中看到输出。

命令执行完成后,你可以使用 catnano 查看生成的 Markdown 文件。

cat ~/project/comparison_report.md

这个命令将在终端中显示 comparison_report.md 文件的内容。你应该会看到使用 Markdown 语法格式化的漏洞比较结果,包括标题、列表和表格。

你也可以使用 nano 在文本编辑器中打开该文件:

nano ~/project/comparison_report_markdown.md

查看文件后记得退出 nano(Ctrl+X)。

以 Markdown 等不同格式生成报告,能让你轻松地与他人共享漏洞信息,或将其集成到现有的报告工作流程中。这是将安全扫描纳入开发和部署管道的关键一步。

总结

在本次实验中,你学习了如何使用 trivy 工具比较两个 Docker 镜像。你首先在 LabEx 环境中安装了 trivy,这包括添加 trivy 仓库并使用 apt 安装该软件包。安装完成后,你从 Docker Hub 拉取了 ubuntu 镜像的两个不同版本,即 ubuntu:20.04ubuntu:22.04。最后,你执行了基本的 trivy image --diff-image 命令来比较这两个镜像,并分析它们在漏洞和软件包方面的差异。