主题
Trivy容器安全扫描进阶指南: 从命令行到可视化分析报告
一. Trivy 简介
Trivy是一个简单而全面的漏洞/错误配置扫描器,作为 Aqua Security 开发的开源安全扫描工具,Trivy 专注于检测容器镜像、文件系统、代码仓库等场景中的安全漏洞、配置错误及敏感信息泄露问题。
1.1 主要特性
全面的漏洞检测能力:
- 操作系统(OpenEuler、Alpine、Red Hat Universal Base Image、Red Hat Enterprise Linux、CentOS、Oracle Linux、Debian、Ubuntu、Amazon Linux、openSUSE Leap、SUSE Enterprise Linux)
- 语言(Bundler、Composer、Pipenv、Poetry、npm、yarn、Cargo、NuGet、Maven 和 Go)
检测 IaC 错误配置:
Kubernetes
Docker
Terraform
易于使用:
扫描快且无状态,第一次扫描将在 10 秒内完成(取决于您的网络)
随后的扫描将在一秒钟内完成
只需安装二进制文件,就可以开始扫描
1.2 工作原理
Trivy 漏洞扫描原理简单来说就是:Trivy 下载漏洞数据库 CVE 到本地,Trivy 本地数据库记录了常见的漏洞信息,Trivy 读取镜像里的程序和本地数据库进行比对,确定镜像是否存在漏洞。
二. Trivy 安装方法
2.1 二进制安装
#下载加速地址:
[root@openeuler ~]# wget https://github.com/aquasecurity/trivy/releases/download/v0.65.0/trivy_0.65.0_Linux-64bit.tar.gz
[root@openeuler ~]# tar -xf trivy_0.65.0_Linux-64bit.tar.gz
[root@openeuler ~]# mv ./trivy /usr/local/bin/
[root@openeuler ~]# chmod +x /usr/local/bin/trivy
[root@openeuler ~]# which trivy
/usr/local/bin/trivy
2.2 验证安装
bash
$ trivy -v
Version: 0.65.0
三. Trivy 漏洞库配置
3.1 官方漏洞库说明
Trivy 依赖于以下数据库:
Trivy 的数据库发布到以下位置:
3.2 使用oras下载离线漏洞数据库
Trivy DB v2托管在GHCR上。虽然GitHub默认显示 docker pull
命令,但请注意,它不能使用 docker pull
下载,因为它不是容器映像。
官方推荐使用 oras
工具 去下载漏洞库。
oras 是一个开源项目,是 Open Container Initiative (OCI) 的一个子项目,用于定义和实现容器镜像的存储和传输规范。它提供了一个统一的标准,使得容器镜像可以在不同的容器运行时中进行共享和交换。oras 支持将容器镜像存储在各种不同的后端存储系统中,如容器注册表、对象存储等,并提供了用于上传、下载和管理容器镜像的工具和库。oras 旨在提供一个开放、灵活和可扩展的容器镜像存储和传输解决方案,使得容器技术更加便捷和可移植。
[root@openeuler ~]# wget https://github.com/oras-project/oras/releases/download/v1.2.3/oras_1.2.3_linux_amd64.tar.gz
[root@openeuler ~]# tar -xf oras_1.2.3_linux_amd64.tar.gz
[root@openeuler ~]# mv oras /usr/local/bin/
[root@openeuler ~]# chmod +x /usr/local/bin/oras
[root@openeuler ~]# which oras
/usr/local/bin/oras
- 离线库下载地址:
官方的下载地址:
oras pull ghcr.io/aquasecurity/trivy-db:2
oras pull ghcr.io/aquasecurity/trivy-java-db:1
毫秒镜像下载地址:
oras pull ghcr.1ms.run/aquasecurity/trivy-db:2
oras pull ghcr.1ms.run/aquasecurity/trivy-java-db:1
- 编写离线库下载脚本,定义缓存路径
#创建缓存目录
mkdir -p /home/application/trivy-db/{db,java-db}
# 清空 db 目录下的内容
rm -rf /home/application/trivy-db/db/*
# 清空 java-db 目录下的内容
rm -rf /home/application/trivy-db/java-db/*
# 下载离线库文件
cd /home/application/trivy-db/
oras pull ghcr.1ms.run/aquasecurity/trivy-db:2
sleep 10
oras pull ghcr.1ms.run/aquasecurity/trivy-java-db:1
# 解压 jdb.tar.gz 文件到 java-db 目录
tar -xvf /home/application/trivy-db/javadb.tar.gz -C /home/application/trivy-db/java-db
# 解压 db.tar.gz 文件到 db 目录
tar -xvf /home/application/trivy-db/db.tar.gz -C /home/application/trivy-db/db
# 删除压缩包文件
rm -f /home/application/trivy-db/javadb.tar.gz
rm -f /home/application/trivy-db/db.tar.gz
四. Trivy 使用
4.1 直接扫描容器镜像
--cache-dir
,指定指定漏洞数据库的本地缓存目录,默认在是~/.cache/trivy
下--skip-db-update
, 扫描启动的时候,会检查本地漏洞库。我们已经配置了离线库了,所以要跳过。--skip-java-db-update
同样java 的漏洞库,会检查本地漏洞库。我们已经配置了离线库了,所以要跳过。--severity CRITICAL
, 指定扫描的严重程度,分为,CRITICAL[紧急],HIGH[高的],MEDIUM[中等],LOW[低的]
--vuln-type
, 指定想要扫描的漏洞种类 ,os
仅扫描目标(比如容器镜像或文件系统)中操作系统包含的已知漏洞;library
应用程序库的漏洞扫描;-f
,指定输出的格式,默认的输出格式是 table, 以表格的形式显示扫描结果。 以json 格式输出,配合 -o 输出文件 ,如 trivy -f json -o nginx.json--ignore-unfixed
, 会忽略那些当前没有可用修复的已知漏洞。
bash
# 扫描 Nginx 镜像
$ trivy --cache-dir /home/application/trivy-db image nginx --skip-db-update --skip-java-db-update
# 扫描 tomcat 镜像, 以 json 格式输出,并指定漏洞等级为CRITICAL
$ trivy --cache-dir /home/application/trivy-db image tomcat --skip-db-update --skip-java-db-update --severity CRITICAL -f json
4.2 指定配置文件扫描容器镜像
上面的CLI 命令行中,我们自定义了很多配置项,其实这些配置可以定义在配置文件中。
默认情况下,名为 trivy.yaml
的配置文件是从运行 Trivy 的当前目录中读取的。优先级最高⭐️
如果要从其他文件加载配置,请使用 --config
标志并指定要加载的配置路径: trivy --config /home/application/trivy-db/trivy.yaml
。
这里我演示下我的本地配置文件,他的路径存放在/home/application/trivy-db/trivy.yaml
下
cache:
dir: "/home/application/trivy-db"
timeout: 10m
format: table
exit-code: 1
scan:
scanners:
- vuln
- secret
db:
java-skip-update: true
skip-update: true
vulnerability:
type:
- os
- library
ignore-unfixed: flase
- 使用 CLI 命令行再次扫描
- ⚠️
trivy.yaml
的配置文件是从运行 Trivy 的当前目录中读取的,要保证当前目录有trivy.yaml
的配置文件
#切换到配置文件目录下
$ cd /home/application/trivy-db
#开始扫描,无需其他配置
$ trivy image nginx
五. 安装Trivy 官方插件之scan2html
scan2html 是一个优秀的 Trivy 插件,它可以将 Trivy 的扫描结果(包括漏洞、配置错误、密钥、SBOM 等)输出为交互式的 HTML 文件 ,这个插件让扫描结果更加直观和易于分析。
5.1 主要功能
- 支持漏洞、配置错误、密钥、许可证扫描结果的可视化
- 生成交互式 HTML 报告
- 支持漏洞利用信息展示
- 可以从多个 JSON 扫描结果文件生成单一报告
5.2 安装 scan2html 插件
可以在此处找到通过 trivy-plugin-index 分发的 Trivy 插件列表。https://aquasecurity.github.io/trivy-plugin-index/
- 在线搜索插件
bash
$ trivy plugin search
如果在网络中使用代理,则需要正确设置 HTTP_PROXY
、HTTPS_PROXY
等环境变量, 并使用--insecure
忽略不安全的 https 证书
- 在线安装插件
# 使用代理
trivy plugin install scan2html --insecure
- 列出所有已安装的插件
$ trivy plugin list
- 列出 scan2html 插件的使用说明
$ trivy scan2html --help
- 容器扫描-使用方法
$ trivy scan2html image --scanners vuln,secret,misconfig,license nginx --scan2html-flags --output nginx-report.html
5.4 使用scan2html 插件扫描容器,并生成 html 报告
- 扫描一个 kafka 容器
#切换到配置文件目录下
$ cd /home/application/trivy-db
# 使用scan2html 插件扫描容器
trivy scan2html image --scanners vuln,secret,misconfig,license docker.cnb.cool/srebro/docker-images/kafka-kraft:3.9.1 --scan2html-flags --output kafka-report.html
六. 安装非Trivy 官方插件
6.1 trivy-plugin-report 插件介绍
trivy-plugin-report 是一个可以将 Trivy 输出的 JSON 格式的报告转换为 EXCEL 文件和 markdown 的插件。
6.2 安装方法
通过指定指定 项目的URL来安装插件。
如果在网络中使用代理,则需要正确设置 HTTP_PROXY
、HTTPS_PROXY
等环境变量, 并使用--insecure
忽略不安全的 https 证书
bash
$ trivy plugin install github.com/miao2sec/trivy-plugin-report --insecure
6.2 使用方法
- 生成 EXCEL 表格,并命名为
tomcat-export.xlsx
#切换到配置文件目录下
$ cd /home/application/trivy-db
$ trivy image -f json tomcat | trivy report --excel-file tomcat-export.xlsx
- 使用
--beautify
将 EXCEL 表格美化。即,根据漏洞的威胁等级填充背景色,tomcat-export-beautify.xlsx
#切换到配置文件目录下
$ cd /home/application/trivy-db
$ trivy image -f json tomcat | trivy report --excel-file tomcat-export-beautify.xlsx --beautify
- 生成 Markdown 文档,并命名为
tomcat-report.md
$ trivy image -f json tomcat | trivy report --markdown-file tomcat-report.md
- 使用
--brief
将 Markdown 简化。即,去除漏洞描述和相关链接。
$ trivy image -f json tomcat | trivy report --markdown-file tomcat-report-1.md --brief
七. 注意事项
- 在执行
trivy plugin update
之后,已安装的插件会被删除掉? 没搞懂啥意思
八. 总结
Trivy 作为一个功能强大且易于使用的容器安全扫描工具,配合官方插件 和 社区插件 可以为开发团队提供直观、详细的安全报告。通过本文介绍的安装和使用方法,您可以快速在项目中集成容器安全扫描,提升应用的整体安全性。
建议在实际使用中根据项目需求调整扫描策略,并建立完善的安全修复流程,确保容器应用的安全性。