概述
Trivy(tri 发音为 trigger,vy 发音为 envy)是一个简单而全面的安全扫描器,专注于容器和其他工件的漏洞/错误配置检测。
核心特点:
- 🔍 简单易用,只需安装二进制文件即可开始扫描
- 🛡️ 全面检测操作系统和语言包漏洞
- ⚙️ 支持基础设施即代码(IaC)配置检测
- 🚀 适用于 CI/CD 流程集成
官方资源:

核心功能
检测类型
Trivy 检测两种主要的安全问题:
| 类型 | 说明 | 示例 |
|---|
| 漏洞 | 软件或操作系统中的缺陷、弱点 | CVE 漏洞、过时的依赖包 |
| 配置错误 | 部署配置中的安全隐患 | IaC 文件中的不安全配置 |
扫描目标
Trivy 可以扫描三种不同的工件:
容器镜像:
- 📦 Docker 镜像
- 🔍 检测系统包和应用依赖漏洞
- ✅ 支持多种镜像仓库
文件系统:
- 💾 主机文件系统
- 🖥️ 虚拟机镜像
- 📂 解压的容器文件系统
Git 存储库:
- 🔗 远程 Git 仓库
- 📁 本地代码库
- 🔍 IaC 文件扫描
运行模式
Trivy 支持两种运行模式:
| 模式 | 适用场景 | 特点 |
|---|
| 独立模式 | 本地快速扫描 | 简单直接,无需额外配置 |
| 客户端-服务器模式 | CI/CD 集成 | 集中管理,适合大规模部署 |
安装部署
脚本安装
推荐方式(指定版本):
1 2 3 4 5
| curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v0.41.0
trivy --version
|
其他安装方式:
参考 官方安装文档
基础使用
容器镜像扫描
基本扫描
语法格式:
1
| trivy image [IMAGE_NAME]
|
示例:
1 2 3 4 5
| trivy image nginx:1.16
trivy image myregistry.com/myimage:tag
|
漏洞严重程度
Trivy 将漏洞分为四个等级:
| 等级 | 说明 | 影响 |
|---|
| CRITICAL | 严重漏洞 | 需立即修复 |
| HIGH | 高危漏洞 | 应优先修复 |
| MEDIUM | 中危漏洞 | 建议修复 |
| LOW | 低危漏洞 | 可延后修复 |
文件系统扫描
扫描本地文件系统:
1 2 3 4 5 6 7 8
| trivy fs /application/zookeeper/
trivy fs .
trivy fs /
|
应用场景:
- 🔍 扫描虚拟机镜像
- 📦 检查解压的容器文件系统
- 💻 审计主机环境
Git 存储库扫描
扫描远程仓库:
1 2 3 4 5
| trivy repo https://github.com/kubernetes/kubernetes.git
trivy repo https://github.com/myorg/private-repo.git
|
扫描本地仓库:
1 2
| trivy repo /path/to/local/repo
|
高级过滤
隐藏未修复的漏洞
问题: 某些漏洞可能暂时没有可用的补丁。
解决方案:
1 2
| trivy image --ignore-unfixed nginx:1.16
|
按扫描类型过滤
使用 --scanners 选项:
| 扫描类型 | 说明 | 参数值 |
|---|
| 漏洞扫描 | 检测已知漏洞 | vuln |
| 配置扫描 | 检测配置错误 | config(新版本用 misconfig) |
| 密钥扫描 | 检测敏感信息 | secret |
示例:
1 2 3 4 5 6 7 8
| trivy image --scanners vuln,config,secret nginx:1.16
trivy image --scanners vuln nginx:1.16
trivy image --scanners config nginx:1.16
|
按严重程度过滤
只关注高危和严重漏洞:
1 2 3 4 5
| trivy image --severity HIGH,CRITICAL nginx:1.16
trivy image --severity CRITICAL nginx:1.16
|
指定退出代码
CI/CD 集成关键功能:
1 2 3 4 5 6 7 8
| trivy image --exit-code 1 python:3.4-alpine3.9
trivy image --exit-code 1 --severity CRITICAL ruby:2.3.0
trivy image --exit-code 0 --severity MEDIUM,HIGH ruby:2.3.0
|
CI/CD 应用示例:
1 2 3 4 5 6 7
| if trivy image --exit-code 1 --severity CRITICAL myimage:latest; then echo "扫描通过" else echo "发现严重漏洞,构建失败" exit 1 fi
|
漏洞数据库管理
跳过数据库更新
场景: 网络环境受限或需要加快扫描速度
1 2
| trivy image --skip-db-update nginx:1.16
|
注意事项:
- ⚠️ 可能导致漏洞信息不是最新
- 💡 适合网络环境较差的情况
- 🔄 建议定期手动更新数据库
国内加速:
Trivy 默认每 12 小时更新一次漏洞数据库。在国内环境可能较慢,可配置国内镜像源:
1 2 3
| db: repository: ghcr.m.daocloud.io/aquasecurity/trivy-db
|
只下载数据库
1 2
| trivy image --download-db-only
|
应用场景:
- 📥 预先下载数据库
- 🔄 定时更新数据库
- 🚀 准备离线扫描环境
轻量级数据库
特点:
- 📦 数据库更小(不包含漏洞详细描述)
- ⚡ 下载速度更快
- 🎯 适合 CI/CD 快速扫描
1 2
| trivy image --light nginx:1.16
|
对比:
| 模式 | 数据库大小 | 包含详情 | 适用场景 |
|---|
| 标准模式 | 10-30MB | 完整描述 | 详细分析 |
| 轻量级模式 | < 10MB | 仅 ID 和级别 | CI/CD 快速扫描 |
获取漏洞详情:
生产实战配置
全局配置文件
配置文件路径: /usr/local/src/trivy/trivy.yaml
1 2 3 4 5 6
| mkdir -p /usr/local/src/trivy/ cd /usr/local/src/trivy/
vim trivy.yaml
|
完整配置示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
quiet: false
debug: false
insecure: true
timeout: 60m
cache: dir: /home/gitlab-runner/.cache/trivy
db: skip-update: false
no-progress: false
repository: ghcr.m.daocloud.io/aquasecurity/trivy-db
|
配置说明:
| 配置项 | 说明 | 推荐值 |
|---|
timeout | 扫描超时时间 | 60m(大型镜像需要更长时间) |
cache.dir | 缓存目录 | 根据运行用户设置 |
db.repository | 数据库源 | 国内使用镜像源 |
定期更新数据库
设置定时任务:
1 2 3 4 5
| chown -R gitlab-runner:gitlab-runner /home/gitlab-runner/.cache/
crontab -e
|
添加定时任务:
1 2
| # 每天凌晨 4:30 更新数据库并赋权 30 04 * * * trivy image --download-db-only --config /usr/local/src/trivy/trivy.yaml && chown -R gitlab-runner:gitlab-runner /home/gitlab-runner/.cache/trivy/db/ && chmod -R 755 /home/gitlab-runner/.cache/trivy/db/
|
任务说明:
- 📥 下载最新漏洞数据库
- 👤 修改文件所有者为 gitlab-runner
- 🔒 设置适当的文件权限
GitLab CI/CD 集成
基础集成
参考文档: Trivy GitLab CI 集成教程
示例配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| stages: - check
trivy-check: stage: check script: - trivy fs --skip-db-update --exit-code 1 --severity HIGH --scanners vuln . tags: - check only: - /^dev.*/ - /^release-.*/ - master
|
配置解析:
--skip-db-update: 跳过数据库更新(假设已定时更新)--exit-code 1: 发现漏洞时失败--severity HIGH: 只关注 HIGH 级别漏洞--scanners vuln: 仅扫描漏洞.: 扫描当前目录
高级集成示例
完整的扫描流程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| stages: - trivy-check - build - deploy
trivy-check: stage: trivy-check script: - trivy image --skip-db-update --exit-code 0 --severity HIGH,CRITICAL --scanners vuln,config,secret --format json --output trivy-report.json $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG - trivy image --skip-db-update --exit-code 1 --severity CRITICAL --scanners vuln $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG tags: - trivy-check only: - master - /^release-.*/ allow_failure: false artifacts: paths: - trivy-report.json expire_in: 30 days when: always
|
SonarQube 集成
trivy-plugin-sonarqube 插件
项目地址: trivy-plugin-sonarqube
功能:
- 🔄 将 Trivy JSON 报告转换为 SonarQube 格式
- 📊 在 SonarQube 中展示漏洞信息
- 🎯 通过
sonar.externalIssuesReportPaths 集成
安装插件
前提条件:
安装步骤:
1 2 3 4 5
| trivy plugin install github.com/umax/trivy-plugin-sonarqube
trivy plugin list
|
使用方法
步骤一:生成 Trivy 报告
修改原有扫描命令,添加输出参数:
1 2 3
| --format=json \ --output=trivy-deps-report.json
|
步骤二:转换为 SonarQube 格式
基本转换:
1 2
| trivy sonarqube trivy-deps-report.json > sonar-deps-report.json
|
容器镜像扫描(需指定 Dockerfile 路径):
1 2
| trivy sonarqube trivy-deps-report.json -- filePath=Dockerfile > sonar-deps-report.json
|
步骤三:集成到 SonarQube
在 sonar-scanner 命令中添加参数:
1 2 3
| sonar-scanner \ -D sonar.externalIssuesReportPaths="sonar-deps-report.json" \ ...其他参数...
|
完整集成示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| stages: - trivy-check - sonar-scan
trivy-check: stage: trivy-check script: - trivy image --skip-db-update --exit-code 0 --severity HIGH,CRITICAL --scanners vuln,config,secret --format json --output trivy-deps-report.json $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG - trivy sonarqube trivy-deps-report.json -- filePath=Dockerfile > sonar-deps-report.json tags: - trivy-check only: - master allow_failure: true artifacts: paths: - trivy-deps-report.json - sonar-deps-report.json expire_in: 7 days
sonar-scan: stage: sonar-scan dependencies: - trivy-check script: - sonar-scanner -D sonar.projectKey=$CI_PROJECT_NAME -D sonar.sources=. -D sonar.host.url=$SONAR_HOST_URL -D sonar.login=$SONAR_TOKEN -D sonar.externalIssuesReportPaths="sonar-deps-report.json" tags: - sonar-scan only: - master
|
最佳实践
扫描策略
本地开发:
1 2
| trivy image --severity CRITICAL --ignore-unfixed myimage:latest
|
CI/CD 流程:
1 2 3 4 5 6 7
| trivy image \ --severity HIGH,CRITICAL \ --scanners vuln,config,secret \ --format json \ --output report.json \ myimage:latest
|
生产部署前:
1 2 3 4 5 6
| trivy image \ --exit-code 1 \ --severity CRITICAL \ --ignore-unfixed \ myimage:latest
|
性能优化
加快扫描速度:
- 📥 使用
--skip-db-update(定时更新数据库) - 💾 配置本地缓存目录
- 🚀 使用轻量级数据库(
--light) - 🌐 配置国内镜像源
减少误报:
- ✅ 使用
--ignore-unfixed 忽略无法修复的漏洞 - 📝 创建
.trivyignore 文件忽略特定漏洞 - 🎯 根据实际情况调整严重程度阈值
安全建议
扫描频率:
- 🔄 每次代码提交触发扫描
- 📅 定期(每周/每月)全面扫描
- 🚀 部署前必须扫描
漏洞处理:
- 🚨 CRITICAL:立即修复
- ⚠️ HIGH:优先修复(1-7天内)
- 📝 MEDIUM:计划修复(按版本规划)
- 💡 LOW:可延后处理
故障排查
常见问题
数据库下载失败:
1 2 3 4
|
db: repository: ghcr.m.daocloud.io/aquasecurity/trivy-db
|
权限问题:
1 2 3 4
|
chown -R $USER:$USER ~/.cache/trivy chmod -R 755 ~/.cache/trivy
|
扫描超时:
1 2 3
|
trivy image --timeout 30m large-image:latest
|
参考资源
官方文档
社区资源