使用 Trivy Docker 容器漏洞扫描器 / 2024

使用 Trivy Docker 容器漏洞扫描器 / 2024

Trivy 是 Aqua Security 的开源工具,支持扫描容器镜像、文件系统、 Git 存储库、虚拟机镜像等多种目标,以查找漏洞和配置错误。文章提供了详细的 Trivy 安装方法和应用示例。

Trivy 介绍

Trivy 是 Aqua Security 的一个开源工具,用于扫描漏洞和配置错误。它是一款相当全面且多功能的安全扫描器,支持多种扫描目标,能够弥补市面上常见 Web 漏洞扫描工具的不足。

  • 容器镜像( Docker )
  • 文件系统
  • Git 存储库
  • 虚拟机镜像
  • Kubernetes
  • AWS

Trivy 可以轻松地通过安装并将二进制文件添加到项目中,进而集成到 CI/CD 管道( DevSecOps )。 Trivy 提供了对编程语言和操作系统包的全面可视化,并具有广泛的漏洞数据库,允许快速扫描关键的 CVE 。随着该工具的各种新进展,它已经帮助了渗透测试人员和网络安全研究人员,确保进行持续的扫描,使 DevSecOps 的过程更快更高效。

Trivy 安装

安装过程非常简单。 Trivy 提供了多种安装方式,并且在大多数常见的分销渠道(例如 apt 、 yum 、 homebrew 等)中都已上架支持。

RHEL/CentOS 安装

将存储库设置添加到 /etc/yum.repos.d,然后使用 yum 包管理器进行安装,命令如下:

RELEASE_VERSION=$(grep -Po '(?<=VERSION_ID=")[0-9]' /etc/os-release)
cat << EOF | sudo tee -a /etc/yum.repos.d/trivy.repo
[trivy]
name=Trivy repository
baseurl=https://aquasecurity.github.io/trivy-repo/rpm/releases/$RELEASE_VERSION/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://aquasecurity.github.io/trivy-repo/rpm/public.key
EOF
sudo yum -y update
sudo yum -y install trivy

你也可以下载 RPM 文件进行安装:

rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.44.0/trivy_0.44.0_Linux-64bit.rpm

Debian/Ubuntu 安装

将存储库设置添加到 /etc/apt/sources.list.d,然后使用 apt-get 进行安装,命令如下:

sudo apt-get install wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy

你也可以选择 DEB 二进制文件进行安装:

wget https://github.com/aquasecurity/trivy/releases/download/v0.44.0/trivy_0.44.0_Linux-64bit.deb
sudo dpkg -i trivy_0.44.0_Linux-64bit.deb

macOS 安装

Trivy 支持 Homebrew ,因此可以通过 brew 命令快速完成安装:

brew install trivy

brew install 命令默认会首先尝试检查 Homebrew 远程是否有更新。有时候 Homebrew 更新会非常慢,如果你想跳过 Homebrew 更新,可以使用:

export HOMEBREW_NO_AUTO_UPDATE=1 && brew install trivy
Mac Trivy 下载安装
你也可以使用 MacPorts 进行安装,命令为: sudo port install trivy

安装完成后,可以尝试运行 trivy -h 测试是否安装成功。

Windows 安装

Windows 用户可以选择通过 .exe 二进制文件进行安装。

访问 Trivy 官方项目地址: https://github.com/aquasecurity/trivy/releases/

滑到最下面,可以看到 windows 系统安装文件,点击下载 ZIP 文件解压后可以得到 .exe 文件:

Windows Trivy 下载安装

通过 Docker 安装

Trivy 也提供 Docker 镜像,官方镜像名称为: aquasec/trivy

例如,我们使用 Docker 安装最新版的 Trivy 0.44.0 ,并扫描一个名为 python:3.4-alpine 的 Docker 镜像:

docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy:0.44.0 image python:3.4-alpine

命令解释:

  • -v /var/run/docker.sock:/var/run/docker.sock – 把 Docker 守护进程连接到容器,使得容器可以操作 Docker 。
  • -v $HOME/Library/Caches:/root/.cache/ – 把主机的缓存目录共享到容器中,这可以帮助加快构建速度。
  • aquasec/trivy:0.44.0 – 运行的 Docker 镜像的名称和版本,你也可以修改 0.44.0 为其他版本。
  • image python:3.4-alpine – 命令 Trivy 扫描名为 python:3.4-alpine 的 Docker 镜像。
Docker 安装 Trivy
Docker Trivy 扫描结果 Mac

结果如上图所示,我们成功识别到多个 CVE 安装漏洞。

Trivy 不仅给出了漏洞 CVE 编号和风险等级,还有详细的当前组件版本、漏洞修复版本,以及漏洞描述。

Trivy 漏洞扫描

Trivy 漏洞扫描原理

Trivy 扫描几种不同类型的目标,其原理也各不相同。

以下是这些类型和对应的扫描原理:

扫描类型原理
容器镜像( image )Trivy 会下载 Docker 镜像,然后提取文件系统。它会解析包管理器的数据库,找到已经安装的软件包和它们的版本,然后与其自己的漏洞数据库进行匹配,以发现任何已知的漏洞。
文件系统( fs )Trivy 会直接扫描文件系统。它将解析在文件系统中找到的包管理器的数据库,以确定已安装的软件包及其版本,然后像扫描 Docker 镜像那样进行漏洞匹配。
Git 存储库( repo )Trivy 会检出 Git 存储库,然后扫描其中的文件。它会查找常见的依赖文件(例如 package.json 、 Gemfile.lock 等),解析它们来找出项目的依赖,并在其数据库中查找这些依赖的已知漏洞。
构建工件( art )Trivy 会分析构建工件(例如 JAR 文件、 node_modules 目录等)中的依赖关系,然后在其数据库中查找这些依赖的已知漏洞。
配置文件( conf )Trivy 会解析配置文件(例如 Kubernetes 配置、 Dockerfile 等),以发现常见的配置问题和最佳实践违规。这些问题可能包括未设定的资源限制、使用了过时的 API 版本等。

一般用法

Trivy 工具的一般用法如下:

trivy <target> <subject>

在 Trivy 命令中,<target>指的是你想要扫描的目标类型。 Trivy 支持多种类型的扫描目标,包括:

Target描述示例
image用于扫描 Docker 镜像。需要提供镜像名称。trivy image nginx:latest
fs用于扫描文件系统。需要提供文件系统的路径。trivy fs /path/to/directory
repo用于扫描 Git 仓库。需要提供 Git 仓库的 URL 。trivy repo https://github.com/aquasecurity/trivy
art用于扫描构建工件。需要提供构建工件的路径。trivy art /path/to/file
conf用于扫描配置文件。需要提供配置文件的路径。trivy conf /path/to/file

<subject>就是对应的 Docker 镜像名、文件系统路径、 Git 仓库 URL 、构建工件路径或配置文件路径等具体目标。

扫描 Docker 镜像

随着对 Docker 安全性的威胁日益增长, Trivy 是市场上可用的最佳 Docker 镜像扫描工具之一。

你可以通过以下步骤轻松快速地对 Docker 镜像进行扫描并报告相关漏洞。

步骤 1 :检查您要扫描的容器镜像的镜像 ID 或镜像名。

sudo docker images
Trivy Docker

步骤 2 :使用下面的命令扫描容器镜像。

我这里仍然通过 Docker 运行 Trivy ,你也可以通过其他方式。
docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy:0.44.0 image szsecurity/mutillidae
CleanShotVAB1hYADNvPwwChc

成功扫描到一个有关 SSL 私钥的风险。

您还可以使用下面的命令扫描镜像中特定严重性的漏洞,并将报告保存为文本格式。

docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy:0.44.0 image --severity HIGH szsecurity/mutillidae > result.txt
more result.txt
CleanShotuLVYQ37Sa6u56C3r

以上就是使用 Trivy 扫描 Docker 镜像的方法。

扫描 Git 仓库

如果您正在使用 Git 仓库,您可以直接扫描 git 文件,而无需下载整个包:

sudo trivy repo https://github.com/zabirauf/AutoGPT.js
Trivy Docker Repo Github AutoGPT

从 yaml 文件中发现一个高风险漏洞。

扫描文件系统

Trivy 可以用来扫描文件系统(如主机机器,虚拟机镜像或解包的容器镜像文件系统)。

(注意:我们正在使用 Filesystem 中的 vulnerable-node 进行此实践。)

使用下面的命令扫描任何文件系统的漏洞。

trivy conf services/

在 Dockerfile 中嵌入 Trivy

您还可以通过在 Dockerfile 中嵌入 Trivy 来在构建过程中扫描镜像。

通过在 Docker 构建过程中包含 Trivy 扫描,你可以确保你的镜像不包含任何已知的安全漏洞。这是一个很好的最佳实践,因为它可以帮助你避免因为使用了含有已知漏洞的镜像而导致的安全问题。

另外, Trivy 的扫描速度相对较快,并且对于大多数已知的操作系统和编程语言都有很好的支持,这使得它成为在 CI/CD 管道中进行漏洞扫描的一个很好的选择。因此,许多开发团队会在他们的持续集成和部署流程中使用 Trivy 。

步骤 1 :将 trivy 添加到 Dockerfile 文件中

FROM alpine:3.7
RUN apk add curl 
    && curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s -- -b /usr/local/bin 
    && trivy filesystem --exit-code 1 --no-progress /

这个 Dockerfile 在运行 Trivy 扫描时使用了 --exit-code 1 参数。这个参数意味着如果 Trivy 扫描到任何漏洞,它会以 exit code 1 结束。

步骤 2 :构建镜像

docker build -t vulnerable .

它会在镜像构建过程中扫描 Docker 文件,并如下图所示给出报告:

Trivy Dockerfile
CleanShotELCD11WpJKCo1W4y

如上图所示,当我们用于构建的镜像存在漏洞时,构建会自动终止。