Trivy 概述
Trivy(tri 发音为 trigger,vy 发音为 envy)是一个简单而全面的漏洞/错误配置扫描器,用于容器和其他工件。 软件漏洞是软件或操作系统中存在的故障、缺陷或弱点。 Trivy 检测操作系统包(Alpine、RHEL、CentOS 等)和特定语言包(Bundler、Composer、npm、yarn 等)的漏洞。 此外,Trivy 会扫描基础设施即代码 (IaC) 文件,例如 Terraform 和 Kubernetes,以检测使你的部署面临攻击风险的潜在配置问题。 Trivy 易于使用。 只需安装二进制文件,你就可以开始扫描了。 扫描所需要做的就是指定一个目标,例如容器的图像名称。

Trivy 检测两种类型的安全问题
- 漏洞
- 配置错误
Trivy 可以扫描三种不同的工件
- 容器镜像
- 文件系统
- Git存储库
Trivy 可以在两种不同的模式下运行
独立
客户端服务器
它旨在用于 CI。在推送到容器注册表或部署应用程序之前,你可以轻松扫描本地容器映像和其他工件。
Trivy 安装
参考:https://aquasecurity.github.io/trivy/v0.41/getting-started/installation/
1 | # 脚本方式安装,以0.41.0为例 |
容器镜像漏洞扫描
只需指定镜像仓库(和tag)
1 | # trivy image nginx:1.16 |
trivy image [IMAGE_NAME]
漏洞等级
- CRITICAL
- HIGH
- MEDIUM
- LOW
文件系统漏洞扫描
扫描文件系统(例如主机、虚拟机映像或解压缩的容器映像文件系统)
1 | trivy fs /application/zookeeper/ |
Git 存储库漏洞扫描
扫描远程 git 存储库
1 | trivy repo https://github.com/kubernetes/kubernetes.git |
Trivy 过滤漏洞
隐藏未修复得漏洞
默认情况下, Trivy还会检测未修补/未修复的漏洞。这意味着即使你更新所有软件包,你也无法修复这些漏洞。如果你想忽略它们,请使用该--ignore-unfixed选项。
1 | trivy image --ignore-unfixed nginx:1.16 |
按扫描类型筛选
使用--scanners选项,常用value值包含vuln,config(在0.50以上较新版本中由misconfig替代),secret
1 | trivy image --scanners vuln,config,secret nginx:1.16 |
按严重程度
使用--severity选项
1 | trivy image --severity HIGH,CRITICAL nginx:1.16 |
指定退出代码
默认情况下,即使检测到漏洞,Trivy 也会以代码 0 退出。如果要使用非零退出代码退出,请使用 -–exit code 选项。此选项对 CI/CD 很有用。在下面的示例中,仅当发现关键漏洞时,测试才会失败。
1 | trivy -–exit-code 1 python:3.4-alpine3.9 |
漏洞数据库
跳过漏洞数据库得更新
--skip-db-update
Trivy开始运行时每 12 小时下载一次漏洞数据库。这通常很快【补充:如果处于国内环境可能会很慢,可通过配置 repository: ghcr.m.daocloud.io/aquasecurity/trivy-db换成国内源】,因为数据库的大小只有 10~30MB。但是如果想跳过它,可以使用--skip-db-update选项。
1 | trivy image --skip-db-update nginx:1.16 |
只下载漏洞数据库
--download-db-only
1 | trivy image --download-db-only |
轻量级数据库
--light
轻量级数据库不包含漏洞详细信息,例如描述和参考。因此,DB 的大小更小,下载速度更快,以优化执行扫描的效率。
当你不需要漏洞详细信息并且适用于 CI/CD 时,此选项很有用。要查找其他信息,可以在 NVD 网站上搜索漏洞详细信息。https://nvd.nist.gov/vuln/search
1 | trivy image --light nginx:1.16 |
--light 选项不会像下面的例子那样显示标题。
实战
全局配置文件配置
参考:https://aquasecurity.github.io/trivy/v0.41/docs/references/configuration/config-file/
1 | mkdir -p /usr/local/src/trivy/ && cd /usr/local/src/trivy/ && vim /usr/local/src/trivy/trivy.yaml |
定期执行更新db操作
1 | chown -R gitlab-runner:gitlab-runner /home/gitlab-runner/.cache/ |
gitlab-ci整合
参考:https://aquasecurity.github.io/trivy/v0.41/tutorials/integrations/gitlab-ci/
1 | stages: |
插件
trivy-plugin-sonarqube
项目地址:https://github.com/umax/trivy-plugin-sonarqube
用于将JSON报告转换为SonarQube格式。用Trivy扫描项目依赖关系,并通过
sonar.externalIssuesReportPaths将结果发布到SonarQube并展示
安装
install plugin:
1 | trivy plugin install github.com/umax/trivy-plugin-sonarqube |
check the installation:
1 | trivy plugin list |
NOTE: you need Python interpreter installed to be able to run plugin.
使用
fs/image/git方式都支持,按如下修改即可
- 原有指令后新增两个参数
1 | ... |
- 正常流程结束后,新增一条指令
1 | trivy sonarqube trivy-deps-report.json > sonar-deps-report.json |
最终格式参考:https://github.com/umax/trivy-plugin-sonarqube?tab=readme-ov-file#gitlab-ci
注:如果以
trivy image方式执行,需要修改上步中的新增指令,添加一个-- filepath={Dockerfile路径}
1 | trivy sonarqube trivy-deps-report.json -- filePath=Dockerfile > sonar-deps-report.json |
- 然后在执行sonar-scan指令时,使用参数
sonar.externalIssuesReportPaths将结果发布到sonarqube即可
1 | sonar-scanner -D sonar.externalIssuesReportPaths="sonar-deps-report.json" ... |
- 样例
1 | trivy-check: |