简介
在这个实验中,你将学习如何有效地使用 docker scout compare
命令来分析两个 Docker 镜像之间的差异。这个过程对于理解不同版本或构建中镜像的漏洞、软件包和其他组件的变化至关重要。
通过实践练习,你将探索如何使用默认设置比较镜像、忽略基础镜像的漏洞、按严重程度和软件包类型过滤结果,以及生成比较结果的 Markdown 报告。在本实验结束时,你将熟练掌握 docker scout compare
的使用,从而深入了解容器镜像的安全性和组成。
在这个实验中,你将学习如何有效地使用 docker scout compare
命令来分析两个 Docker 镜像之间的差异。这个过程对于理解不同版本或构建中镜像的漏洞、软件包和其他组件的变化至关重要。
通过实践练习,你将探索如何使用默认设置比较镜像、忽略基础镜像的漏洞、按严重程度和软件包类型过滤结果,以及生成比较结果的 Markdown 报告。在本实验结束时,你将熟练掌握 docker scout compare
的使用,从而深入了解容器镜像的安全性和组成。
在这一步中,你将学习如何使用漏洞扫描工具比较两个 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
这些命令会从 Docker Hub 拉取指定的 ubuntu
镜像版本。你应该会看到显示下载进度和镜像成功拉取的输出信息。
现在,我们可以使用 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: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:latest
和 ubuntu: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: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
这个命令提供了对镜像操作系统层中最严重漏洞的更有针对性的视图。过滤有助于你管理输出并有效地确定安全工作的优先级。
在前面的步骤中,我们直接在终端中查看了漏洞比较结果。虽然这对于快速检查很有用,但你通常需要将结果以结构化的格式保存下来,以便进行报告、文档记录或进一步分析。trivy
支持多种输出格式,包括 Markdown。
生成 Markdown 报告很有用,因为 Markdown 是一种轻量级标记语言,易于阅读,并且可以轻松转换为其他格式,如 HTML 或 PDF。
要生成镜像比较的 Markdown 报告,我们使用 --format
标志并指定 markdown
。我们还使用 >
运算符将输出重定向到一个文件。
让我们再次比较 ubuntu:20.04
和 ubuntu:22.04
,并将输出保存到 ~/project
目录下一个名为 comparison_report.md
的 Markdown 文件中。
trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --format markdown > ~/project/comparison_report.md
这个命令执行的比较与第一步相同,但将输出格式化为 Markdown 并保存到指定的文件中。这次你不会直接在终端中看到输出。
命令执行完成后,你可以使用 cat
或 nano
查看生成的 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.04
和 ubuntu:22.04
。最后,你执行了基本的 trivy image --diff-image
命令来比较这两个镜像,并分析它们在漏洞和软件包方面的差异。