如何使用 docker scout cves 命令查找漏洞

DockerDockerBeginner
立即练习

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

简介

在本次实验中,你将学习如何有效使用 docker scout cves 命令来识别 Docker 镜像及相关制品中的漏洞。我们将首先直接分析 Docker 镜像中的漏洞,展示如何拉取存在漏洞的镜像,并使用 Trivy 等安全扫描工具来发现潜在问题。

接下来,你将探索如何从 docker save 生成的 tar 包和 OCI 目录中分析漏洞,展示 docker scout cves 命令在不同格式下的灵活性。最后,你将学习如何将漏洞报告导出为 SARIF JSON 文件以便进一步处理,以及如何显示带有相关 EPSS 分数的漏洞,从而确定修复工作的优先级。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/ImageOperationsGroup -.-> docker/save("Save Image") docker/VolumeOperationsGroup -.-> docker/cp("Copy Data Between Host and Container") subgraph Lab Skills docker/ls -.-> lab-555202{{"如何使用 docker scout cves 命令查找漏洞"}} docker/pull -.-> lab-555202{{"如何使用 docker scout cves 命令查找漏洞"}} docker/images -.-> lab-555202{{"如何使用 docker scout cves 命令查找漏洞"}} docker/save -.-> lab-555202{{"如何使用 docker scout cves 命令查找漏洞"}} docker/cp -.-> lab-555202{{"如何使用 docker scout cves 命令查找漏洞"}} end

分析 Docker 镜像中的漏洞

在这一步中,你将学习如何使用 Trivy 分析 Docker 镜像中的漏洞。Trivy 是一款全面且通用的安全扫描工具。它可以检测操作系统软件包(Alpine、RHEL、CentOS、Debian、Ubuntu 等)和应用程序依赖项(Bundler、Composer、npm、yarn 等)中的漏洞。此外,Trivy 支持多种扫描目标,如容器镜像、文件系统和 Git 仓库。

首先,让我们拉取一个存在漏洞的 Docker 镜像,用于后续分析。我们将使用 library/ubuntu:18.04 镜像,该镜像已知存在一些漏洞。

docker pull library/ubuntu:18.04

你应该会看到表明镜像正在被拉取和下载的输出信息。

18.04: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04

现在我们已经有了这个镜像,接下来需要安装 Trivy。由于 LabEx 环境中并未预装 Trivy,我们将从官方 GitHub 仓库下载并安装它。

wget https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.deb

此命令会下载 Trivy 的 Debian 软件包。你应该会看到类似如下的输出:

--2023-10-27 08:00:00--  https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.deb
Resolving github.com (github.com)... 140.82.113.4
Connecting to github.com (github.com)|140.82.113.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/140000000/...?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=... [following]
--2023-10-27 08:00:00--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/140000000/...
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 50000000 (48M) [application/octet-stream]
Saving to: ‘trivy_0.50.1_Linux-64bit.deb’

trivy_0.50.1_Linux-64bit.deb 100%[=================================================>]  47.68M  --.-MB/s    in 0.5s

2023-10-27 08:00:01 (95.3 MB/s) - ‘trivy_0.50.1_Linux-64bit.deb’ saved [50000000/50000000]

现在,使用 dpkg 安装下载好的软件包。

sudo dpkg -i trivy_0.50.1_Linux-64bit.deb

你应该会看到表明安装过程的输出信息。

Selecting previously unselected package trivy.
(Reading database ... 100000 files and directories currently installed.)
Preparing to unpack trivy_0.50.1_Linux-64bit.deb ...
Unpacking trivy (0.50.1) ...
Setting up trivy (0.50.1) ...

Trivy 安装完成后,我们现在可以扫描 library/ubuntu:18.04 Docker 镜像中的漏洞了。

trivy image library/ubuntu:18.04

Trivy 将开始扫描镜像。这可能需要一些时间,因为它需要下载漏洞数据库并分析镜像层。你会看到显示进度的输出,随后是找到的漏洞的详细报告。

2023-10-27T08:00:05.000+0000    INFO    Need to update DB
2023-10-27T08:00:05.000+0000    INFO    Downloading DB...
...
2023-10-27T08:00:10.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:00:10.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
library/ubuntu:18.04 (ubuntu 18.04)
===================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

输出提供了找到的漏洞总数的摘要,并按严重程度(UNKNOWN、LOW、MEDIUM、HIGH、CRITICAL)进行了分类。然后,它会列出每个漏洞的详细信息,如受影响的软件包、漏洞 ID(如 CVE-YYYY-XXXX)、严重程度级别、软件包的安装版本以及可用的修复版本。这份报告有助于你了解 Docker 镜像的安全状况,并确定需要修复的区域。

分析 docker save 生成的 tar 包中的漏洞

在这一步中,你将学习如何分析以 tar 包文件形式保存的 Docker 镜像中的漏洞。当你需要扫描一个在 Docker 镜像仓库或本地 Docker 守护进程中无法直接获取,但已保存为文件的镜像时,这种方法非常有用。

首先,你需要将上一步中拉取的 library/ubuntu:18.04 Docker 镜像保存为一个 tar 包文件。你可以使用 docker save 命令来完成这个操作。

docker save library/ubuntu:18.04 -o ubuntu_18.04.tar

这个命令会将 library/ubuntu:18.04 镜像保存到当前目录(~/project)下一个名为 ubuntu_18.04.tar 的文件中。-o 标志用于指定输出文件。

你应该会看到表明镜像层正在被保存的输出信息。

The image 'library/ubuntu:18.04' is being saved to a tar file.
...

现在你已经将镜像保存为一个 tar 包,接下来可以使用 Trivy 来扫描这个文件。你将再次使用 trivy image 命令,但这次你要指定 tar 包文件作为扫描目标。

trivy image --input ubuntu_18.04.tar

--input 标志告诉 Trivy 从 tar 包文件中扫描镜像,而不是从镜像仓库中拉取镜像或按名称扫描本地镜像。Trivy 会从 ubuntu_18.04.tar 文件中读取镜像数据并进行漏洞分析,这与直接扫描本地镜像类似。

你会看到输出显示 Trivy 正在从 tar 包中加载镜像,然后是漏洞扫描过程和报告,就像上一步一样。

2023-10-27T08:05:00.000+0000    INFO    Loading image from ubuntu_18.04.tar...
2023-10-27T08:05:05.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:05:05.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
ubuntu_18.04.tar (ubuntu 18.04)
==============================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

这展示了即使 Docker 镜像没有加载到 Docker 守护进程中,Trivy 也可以通过扫描 docker save 生成的 tar 包来分析这些镜像。这是一种将漏洞扫描集成到以文件形式传输镜像的工作流程中的灵活方法。

分析 OCI 目录中的漏洞

在这一步中,你将了解如何分析以开放容器倡议(Open Container Initiative,OCI)布局格式存储的镜像中的漏洞。OCI 镜像格式规范定义了一种打包容器镜像的标准。像 Skopeo 和 Buildah 这样的工具可用于创建和管理这种格式的镜像。Trivy 可以直接扫描存储在 OCI 目录中的镜像。

首先,你需要从 library/ubuntu:18.04 Docker 镜像创建一个 OCI 目录。你将使用命令行工具 skopeo 来完成这个任务。由于 skopeo 没有预装,你需要先安装它。

sudo apt update
sudo apt install -y skopeo

这将更新软件包列表并安装 skopeo。你会看到显示安装过程的输出信息。

Hit:1 http://archive.ubuntu.com/ubuntu bionic InRelease
...
Setting up skopeo (1.2.3-3) ...

现在 skopeo 已经安装好了,你可以将 Docker 镜像复制到一个 OCI 目录中。你将在 ~/project 目录下创建一个名为 ubuntu_oci 的目录,并使用 skopeo copy 将镜像复制到该目录中。

mkdir ubuntu_oci
skopeo copy docker-daemon:library/ubuntu:18.04 oci:ubuntu_oci:18.04

skopeo copy 命令用于在不同的存储位置和格式之间传输镜像。

  • docker-daemon:library/ubuntu:18.04 指定源镜像,即位于本地 Docker 守护进程中的 library/ubuntu:18.04
  • oci:ubuntu_oci:18.04 指定目标格式和位置。oci: 表示 OCI 格式,ubuntu_oci 是存储 OCI 镜像的目录,18.04 是该 OCI 目录中镜像的标签。

你会看到显示复制过程的输出信息。

Getting image source signatures
Copying blob sha256:...
...
Copying config sha256:...
Writing manifest to image destination
Storing signatures

现在你应该有一个名为 ubuntu_oci 的目录,其中包含 OCI 镜像数据。你可以列出该目录的内容,查看 OCI 布局文件。

ls ubuntu_oci

你会看到像 oci-layoutindex.jsonblobs 这样的文件和目录。

blobs  index.json  oci-layout

最后,你可以使用 Trivy 扫描这个 OCI 目录中的漏洞。你将使用 trivy image 命令并指定 OCI 目录的路径。

trivy image oci:ubuntu_oci:18.04

Trivy 会识别 oci: 前缀,并扫描位于 ubuntu_oci 目录中标签为 18.04 的镜像。它会分析镜像层并报告发现的任何漏洞,这与直接扫描 Docker 镜像类似。

你会看到显示 Trivy 正在扫描 OCI 镜像的输出,然后是漏洞报告。

2023-10-27T08:10:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:10:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
oci:ubuntu_oci:18.04 (ubuntu 18.04)
==================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

这展示了 Trivy 扫描以 OCI 格式存储的镜像的能力,为你管理和扫描容器镜像提供了灵活性。

将漏洞报告导出为 SARIF JSON 文件

在这一步中,你将学习如何将 Trivy 生成的漏洞报告导出为 SARIF JSON 文件。SARIF(静态分析结果交换格式,Static Analysis Results Interchange Format)是静态分析工具输出的标准格式。以 SARIF 格式导出报告可以更轻松地将漏洞扫描结果集成到其他工具和工作流程中,例如 CI/CD 管道或安全仪表盘。

你将再次扫描 library/ubuntu:18.04 Docker 镜像,但这次你会使用 Trivy 的格式化选项将结果以 SARIF 格式输出并保存到一个文件中。

trivy image --format sarif --output report.sarif library/ubuntu:18.04

下面来详细解析这个命令:

  • trivy image library/ubuntu:18.04:这是扫描指定 Docker 镜像的标准命令。
  • --format sarif:该标志告诉 Trivy 将输出格式化为 SARIF JSON。
  • --output report.sarif:该标志将输出重定向到当前目录(~/project)下一个名为 report.sarif 的文件中。

Trivy 会执行扫描并将结果保存到指定的文件中。你不会在控制台看到详细的报告,只会看到进度信息。

2023-10-27T08:15:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:15:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...

命令执行完成后,你的 ~/project 目录下应该会有一个名为 report.sarif 的文件。你可以使用 ls 命令验证该文件是否存在。

ls report.sarif

你应该会看到文件名被打印出来,这就确认了文件已创建。

report.sarif

你还可以使用 catless 等命令行工具查看 SARIF 文件的内容。文件内容将是符合 SARIF 规范的 JSON 格式。

cat report.sarif

你会看到 JSON 输出,根据发现的漏洞数量,输出可能会很长。

{
  "version": "2.1.0",
  "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
  "runs": [
    {
      "tool": {
        "driver": {
          "name": "Trivy",
          "version": "0.50.1",
          ...
        }
      },
      "results": [
        {
          "ruleId": "CVE-YYYY-XXXX",
          "level": "error",
          "message": {
            "text": "apt: CVE-YYYY-XXXX (HIGH)"
          },
          ...
        },
        ...
      ]
    }
  ]
}

以 SARIF 格式导出报告是将漏洞扫描集成到自动化安全工作流程并利用支持 SARIF 标准的工具的有效方法。

显示带有 EPSS 分数的漏洞

在这一步中,你将学习如何使用 Trivy 显示漏洞及其利用预测评分系统(Exploit Prediction Scoring System,EPSS)分数。EPSS 是一种基于数据的方法,用于评估漏洞在实际环境中被利用的可能性。在漏洞报告中包含 EPSS 分数,可以帮助你将修复工作的重点放在更有可能被积极利用的漏洞上,从而对修复工作进行优先级排序。

如果有可用的 EPSS 分数,Trivy 可以获取并显示这些分数。为此,你需要使用 --vuln-type os,library 标志,以确保同时扫描操作系统和库的漏洞。如果某个 CVE 有可用的 EPSS 数据,Trivy 将自动在输出中包含该分数。

让我们再次扫描 library/ubuntu:18.04 Docker 镜像,这次明确指定要扫描操作系统和库的漏洞类型。

trivy image --vuln-type os,library library/ubuntu:18.04

--vuln-type os,library 标志指定了要扫描的漏洞类型。默认情况下,Trivy 通常会扫描这些类型的漏洞,但明确包含该标志可以确保这一点。当 Trivy 发现某个漏洞(由 CVE ID 标识)有可用的 EPSS 数据时,它会在报告中包含该漏洞的 EPSS 分数。

Trivy 将像之前一样执行扫描。输出与最初的扫描结果类似,但你会注意到,对于某些漏洞,输出中会多一个显示 EPSS 分数的列。

2023-10-27T08:20:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:20:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
library/ubuntu:18.04 (ubuntu 18.04)
===================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┬───────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │ EPSS  │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┼───────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │ 0.95  │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │ ...   │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┴───────┘

注意输出表格中的新列 EPSS。该列中的值代表相应漏洞的 EPSS 分数,范围从 0 到 1。EPSS 分数越高,表明该漏洞在未来 30 天内被利用的可能性就越大。这些信息对于确定优先修复哪些漏洞非常有价值,你可以将重点放在 EPSS 分数较高的漏洞上。

在漏洞分析中包含 EPSS 分数,你就可以不仅仅依赖于严重程度级别,而是做出更明智的风险评估和修复决策。

总结

在本次实验中,你学习了如何使用多功能安全扫描工具 Trivy 分析 Docker 镜像中的漏洞。你拉取了一个存在漏洞的 Ubuntu 镜像,并安装了 Trivy 来进行分析。这第一步着重于扫描实时 Docker 镜像以查找安全漏洞的基本流程。