概述

Trivy(tri 发音为 trigger,vy 发音为 envy)是一个简单而全面的安全扫描器,专注于容器和其他工件的漏洞/错误配置检测。

核心特点:

  • 🔍 简单易用,只需安装二进制文件即可开始扫描
  • 🛡️ 全面检测操作系统和语言包漏洞
  • ⚙️ 支持基础设施即代码(IaC)配置检测
  • 🚀 适用于 CI/CD 流程集成

官方资源:

核心功能

检测类型

Trivy 检测两种主要的安全问题:

类型说明示例
漏洞软件或操作系统中的缺陷、弱点CVE 漏洞、过时的依赖包
配置错误部署配置中的安全隐患IaC 文件中的不安全配置

扫描目标

Trivy 可以扫描三种不同的工件:

容器镜像:

  • 📦 Docker 镜像
  • 🔍 检测系统包和应用依赖漏洞
  • ✅ 支持多种镜像仓库

文件系统:

  • 💾 主机文件系统
  • 🖥️ 虚拟机镜像
  • 📂 解压的容器文件系统

Git 存储库:

  • 🔗 远程 Git 仓库
  • 📁 本地代码库
  • 🔍 IaC 文件扫描

运行模式

Trivy 支持两种运行模式:

模式适用场景特点
独立模式本地快速扫描简单直接,无需额外配置
客户端-服务器模式CI/CD 集成集中管理,适合大规模部署

安装部署

脚本安装

推荐方式(指定版本):

1
2
3
4
5
# 安装指定版本(以 v0.41.0 为例)
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
# 扫描 nginx 1.16 镜像
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
# 扫描本地 Git 目录
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
# 只显示 HIGH 和 CRITICAL 级别
trivy image --severity HIGH,CRITICAL nginx:1.16

# 只显示 CRITICAL 级别
trivy image --severity CRITICAL nginx:1.16

指定退出代码

CI/CD 集成关键功能:

1
2
3
4
5
6
7
8
# 发现任何漏洞时退出码为 1
trivy image --exit-code 1 python:3.4-alpine3.9

# 只有发现 CRITICAL 漏洞时退出码为 1
trivy image --exit-code 1 --severity CRITICAL ruby:2.3.0

# 发现 MEDIUM/HIGH 漏洞时退出码为 0(不中断流程)
trivy image --exit-code 0 --severity MEDIUM,HIGH ruby:2.3.0

CI/CD 应用示例:

1
2
3
4
5
6
7
# 在 CI 中如果发现严重漏洞则失败
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:
# 使用 DaoCloud 镜像
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
# 静默模式(减少输出)
# 默认: false
quiet: false

# 调试模式
# 默认: false
debug: false

# 跳过 TLS 验证
# 默认: false
insecure: true

# 扫描超时时间
# 默认: 5m
timeout: 60m

# 缓存目录配置
cache:
# Trivy 默认缓存: $HOME/.cache/trivy
# 这里使用 gitlab-runner 用户目录以便 CI/CD 集成
dir: /home/gitlab-runner/.cache/trivy

# 漏洞数据库全局配置
db:
# 是否跳过数据库更新
# 默认: false
skip-update: false

# 是否不显示进度条
# 默认: false
no-progress: false

# 数据库仓库地址
# 默认: ghcr.io/aquasecurity/trivy-db
# 国内环境推荐使用 DaoCloud 镜像
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
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/

任务说明:

  1. 📥 下载最新漏洞数据库
  2. 👤 修改文件所有者为 gitlab-runner
  3. 🔒 设置适当的文件权限

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

# 扫描出 HIGH 级别漏洞则构建失败
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 集成

安装插件

前提条件:

  • Python 解释器

安装步骤:

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
# 文件系统/Git 仓库扫描
trivy sonarqube trivy-deps-report.json > sonar-deps-report.json

容器镜像扫描(需指定 Dockerfile 路径):

1
2
# 镜像扫描需要指定 Dockerfile
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 扫描并生成报告
trivy-check:
stage: trivy-check
script:
# 生成 JSON 报告
- 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

# 转换为 SonarQube 格式
- 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

# SonarQube 扫描
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

性能优化

加快扫描速度:

  1. 📥 使用 --skip-db-update(定时更新数据库)
  2. 💾 配置本地缓存目录
  3. 🚀 使用轻量级数据库(--light
  4. 🌐 配置国内镜像源

减少误报:

  1. ✅ 使用 --ignore-unfixed 忽略无法修复的漏洞
  2. 📝 创建 .trivyignore 文件忽略特定漏洞
  3. 🎯 根据实际情况调整严重程度阈值

安全建议

扫描频率:

  • 🔄 每次代码提交触发扫描
  • 📅 定期(每周/每月)全面扫描
  • 🚀 部署前必须扫描

漏洞处理:

  • 🚨 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

参考资源

官方文档

社区资源