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

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安全漏洞扫描工具的使用,更多使用方法得在不断实践中去探索。

相关文章:

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

开源地址&#xff1a;https://github.com/aquasecurity/trivy.git 可扫描的对象 容器镜像文件系统Git存储库&#xff08;远程&#xff09;虚拟机镜像Kubernetes 在容器镜像安全方面使用广泛&#xff0c;其他使用相对较少。 能够发现的问题 正在使用的操作系统包和软件依赖项…...

【实战中提升自己】内网安全部署之dot1x部署 本地与集成AD域的主流方式(附带MAC认证)

1 dot1x部署【用户名密码认证&#xff0c;也可以解决私接无线AP等功能】 说明&#xff1a;如果一个网络需要通过用户名认证才能访问内网&#xff0c;而认证失败只能访问外网与服务器&#xff0c;可以部署dot1x功能。它能实现的效果是&#xff0c;当内部用户输入正常的…...

[matlab]南海地形眩晕图代码

[matlab]南海地形眩晕图代码 请ChatGPT帮写个南海地形眩晕图代码 图片 图片 代码 .rtcContent { padding: 30px; } .lineNode {font-size: 12pt; font-family: "Times New Roman", Menlo, Monaco, Consolas, "Courier New", monospace; font-style: n…...

Web安全和渗透测试--day6--sql注入--part 1

场景&#xff1a; win11家庭版&#xff0c;edge浏览器 &#xff0c; sqlin靶场 定义&#xff1a; SQL 注入&#xff08;SQL Injection&#xff09;是一种常见的网络安全攻击方式&#xff0c;攻击者通过在 Web 应用程序中输入恶意的 SQL 代码&#xff0c;绕过应用程序的安全机…...

大模型在胆管结石(无胆管炎或胆囊炎)预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、胆管结石相关理论基础 2.1 胆管结石概述 2.2 临床表现与诊断方法 2.3 传统治疗方法 三、大模型技术原理与应用优势 3.1 大模型基本原理 3.2 在医疗领域的应用潜力 3.3 用于胆管结石预测的可…...

MIT6.S081-lab4

MIT6.S081-lab4 注&#xff1a;本篇lab的前置知识在《MIT6.S081-lab3前置》 1. RISC-V assembly 第一个问题 Which registers contain arguments to functions? For example, which register holds 13 in main’s call to printf? 我们先来看看main干了什么&#xff1a; …...

精通 Spring Cache + Redis:避坑指南与最佳实践

Spring Cache 以其优雅的注解方式&#xff0c;极大地简化了 Java 应用中缓存逻辑的实现。结合高性能的内存数据库 Redis&#xff0c;我们可以轻松构建出响应迅速、扩展性强的应用程序。然而&#xff0c;在享受便捷的同时&#xff0c;一些常见的“坑”和被忽视的最佳实践可能会悄…...

[SpringBoot]快速入门搭建springboot

默认有spring基础&#xff0c;不会一行代码一行代码那么细致地讲。 SpringBoot的作用 Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的。就像我们整个SSM框架时&#xff0c;就常常会碰到版本导致包名对不上、Bean非法参数类型的一系列问题&#xff08;原出…...

理解.NET Core中的配置Configuration

什么是配置 .NET中的配置&#xff0c;本质上就是key-value键值对&#xff0c;并且key和value都是字符串类型。 在.NET中提供了多种配置提供程序来对不同的配置进行读取、写入、重载等操作&#xff0c;这里我们以为.NET 的源码项目为例&#xff0c;来看下.NET中的配置主要是有…...

C++面试八股文:智能指针

一、了解哪些智能指针&#xff1f; 回答&#xff1a;智能指针是用于管理动态分配的内存&#xff0c;行为类似于指针&#xff0c;但又具有自动管理内存的能力&#xff0c;所以称为智能指针。 首先说一下 auto_ptr和unique_ptr&#xff0c;它们都是独占式指针&#xff0c;同一时…...

nohup命令使用说明

文章目录 如何在后台运行程序呢&#xff1f;如何正常运行代码重定向呢&#xff1f;nohup: ignoring input 如何在后台运行程序呢&#xff1f; 使用nohup命令即可&#xff0c; nohup python dataset/ReferESpatialDataset.py >>dataset_20250417.log 2>&1 &n…...

MYSQL “Too Many Connections“ 错误解决

1.查询当前连接数 show status like "Threads_connected"; 2.查询数据库最大连接数 show variables like "max_connections" 3.查询所有活动连接 show processlist; 4.根据查询结果观察是否有长时间未被释放的连接 参数解释 : 字段说明id连接的唯一…...

Linux `init 6` 相关命令的完整使用指南

Linux init 6 相关命令的完整使用指南—目录 一、init 系统简介二、init 6 的含义与作用三、不同 Init 系统下的 init 6 行为1. SysVinit&#xff08;如 CentOS 6、Debian 7&#xff09;2. systemd&#xff08;如 CentOS 7、Ubuntu 16.04&#xff09;3. Upstart&#xff08;如 …...

【外研在线-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

【NLP 63、大模型应用 —— Agent】

人与人最大的差距就是勇气和执行力&#xff0c;也是唯一的差距 —— 25.4.16 一、Agent 相关工作 二、Agent 特点 核心特征&#xff1a; 1.专有场景&#xff08;针对某个垂直领域&#xff09; 2.保留记忆&#xff08;以一个特定顺序做一些特定任务&#xff0c;记忆当前任务的前…...

React 打包

路由懒加载 原本的加载方式 #使用lazy()函数声明的路由页面 使用Suspense组件进行加载 使用CDN优化...

2025.4.14-2025.4.20学习周报

目录 摘要Abstract1. 文献阅读1.1 模型架构1.2 实验分析1.3 代码实践 总结 摘要 在本周阅读的论文中&#xff0c;作者提出了一种名为MGSFformer的空气质量预测模型。模型通过残差去冗余模块可以有效解耦多粒度数据间的信息重叠&#xff1b;时空注意力模块采用并行建模策略&…...

Spring 微服务解决了单体架构的哪些痛点?

1. 部署困难 (Deployment Difficulty & Risk) 单体痛点: 整体部署: 对单体应用的任何微小修改&#xff08;哪怕只是一行代码&#xff09;&#xff0c;都需要重新构建、测试和部署整个庞大的应用程序。部署频率低: 由于部署过程复杂且风险高&#xff0c;发布周期通常很长&a…...

【1】云原生,kubernetes 与 Docker 的关系

Kubernetes&#xff1f;K8s&#xff1f; Kubernetes经常被写作K8s。其中的数字8替代了K和s中的8个字母——这一点倒是方便了发推&#xff0c;也方便了像我这样懒惰的人。 什么是云原生&#xff1f; 云原生&#xff1a; 它是一种构建和运行应用程序的方法&#xff0c;它包含&am…...

Kubernetes控制平面组件:APIServer 限流机制详解

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

springboot全局异常捕获处理

一、需求 实际项目中&#xff0c;经常抛出各种异常&#xff0c;不能直接抛出异常给前端&#xff0c;这样用户体验相当不好&#xff0c;用户看不懂你的Exception,对于一些sql异常&#xff0c;直接抛到页面上也不安全。所以有没有好的办法解决这些问题呢&#xff0c;当然有了&am…...

Flask(1): 在windows系统上部署项目1

1 前言 学习python也有段时间了&#xff0c;最近一个小项目要部署&#xff0c;正好把过程写下来。 在程序的结构上我选择了w/s模式&#xff0c;相比于c/s模式&#xff0c;无需考虑客户端的升级&#xff1b;框架我选择了flask&#xff0c;就是冲着轻量级去的&#xff0c;就是插件…...

【文献阅读】EndoNet A Deep Architecture for Recognition Tasks on Laparoscopic Videos

关于数据集的整理 Cholec80 胆囊切除手术视频数据集介绍 https://zhuanlan.zhihu.com/p/700024359 数据集信息 Cholec80 数据集 是一个针对内窥镜引导 下的胆囊切除手术视频流程识别数据集。数据集提供了每段视频中总共7种手术动作及总共7种手术工具的标注&#xff0c;标…...

基于springboot的个人财务管理系统的设计与实现

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…...

Linux系统编程---孤儿进程与僵尸进程

1、前言 在上一篇博客文章已经对Linux系统编程内容进行了较为详细的梳理&#xff0c;本文将在上一篇的基础上&#xff0c;继续梳理Linux系统编程中关于孤儿进程和僵尸进程的知识脉络。如有疑问的博客朋友可以通过下面的博文链接进行参考学习。 Linux系统编程---多进程-CSDN博客…...

简单使用MCP

简单使用MCP 1 简介 模型上下文协议&#xff08;Model Context Protocol&#xff0c;MCP&#xff09;是由Anthropic&#xff08;产品是Claude&#xff09;推出的开放协议&#xff0c;它规范了应用程序如何向LLM提供上下文。MCP可帮助你在LLM之上构建代理和复杂的工作流。 从…...

Semaphore的核心机制

在 Java 中&#xff0c;Semaphore 通过 许可计数器 和 同步队列 的机制实现并发线程数的限制。以下是其核心实现原理和步骤的详细分析&#xff1a; 一、核心机制 许可计数器&#xff08;Permits&#xff09; • 初始化时指定的许可数&#xff08;如 new Semaphore(3)&#xff0…...

计算机视觉与深度学习 | RNN原理,公式,代码,应用

RNN(循环神经网络)详解 一、原理 RNN(Recurrent Neural Network)是一种处理序列数据的神经网络,其核心思想是通过循环连接(隐藏状态)捕捉序列中的时序信息。每个时间步的隐藏状态 ( h_t ) 不仅依赖当前输入 ( x_t ),还依赖前一时间步的隐藏状态 ( h_{t-1} ),从而实现…...

Keil MDK 编译问题:last line of file ends without a newline

问题与处理策略 问题描述 ..\..\User\main.c(38): warning: #1-D: last line of file ends without a newline} ..\..\User\main.c: 1 warning, 0 errors问题原因 这是文件末尾缺少换行符警告 处理策略 在文件&#xff08;main.c&#xff09;的最后一行按回车键添加一个空…...

MySQL:9.表的内连和外连

9.表的内连和外连 表的连接分为内连和外连 9.1 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;之前查询都是内连 接&#xff0c;也是在开发过程中使用的最多的连接查询。 语法&#xff1a; select 字段 from 表1 inner join 表2 on 连接…...