Trivy(发音为 /ˈtraɪvi/)是由 Aqua Security 开发的开源综合安全扫描器,在 GitHub 上拥有超过 35,000 个 star,是目前最受欢迎的开源安全扫描工具之一。
Trivy 的核心优势在于其全面性——它能够扫描多种目标(容器镜像、文件系统、Git 仓库、虚拟机镜像、Kubernetes 集群),并检测多种安全问题(已知 CVE 漏洞、IaC 配置错误、敏感信息泄露、软件许可证、SBOM 生成)。对于现代 DevSecOps 团队来说,Trivy 几乎可以覆盖从代码提交到生产部署的整个安全扫描链路。
本文将从安装开始,逐步介绍 Trivy 的核心功能、实战用法以及如何在 CI/CD 流水线中集成 Trivy,帮助开发者和安全工程师快速上手这个强大的安全工具。
为什么选择 Trivy?
在 Trivy 出现之前,安全扫描领域通常是碎片化的:你需要用不同的工具来扫描容器镜像、检查 IaC 配置、查找代码中的密钥泄露。Trivy 将这些能力整合到一个统一的 CLI 工具中,具有以下突出特点:
1. 多目标扫描支持
Trivy 可以扫描以下目标:
- 容器镜像:Docker、OCI 兼容镜像(本地或远程仓库)
- 文件系统:本地目录、项目源码
- Git 仓库:远程 Git 仓库(无需克隆)
- 虚拟机镜像:AWS EC2 AMI、Azure VM 等
- Kubernetes 集群:运行中的集群资源配置
2. 多维度安全检测
Trivy 能够发现以下类型的安全问题:
- 已知漏洞(CVE):基于 OS 包和软件依赖的漏洞数据库
- IaC 配置错误:Terraform、CloudFormation、Kubernetes YAML 等的最佳实践违规
- 敏感信息泄露:硬编码的 API 密钥、密码、令牌
- 软件许可证合规:识别项目中使用的开源许可证类型
- SBOM 生成:生成软件物料清单(Software Bill of Materials)
3. 易于集成
Trivy 提供丰富的集成选项:
- GitHub Actions:trivy-action
- Kubernetes Operator:trivy-operator
- VS Code 插件:trivy-vscode-extension
- CI/CD 平台:Jenkins、GitLab CI、CircleCI 等
4. 速度快、资源占用低
Trivy 使用 Go 语言编写,启动速度快,内存占用低,适合在 CI/CD 流水线中频繁运行。
安装 Trivy
Trivy 支持多种安装方式,以下是几种最常用的方法:
方法一:使用 Homebrew(macOS/Linux)
brew install trivy
方法二:使用 Docker
docker run aquasec/trivy --version
方法三:下载二进制文件
从 GitHub Releases 下载对应平台的二进制文件:
# Linux x86_64
wget https://github.com/aquasecurity/trivy/releases/download/v0.50.0/trivy_0.50.0_Linux-64bit.tar.gz
tar -xzf trivy_0.50.0_Linux-64bit.tar.gz
sudo mv trivy /usr/local/bin/
方法四:使用 apt/yum(Linux 发行版)
# Ubuntu/Debian
sudo apt-get install wget gnupg
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy
# CentOS/RHEL
sudo yum install trivy
验证安装
trivy --version
# 输出示例:Version: 0.50.0
快速上手:扫描第一个容器镜像
让我们从一个简单的例子开始——扫描一个公开的 Docker 镜像,看看 Trivy 能发现什么。
扫描 Python 官方镜像
trivy image python:3.9-slim
Trivy 会输出类似以下的结果:
python:3.9-slim (debian 11.7)
=====================================
Total: 123 (UNKNOWN: 0, LOW: 45, MEDIUM: 52, HIGH: 24, CRITICAL: 2)
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
| libssl1.1 | CVE-2023-5678 | CRITICAL | 1.1.1w-0+deb11u1 | 1.1.1w-0+deb11u2 | OpenSSL: X.509 Email Address ... |
| openssl | CVE-2023-6129 | HIGH | 1.1.1w-0+deb11u1 | 1.1.1w-0+deb11u2 | OpenSSL: POLY1305 MAC implementation... |
+------------------+---------------------+----------+-------------------+---------------+---------------------------------------+
输出包含以下关键信息:
- 漏洞总数:按严重程度分类(UNKNOWN、LOW、MEDIUM、HIGH、CRITICAL)
- 漏洞详情表:每个漏洞的库名、CVE ID、严重程度、当前版本、修复版本、漏洞描述
只输出高危和严重漏洞
在实际工作中,我们通常更关注高危和严重漏洞。可以使用 --severity 参数过滤:
trivy image --severity HIGH,CRITICAL python:3.9-slim
以 JSON 格式输出(便于自动化处理)
trivy image --format json python:3.9-slim > results.json
核心功能详解
1. 扫描文件系统
除了容器镜像,Trivy 还可以扫描本地文件系统,查找项目依赖中的漏洞。这对于在开发阶段早期发现安全问题非常有用。
# 扫描当前目录
trivy fs .
# 扫描指定目录
trivy fs /path/to/project
# 只扫描特定语言的依赖
trivy fs --scanners vuln --language python /path/to/project
Trivy 支持的语言包括:Python、Node.js、Java、Go、Ruby、PHP、.NET、Rust 等主流编程语言。
2. 扫描 Git 仓库
Trivy 可以直接扫描远程 Git 仓库,无需先克隆到本地:
# 扫描公共 GitHub 仓库
trivy repo https://github.com/aquasecurity/trivy
# 扫描指定分支
trivy repo https://github.com/aquasecurity/trivy@main
这对于审计第三方开源项目的安全性非常方便。
3. 扫描 Kubernetes 配置
Kubernetes 配置错误是导致安全事件的主要原因之一。Trivy 可以检查 Kubernetes YAML 文件是否符合安全最佳实践:
# 扫描单个 YAML 文件
trivy config deployment.yaml
# 扫描目录下的所有配置文件
trivy config ./k8s-manifests/
Trivy 会检测以下问题:
- 容器以 root 用户运行
- 未设置资源限制(CPU/内存)
- 使用了
latest标签 - 特权模式启用
- 敏感信息通过环境变量硬编码
示例输出:
k8s-manifests/deployment.yaml
=============================
Tests: 15 (SUCCESSES: 12, FAILURES: 3, EXCEPTIONS: 0)
Failures: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 1, HIGH: 1, CRITICAL: 0)
+-----------+------------+-----------------+----------+---------------------------------------+
| TYPE | MISCONF ID | CHECK | SEVERITY | MESSAGE |
+-----------+------------+-----------------+----------+---------------------------------------+
| Kubernetes| KSV012 | Image Tag | MEDIUM | Container 'app' uses 'latest' tag |
| Kubernetes| KSV001 | Privileged | HIGH | Container 'app' runs in privileged mode|
+-----------+------------+-----------------+----------+---------------------------------------+
4. 生成 SBOM(软件物料清单)
SBOM 是软件供应链安全的重要组成部分。Trivy 可以生成标准格式的 SBOM:
# 生成 SPDX 格式的 SBOM
trivy image --format spdx-json python:3.9-slim > sbom.spdx.json
# 生成 CycloneDX 格式的 SBOM
trivy image --format cyclonedx python:3.9-slim > sbom.cyclonedx.xml
生成的 SBOM 可以用于合规审计、漏洞影响分析等场景。
5. 检测敏感信息泄露
Trivy 可以扫描代码中是否包含硬编码的敏感信息(API 密钥、密码、令牌等):
trivy fs --scanners secret ./my-project
Trivy 内置了多种敏感信息检测规则,包括:
- AWS Access Key
- GitHub Token
- Slack Webhook URL
- Private Key
- Database Connection String
CI/CD 集成实战
将 Trivy 集成到 CI/CD 流水线是实现"安全左移"的关键步骤。以下是几种常见平台的集成示例。
GitHub Actions
在项目根目录创建 .github/workflows/trivy.yml:
name: Trivy Security Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
trivy-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: 'python:3.9-slim'
format: 'table'
severity: 'CRITICAL,HIGH'
exit-code: '1' # 发现高危漏洞时失败
这个工作流会在每次推送或 PR 时自动扫描指定的容器镜像,如果发现高危或严重漏洞,CI 会失败。
GitLab CI
在 .gitlab-ci.yml 中添加:
trivy-scan:
image:
name: aquasec/trivy:latest
entrypoint: [""]
script:
- trivy fs --exit-code 1 --severity HIGH,CRITICAL .
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Jenkins Pipeline
pipeline {
agent any
stages {
stage('Security Scan') {
steps {
sh '''
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image --exit-code 1 --severity HIGH,CRITICAL \
my-app:latest
'''
}
}
}
}
进阶用法
1. 忽略特定漏洞
有时某些漏洞在你的场景中不可利用,你可以创建 .trivyignore 文件来忽略它们:
# .trivyignore
CVE-2023-1234
CVE-2023-5678
或者使用 --ignorefile 参数指定自定义忽略文件:
trivy image --ignorefile .trivyignore python:3.9-slim
2. 缓存漏洞数据库
Trivy 默认每次扫描都会更新漏洞数据库,这在 CI/CD 环境中会导致额外的网络开销。你可以使用缓存来加速:
# 首次扫描时下载数据库
trivy image --download-db-only
# 后续扫描使用本地缓存
trivy image --skip-db-update python:3.9-slim
在 GitHub Actions 中,你可以使用 actions/cache 来持久化数据库:
- name: Cache Trivy DB
uses: actions/cache@v3
with:
path: ~/.cache/trivy
key: trivy-db-${{ hashFiles('~/.cache/trivy/db/trivy.db') }}
restore-keys: trivy-db-
3. 自定义报告模板
Trivy 支持使用 Go template 自定义输出格式:
trivy image --format template --template "@contrib/html.tpl" python:3.9-slim > report.html
Trivy 内置了几种模板:
@contrib/html.tpl:HTML 报告@contrib/junit.tpl:JUnit XML 格式(适合 CI/CD)@contrib/sarif.tpl:SARIF 格式(适合 GitHub Code Scanning)
4. 与 Trivy Operator 集成(Kubernetes)
对于运行中的 Kubernetes 集群,你可以部署 Trivy Operator 来持续监控集群中的安全风险:
helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm install trivy-operator aqua/trivy-operator --namespace trivy-system --create-namespace
Trivy Operator 会自动扫描集群中的工作负载,并将结果存储为 Kubernetes CRD,你可以在 Dashboard 中查看或通过 API 查询。
常见问题排查
问题 1:扫描速度慢
原因: 首次扫描需要下载漏洞数据库(约 100-200MB)。
解决方案: 使用 --skip-db-update 跳过数据库更新,或预先下载数据库:
trivy image --download-db-only
trivy image --skip-db-update python:3.9-slim
问题 2:误报过多
原因: Trivy 的漏洞数据库可能包含一些在你的场景中不可利用的漏洞。
解决方案: 使用 .trivyignore 文件忽略已知误报,或调整 --severity 参数只关注高危漏洞。
问题 3:私有镜像扫描失败
原因: Trivy 无法访问需要认证的私有镜像仓库。
解决方案: 设置环境变量或使用 --registry-token 参数:
export TRIVY_USERNAME=myuser
export TRIVY_PASSWORD=mypassword
trivy image registry.example.com/my-private-image:latest
问题 4:内存不足
原因: 扫描大型镜像或文件系统时可能消耗较多内存。
解决方案: 增加容器的内存限制,或使用 --light 模式减少内存占用:
trivy image --light python:3.9-slim
总结
Trivy 是一个功能强大且易于使用的开源安全扫描工具,它的核心价值在于:
- 全面性:支持多种扫描目标和检测类型,覆盖从代码到生产的全链路安全需求
- 易用性:简单的 CLI 接口,丰富的文档和社区支持
- 集成友好:原生支持主流 CI/CD 平台和 Kubernetes
- 性能优秀:Go 语言实现,启动快、资源占用低
对于任何重视安全的开发团队来说,将 Trivy 纳入日常开发流程都是一个明智的选择。它可以帮助你在早期发现并修复安全问题,降低生产环境中的安全风险。
下一步行动建议:
- 在你的本地开发环境中安装 Trivy,尝试扫描几个常用的容器镜像
- 将 Trivy 集成到你的 CI/CD 流水线中,设置适当的安全阈值
- 定期审查扫描结果,建立漏洞修复的工作流程
- 探索 Trivy Operator,为你的 Kubernetes 集群添加持续安全监控
Trivy 的官方文档位于 https://trivy.dev,GitHub 仓库地址是 https://github.com/aquasecurity/trivy。遇到问题时,你可以在这两个地方找到详细的文档和社区支持。
相关阅读: