Trivy:全面且快速的漏洞扫描器
Trivy 容器扫描完全指南
Trivy 是一款由 Aqua Security 开源的漏洞扫描器,以速度快、使用简单和覆盖范围广著称。它可以扫描容器镜像、文件系统、Git 仓库以及 Kubernetes 资源中的安全漏洞和配置错误。本教程将带你从安装开始,逐步掌握 Trivy 的核心用法与最佳实践。
什么是 Trivy?
Trivy(发音为“trigger”)是一个全面且易于使用的安全扫描器。它不仅能检测操作系统软件包(Alpine、RHEL、CentOS 等)的已知漏洞,还能发现应用依赖项(Bundler、Composer、npm、pip 等)中的问题。同时,Trivy 内置了对配置错误(Misconfigurations)的检测,例如 Dockerfile 中的不安全指令或 Kubernetes 清单中的风险设置。它完全免费,可轻松集成到 CI/CD 流程中,并支持多种输出格式。
核心特性:
- 极快的扫描速度,第一次扫描便自动下载并缓存漏洞数据库
- 丰富的漏洞数据源,包括 NVD、Red Hat、Debian、Alpine 等
- 支持扫描容器镜像(本地或远程)、文件系统、Git 仓库
- 检测 IaC(基础设施即代码)配置错误
- 输出格式多样,如表单、JSON、SARIF、模板化报告
- 可作为 CI 工具直接使用,也可通过 GitHub Action 集成
安装 Trivy
Trivy 提供了多种安装方式,我们推荐使用官方脚本或包管理器。
使用安装脚本(Linux/macOS):
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
使用包管理器:
- macOS:
brew install aquasecurity/trivy/trivy - Debian/Ubuntu:
sudo apt-get install 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) main | sudo tee -a /etc/apt/sources.list.d/trivy.list sudo apt-get update sudo apt-get install trivy - Windows(通过 Chocolatey):
choco install trivy
安装完成后,运行 trivy --version 验证。
快速入门:扫描你的第一个镜像
假设本地已用 Docker 拉取了一个镜像(如 alpine:3.18),直接执行扫描命令:
trivy image alpine:3.18
Trivy 会自动更新漏洞数据库,然后输出一份表格化的结果,显示发现漏洞的 severity(严重程度)、ID、对应软件包和修复版本。默认只显示 HIGH 和 CRITICAL 级别的漏洞。
扫描远程镜像无需先拉取:
trivy image nginx:1.25
Trivy 可以直接访问公共注册仓库,你甚至不需要安装 Docker。
扫描不同目标类型
Trivy 支持多种扫描目标,通过子命令区分。
扫描容器镜像
- 本地镜像:
trivy image myapp:latest - 远程镜像(支持指定注册表):
trivy image ghcr.io/myorg/myapp:v1.0 - 扫描镜像 tarball 文件:
docker save myapp:latest -o myapp.tar trivy image --input myapp.tar
扫描文件系统
扫描宿主机的目录或文件,检测已安装的软件包和依赖项漏洞:
trivy fs /path/to/app
用于扫描本地源代码目录时,还可检测代码依赖(如 package.json、Pipfile.lock)中的漏洞。
扫描 Git 仓库
直接扫描远程仓库:
trivy repo https://github.com/example/my-app
该命令会克隆仓库到临时目录,分析依赖文件和 IaC 配置,扫描完成后自动清理。
扫描 Kubernetes 集群
需要适当的 kubeconfig 权限,扫描集群内的工作负载或指定 namespace:
trivy k8s --namespace=production
理解扫描结果
默认结果以彩色表格形式呈现:
alpine:3.18 (alpine 3.18.4)
Total: 2 (HIGH: 2)
+----------+------------------+----------+-------------------+---------------+---------------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+----------+------------------+----------+-------------------+---------------+---------------------------------------+
| libcrypto3 | CVE-2024-0727 | HIGH | 3.1.1-r1 | 3.1.5-r0 | openssl: denial of service via ... |
| libssl3 | CVE-2024-0727 | HIGH | 3.1.1-r1 | 3.1.5-r0 | openssl: denial of service via ... |
+----------+------------------+----------+-------------------+---------------+---------------------------------------+
关键信息:
- Severity:
CRITICAL、HIGH、MEDIUM、LOW、UNKNOWN - Installed Version:当前使用的受影响版本
- Fixed Version:修复该漏洞的新版本
- Title:漏洞简述
使用 --severity 参数可以按严重等级筛选:
trivy image --severity CRITICAL myapp:latest
自定义扫描输出
Trivy 支持多种输出格式,满足不同使用场景。
JSON 格式(适合程序处理):
trivy image --format json -o result.json alpine:3.18
SARIF 格式(兼容 GitHub 代码扫描):
trivy image --format sarif -o result.sarif alpine:3.18
生成 HTML 模板报告: Trivy 内置了简单模板,也可使用 community 提供的自定义报告模板。
trivy image --format template --template "@contrib/html.tpl" -o report.html alpine:3.18
若只需查看特定类型的总结,可以加上 --quiet 和 --scanners 参数。例如,只检查操作系统包漏洞:
trivy image --scanners vuln alpine:3.18
过滤与忽略漏洞
实际环境中,有些漏洞可能因安全策略或业务需要而需要被忽略。
按漏洞 ID 忽略:
创建一个 .trivyignore 文件,每行一个 CVE 编号(或以 # 开头为注释)。
# 此漏洞已有补偿控制
CVE-2024-0727
扫描时会自动应用该文件。
通过命令行忽略:
使用 --ignore-unfixed 参数可以忽略那些没有可用修复版本的漏洞,避免噪音。
trivy image --ignore-unfixed nginx:1.25
按路径忽略错误配置:
扫描 IaC 时可使用 .trivyignore 结合路径规则,例如忽略某个特定 Dockerfile 行。
集成到 CI/CD 流水线
Trivy 的设计天然适合集成到持续集成流程中,能够阻止包含严重漏洞的镜像被部署。
GitHub Actions 示例:
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'my-app:${{ github.sha }}'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'HIGH,CRITICAL'
GitLab CI 示例:
security_scan:
stage: test
image: aquasec/trivy:latest
script:
- trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
--exit-code 1 选项会让 Trivy 在发现符合严重等级的漏洞时返回非零退出码,从而使流水线失败,实现“门禁”效果。
Docker 构建后直接扫描: 在构建完镜像之后,可立即用 Trivy 扫描刚生成的本地镜像,确保不引入已知漏洞。
docker build -t myapp:latest .
trivy image --exit-code 1 myapp:latest
远程数据库与离线扫描
Trivy 默认从 GitHub Container Registry 下载漏洞数据库。在离线环境下,你可以提前将数据库打包,然后在扫描时指定本地目录。
下载离线数据库:
trivy image --download-db-only --db-repository public.ecr.aws/aquasecurity/trivy-db
该命令将数据库下载到 $HOME/.cache/trivy/db。将整个缓存文件夹复制到离线环境后,指定本地数据库路径:
trivy image --skip-db-update --db-repository /path/to/db myimage:latest
最佳实践与提示
- 定期更新数据库:CI 中应确保 Trivy 每次运行前能更新数据库,或者使用最新的 Trivy 容器镜像(自带较新数据库)。
- 结合 POLICY 文件:Trivy 支持 OPA/Rego 策略,可实现自定义的漏洞评估规则,满足企业合规需求。
- 使用
--cache-dir:在容器化运行时可挂载缓存卷,加速重复扫描。 - 关注 SBOM 生成:Trivy 能生成 CycloneDX 或 SPDX 格式的软件物料清单,便于供应链管理:
trivy image --format cyclonedx --output bom.xml alpine:3.18 - 扫描私有仓库:通过
--username、--password或 Docker 配置认证信息来访问私有镜像。
总结
Trivy 凭借其全面、快速和易用的特性,已成为开源社区中容器安全扫描的事实标准。无论是个人开发者检查依赖风险,还是企业级 CI/CD 流程的安全门禁,Trivy 都能无缝集成。掌握上述基本用法后,你可以进一步探索它的高级功能,如客户端-服务器模式、策略即代码以及 Kubernetes 深度集成,在安全左移的道路上建立起坚实的第一道防线。