当前位置: 首页 > java >正文

trivy开源安全漏洞扫描器——筑梦之路

开源地址:https://github.com/aquasecurity/trivy.git

可扫描的对象

  • 容器镜像
  • 文件系统
  • Git存储库(远程)
  • 虚拟机镜像
  • Kubernetes

在容器镜像安全方面使用广泛,其他使用相对较少。 

能够发现的问题

  • 正在使用的操作系统包和软件依赖项 (SBOM);
  • 已知漏洞 (CVE);
  • IaC 问题和错误配置;
  • 敏感信息和机密;
  • 软件许可证。

漏洞扫描原理

 Trivy通过分析容器镜像的文件系统,识别出其中的软件包及其版本号,然后与漏洞数据库进行匹配,找出存在安全漏洞的软件包。Trivy采用了以下技术实现漏洞扫描:

  1. Dockerfile解析:Trivy可以根据Dockerfile自动解析出容器镜像的构建过程,获取镜像中包含的软件包及其版本号。

  2. 漏洞数据库匹配:Trivy将容器镜像中的软件包及其版本号与漏洞数据库进行匹配,找出存在安全漏洞的软件包。

  3. 漏洞详情展示:Trivy提供了详细的漏洞信息,包括漏洞描述、影响版本、修复建议等,帮助用户了解漏洞风险。

CVE全称是Common Vulnerabilities and Exposures,即通用漏洞披露,它是MITRE公司维护和更新的安全漏洞列表,列表中的每个条目都会有一个唯一的CVE编号,即CVE ID,供安全研究员和受攻击的软件供应商使用,以便确定和回应安全漏洞。CVE条目包含了与CVE ID相关的漏洞的描述性数据(即简要描述和至少一个参考)。当前CVE累计收录了19万+个安全漏洞。

Trivy漏洞扫描原理简单来说就是:Trivy下载漏洞数据库CVE到本地,Trivy本地数据库记录了常见的漏洞信息,Trivy读取镜像里的程序和本地数据库进行比对,确定镜像是否存在漏洞

环境搭建

1. 二进制方式安装

https://github.com/aquasecurity/trivy/releases/download/v0.61.1/trivy_0.61.1_Linux-64bit.tar.gztar -zxvf  trivy_0.61.1_Linux-64bit.tar.gz -C /usr/local/bin/chmod +x /usr/local/bin/trivytrivy -v

2. 二进制rpm包方式安装

https://github.com/aquasecurity/trivy/releases/download/v0.61.1/trivy_0.61.1_Linux-64bit.rpmrpm  -ivh  trivy_0.61.1_Linux-64bit.rpmtrivy  -v

3. 离线漏洞数据库

trivy-db,是一个包含漏洞数据库的开源项目,用于帮助开发人员和安全团队识别容器镜像中的漏洞。它可以与 trivy 工具配合使用,帮助用户快速发现容器镜像中存在的安全漏洞,并提供修复建议。trivy-db 中包含了各种已知的漏洞信息,Trivy在内部使用 trivy-db 来操作漏洞数据库。此数据库包含来自NVD、Red Hat、Debian等的漏洞信息。用户可以通过更新 trivy-db 来获取最新的漏洞数据以保持镜像的安全性

trivy-java-db 是 Trivy 工具的一个组件,用于存储 Java 相关的漏洞数据库。Trivy 是一个开源的漏洞扫描工具,用于帮助用户检测容器镜像中的安全漏洞。trivy-java-db 会包含 Java 相关的漏洞信息,用户可以通过更新 trivy-java-db 来获取最新的漏洞数据以保持镜像的安全性。这个组件可以帮助用户识别容器镜像中与 Java 相关的漏洞,并提供修复建议,以提高容器镜像的安全性。 

https://github.com/oras-project/oras.git

使用oras下载离线漏洞数据库# 二进制方式安装https://github.com/oras-project/oras/releases/download/v1.2.2/oras_1.2.2_linux_amd64.tar.gzVERSION="1.2.2"
curl -LO "https://github.com/oras-project/oras/releases/download/v${VERSION}/oras_${VERSION}_linux_amd64.tar.gz"
mkdir -p oras-install/
tar -zxf oras_${VERSION}_*.tar.gz -C oras-install/
sudo mv oras-install/oras /usr/local/bin/
rm -rf oras_${VERSION}_*.tar.gz oras-install/# 获取trivy漏洞数据库离线包# 官网oras pull ghcr.io/aquasecurity/trivy-db:2
oras pull ghcr.io/aquasecurity/trivy-java-db:1tar -zxvf db.tar.gz -C ~/.cache/trivy/db/
tar -zxvf javadb.tar.gz -C ~/.cache/trivy/java-db/# 国内加速oras pull ghcr.nju.edu.cn/aquasecurity/trivy-db:2
oras pull ghcr.nju.edu.cn/aquasecurity/trivy-java-db:1

trivy使用示例

1. 容器镜像扫描

# 默认扫描,默认以table格式输出trivy  image nginx可选参数:--cache-dir ,指定漏洞数据库的本地缓存目录,默认在是 ~/.cache/trivy 下--skip-db-update, 扫描启动的时候,会检查本地漏洞库。如果超过 12 小时为更新,会自动下载更新漏洞库。由于官方漏洞库放在 github,下载比较慢,可以使用 --skip-db-update 跳过这一过程。--skip-java-db-update 同样java 的漏洞库,每周四凌晨自动更新,也是存在github上,以使用--skip-java-db-update 跳过这一过程。--severity CRITICAL , 指定扫描的严重程度,分为,CRITICAL[紧急],HIGH[高的],MEDIUM[中等],LOW[低的]# 以json格式输出结果trivy image -f json -o results.json nginx:1.16# 扫描结果以html格式保存到文件trivy image --severity HIGH,CRITICAL,MEDIUM debian:stable-slim --format template --template "@/usr/local/share/trivy/templates/html.tpl" -o  debian_report.html# 指定漏洞数据库目录、漏洞级别、跳过更新数据库trivy --cache-dir /home/application/trivy-db image nginx:1.25 --skip-db-update --severity CRITICAL,HIGH# 扫描镜像离线包trivy --input [image_name.tar]# 漏洞类型过滤trivy --vuln-type os [image_name]  # 旧版trivy image --scanners vuln --pkg-types os --severity HIGH,CRITICAL,MEDIUM debian:stable-slim# 只更新某个系统的漏洞数据库trivy --only-update alpine,debia [image_name]# 指定退出代码,主要是为后续判断提供可操作性,通常在CI中集成trivy --exit-code 1 [image_name]# 清除漏洞数据库缓存trivy --clear-cache [image_name]# 重建漏洞数据库trivy --reset  [image_name]# 忽略未修复的安全漏洞trivy image --ignore-unfixed  [image_name]

2. 文件系统扫描

trivy fs --scanners vuln --pkg-types os --severity HIGH,CRITICAL,MEDIUM /trivy rootfs --exit-code 1--no-progress / # 对jar包进行扫描
trivy rootfs --skip-db-update --offline-scan  --dependency-tree --timeout 999m /root/code/xxxxxx-web.jar -o /root/code/trivy_扫描结果.txt

3. 代码仓库扫描

trivy repo https://github.com/test/text.gittrivy repo https://github.com/test/text.git --ignore-unfixedtrivy repo https://github.com/test/text.git --format template --template "@./trivy/contrib/html.tpl" -o  qapm_report.html

4. 虚拟机镜像扫描

# 虚拟机磁盘文件trivy vm --scanners vuln disk.vmdk# AMItrivy vm ami:${your_ami_id}trivy vm --scanners vuln ami:ami-0123456789abcdefg

5. K8S扫描

trivy k8s [flags] [CONTEXT] -  if the target name [CONTEXT] is not specified, the default will be used.trivy k8s --report summarytrivy k8s --kubeconfig ~/.kube/config2trivy k8s --report summary --skip-imagestrivy k8s --report summary --skip-imagestrivy k8s --report summary --exclude-namespace dev-system,staging-systemtrivy k8s --scanners vuln  --report all

harbor与trivy集成

# 修改harbor.yml配置#配置trivy相关配置,设置离线配置
trivy:ignore_unfixed: falseskip_update: trueskip_java_db_update: trueoffline_scan: truesecurity_check: vulninsecure: false# 安装时加上参数./install.sh --with-trivy

Jenkins CI/CD集成trivy

Jenkins上安装 HTML Publisher 插件,此插件是用来将构建生成的 HTML 报告发布到作业和构建页面,可方便我们进行查阅

  • --skip-db-update 跳过数据库的更新
  • --exit-code 指定退出状态码
  • --severity 指定漏洞严重级别
  • --cache-dir 指定缓存目录

官方html模板:

https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/html.tpl

pipeline流水线示例

pipeline {agent anystages {stage('镜像安全扫描') {steps{script { def formatOption = "--format template --template \"@/opt/jenkins/html.tpl\""sh("""trivy image --skip-db-update --exit-code 1 --severity CRITICAL <IMAGES>:<TAG> --cache-dir trivy_db $formatOption --timeout 10m --output trivy.html""")// reportDir 报告所在目录;reportFiles 报告名称;reportName 在Jenkins菜单栏显示的名称 ;reportTitles 点进报告显示的TitlepublishHTML (target : [allowMissing: false,alwaysLinkToLastBuild: true,keepAll: true,reportDir: '.',reportFiles: "trivy.html",reportName: 'Trivy Scan',reportTitles: 'Trivy Scan'])}}}}
}

 这里简单地学习了下trivy安全漏洞扫描工具的使用,更多使用方法得在不断实践中去探索。

http://www.xdnf.cn/news/642.html

相关文章:

  • 【21天学习打卡挑战赛】如何学习WEB安全:逼自己在短时间掌握WEB安全核心内容
  • 深入理解 CICD 与 Jenkins 流水线:从原理到实践
  • Python 项目环境配置与 Vanna 安装避坑指南 (PyCharm + venv)
  • 机器学习中的“三态模型“:过拟合、欠拟合和刚刚好
  • WordPress按分类ID调用该分类的内容数量
  • 【网络】数据链路层知识梳理
  • Vue3项目自定义全局防抖节流
  • Linux命令-Shell编程
  • 星拍相机APP:时尚与科技的完美融合,打造你的专属美
  • 【Docker项目实战】使用Docker部署Jupyter Notebook服务
  • go语言对http协议的支持
  • 对象多态与行为多态
  • 网络开发基础(游戏)之 二进制数据处理
  • SSM(SpringMVC+spring+mybatis)整合的步骤以及相关依赖
  • JVM垃圾回收器整理
  • Oracle EBS COGS Recognition重复生成(一借一贷)
  • Docker Registry(镜像仓库)
  • Linux网络编程 TCP---并发服务器:多进程架构与端口复用技术实战指南
  • OpenCV 高斯模糊 cv2.GaussianBlur
  • k8s 基础入门篇之开启 firewalld
  • 网络原理 - 应用层, 传输层(UDP 和 TCP) 进阶, 网络层, 数据链路层 [Java EE]
  • 为什么this与super不能出现在同一构造器的原因
  • 计算机视觉与深度学习 | Transformer原理,公式,代码,应用
  • 深度解析算法之前缀和
  • 【中间件】nginx将请求负载均衡转发给网关,网关再将请求转发给对应服务
  • 26考研 | 王道 | 数据结构 | 第六章 图
  • 重构之去除多余的if-else
  • AWS Linux快速指南:5分钟搭建多用户图形界面
  • Unity游戏开发实战:从PlayerPrefs到JSON,精通游戏存档与加载机制
  • 软件测试的页面交互标准:怎样有效提高易用性