Trivy:全面且快速的漏洞扫描器

FreeGuideOnline 最新 2026-07-04

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.jsonPipfile.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 ...     |
+----------+------------------+----------+-------------------+---------------+---------------------------------------+

关键信息:

  • SeverityCRITICALHIGHMEDIUMLOWUNKNOWN
  • 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 深度集成,在安全左移的道路上建立起坚实的第一道防线。