目录
快速入门
Trivy工作原理
cve ID和CVE数据库
个人理解:
当有人发现漏洞时,在社区提交漏洞,然后被cve 官方数据库收录,分配cve id。
漏洞扫描工具扫描镜像内的组件/库的包的版本,然后再去官方数据库检索,当检索到当前镜像内的组件/库的版本 在 官方数据库有漏洞记录,就列出漏洞列表(cve id列表)。
疑问:如果是这样,我还有个疑问,我们都组件和库,如果安装到不是默认的目录,比如/home/mydir它是不是就扫描不到了。
大佬答疑:
原理是端口扫描和漏洞库对比,跟病毒扫描一样,流程:发现并连接目标主机→发送get请求→接受返回数据→根据返回数据对比漏洞库
第一阶段:发现目标主机或网络。
第二阶段:发现目标后进一步搜集目标信息,包括操作系统类型、运行的服务以及服务软件的版本等。如果目标是一个网络,还可以进一步发现该网络的拓扑结构、路由设备以及各主机的信息。
第三阶段:根据搜集到的信息判断或者进一步测试系统是否存在安全漏洞。网络安全漏洞扫描技术包括有 PING 扫射(Ping sweep)、操作系统探测 (Operating system identification)、如何探测访问控制规则 (firewalking)、端口扫描 (Port scan)以及漏洞扫描 (vulnerability scan)等。这些技术在网络安全漏洞扫描的三个阶段中各有体现。
网络安全漏洞扫描技术的两大核心技术就是端口扫描技术和漏洞扫描技术,这两种技术广泛运用于当前较成熟的网络扫描器。
疑问:
1、“发现目标后进一步搜集目标信息”,这样的话目标主机需要安装trivy吗?不然谁给它响应get请求和返回数据?
2、“搜集目标信息,包括操作系统类型、运行的服务以及服务软件的版本”、“根据返回数据对比漏洞库”,请问它是如何知道要搜集哪些信息的,比如它报了我的镜像里面的go的一个net包有风险,要求我升级到最新版本。 我很好奇,它是怎么知道我的服务器上有这个go的net包,并且知道这个包的版本 然后和数据库上的版本进行对比。
回答:
您的两个疑问,其实指向一个问题:该工具的扫描范围以及扫描工具的扫描引擎的能力,如果您学过开发,可以搜一下看它的执行代码是怎样的,否则只需要知道它能支持扫什么对象就可以的。注:trivy是个开源工具
疑问:
该工具的扫描范围 是配置的吗?
“搜集目标信息,包括操作系统类型、运行的服务以及服务软件的版本”、“根据返回数据对比漏洞库”,请问它是如何知道要搜集哪些信息的,比如它报了我的镜像里面的go的一个net包有风险,要求我升级到最新版本。 我很好奇,它是怎么知道我的服务器上有这个go的net包,并且知道这个包的版本 然后和数据库上的版本进行对比。
对于开源工具,没有范围一说,可在源代码上开发成您想要的样子。如图是该工具基础架构图,底层是扫描器,中间是下载完该工具就能支持的扫描对象类型。扫描器扫描你的系统漏洞、系统配置、弱密码等系统文件,比对工具中的特征库,特征不相同就产生相应的日志(扫描结果)。
Trivy扫描镜像流程
扫描逻辑其实很简单的,首先需要获取镜像中的各种资产信息(OSPackage等)
然后需要根据(镜像的OS信息 + pkg信息) 查询相关的待选CVE
然后在匹配当前的pkg的版本号,是不是CVE中fixed的版本号,如果不是就记录该CVE
如果想要魔改或者抽取,建议直接看,从image获取pkg信息 以及 根据OS以及pkg查询CVE 这两个函数
摘抄自:javascript:void(0)
快速入门
https://github.com/aquasecurity/trivy
Trivy 是一种适用于 CI 的简单而全面的容器漏洞扫描程序。软件漏洞是指软件或操作系统中存在的故障、缺陷或弱点。Trivy 检测操作系统包(Alpine、RHEL、CentOS等)和应用程序依赖(Bundler、Composer、npm、yarn等)的漏洞。
Trivy 很容易使用,只要安装二进制文件,就可以扫描了。扫描只需指定容器的镜像名称。与其他镜像扫描工具相比,例如 Clair,Anchore Engine,Quay 相比,Trivy 在准确性、方便性和对 CI 的支持等方面都有着明显的优势。
推荐在 CI 中使用它,在推送到 Container Registry 之前,您可以轻松地扫描本地容器镜像,Trivy具备如下的特征:
1. 检测面很全,能检测全面的漏洞,操作系统软件包(Alpine、Red Hat Universal Base Image、Red Hat Enterprise Linux、CentOS、Oracle Linux、Debian、Ubuntu、Amazon Linux、openSUSE Leap、SUSE Enterprise Linux、Photon OS 和 Distrioless)、应用程序依赖项(Bundler、Composer、Pipenv、Poetry、npm、yarn 和 Cargo);
2. 使用简单,仅仅只需要指定镜像名称;
3. 扫描快且无状态,第一次扫描将在 10 秒内完成(取决于您的网络)。随后的扫描将在一秒钟内完成。与其他扫描器在第一次运行时需要很长时间(大约10分钟)来获取漏洞信息,并鼓励您维护持久的漏洞数据库不同,Trivy 是无状态的,不需要维护或准备;
4. 易于安装,安装方式:
- $ apt-get install trivy
- $ yum install trivy
- $ brew install trivy
无需安装数据库、库等先决条件(例外情况是需要安装 rpm 以扫描基于 RHEL/CentOS 的图像)。
Trivy 的安装
这里安装 Trivy 的环境是 Centos7,安装的版本是 0.16.0,安装的命令如下:
- $ wget https://github.com/aquasecurity/trivy/releases/download/v0.16.0/trivy_0.16.0_Linux-64bit.rpm
- $ rpm -ivh trivy_0.16.0_Linux-64bit.rpm
- 准备中... ################################# [100%]
- 正在升级/安装...
- 1:trivy-0:0.16.0-1 ################################# [100%]
- $ trivy -v
- Version: 0.16.0
Trivy 的简单使用
下面介绍一些 Trivy 的简单使用的命令和一些测试的结果。主要从几个方面来测试 Trivy 的性能指标:
- 镜像大小对 Trivy 扫描速度的影响;
- 扫描的镜像大小和网络流量使用情况的关系;
- 扫描的结果是否容易解析;
镜像大小对 Trivy 扫描速度的影响
- 当镜像位于本地,大小 90MB 左右时候的扫描:
执行命令:
- $ trivy registry.cn-hangzhou.aliyuncs.com/choerodon-tools/javabase:0.5.0
扫描结果:
时间:第一次扫描会 DownLoad DB,大概花十分钟以内(14M,看网速),国外的主机 10s 以内,第二次扫描十秒钟以内完成。
- 当镜像位于本地,大小 408MB 左右时候的扫描:
执行命令:
- $ trivy registry.cn-hangzhou.aliyuncs.com/choerodon-tools/mysql:5.7.17
执行结果:
时间:10秒左右。
- 当扫描的镜像位于线上,大小为 316M 左右时候的扫描:
执行结果:
时间:20s左右
结论:本地扫描镜像的大小对扫描速度影响不大,线上扫描与本地扫描的方式对扫描的速度影响不大。
扫描的镜像大小和网络流量使用情况的关系
- 线上扫描之前网络流量使用情况:
扫描镜像大小:316M 左右
- 扫描之后服务器的磁盘,网络流量使用情况:
结论:接收到的网络流量等于线上镜像的大小,镜像被下载放在服务器磁盘的某处(目前本服务器未装 Docker)。
注:再次全量扫描相同的镜像,接收流量和磁盘使用占比均不再增加。
扫描的结果是否容易解析
- 使用 JSON 输出扫描的结果:
扫描镜像,openjdk:15-ea-jdk-buster
大小:316M 左右
时间:10s 左右
返回结果:标准的 josn 格式的文件
其他更多可使用命令
1. 扫描镜像文件
- $ docker save ruby:2.3.0-alpine3.9 -o ruby-2.3.0.tar
- $ trivy --input ruby-2.3.0.tar
2. 按严重性筛选漏洞:
- $ trivy -–severity HIGH,CRITICAL ruby:2.3.0
3. 按类型筛选漏洞:
- $ trivy -–vuln-type os ruby:2.3.0
4. 跳过漏洞数据库的更新
Trivy 在开始运行时总是更新其漏洞数据库。这通常很快,因为这是一个差异更新。但是,如果您甚至想跳过这一步,请使用 -–skip update 选项。
- $ trivy -–skip-update python:3.4-alpine3.9
5. 仅下载漏洞数据库
您还可以要求 Trivy 简单地检索漏洞数据库。这对于初始化连续集成系统中的工作人员非常有用。在第一次运行中,-–only update 选项将被忽略。
- $ trivy -–download-db-only
- $ trivy -–download-db-only -–only-update alpine
6. 忽略未修复的漏洞
默认情况下,Trivy 还会检测未修补/未修复的漏洞。这意味着即使更新了所有包,也无法修复这些漏洞。如果要忽略它们,请使用 -–ignore unfixed 选项。
- $ trivy –-ignore-unfixed ruby:2.3.0
7. 指定退出代码
默认情况下,即使检测到漏洞,Trivy 也会以代码 0 退出。如果要使用非零退出代码退出,请使用 -–exit code 选项。此选项对 CI/CD 很有用。在下面的示例中,仅当发现关键漏洞时,测试才会失败。
- $ trivy -–exit-code 1 python:3.4-alpine3.9
- $ trivy -–exit-code 0 –severity MEDIUM,HIGH ruby:2.3.0
- $ trivy -–exit-code 1 –severity CRITICAL ruby:2.3.0
8. 忽略指定的漏洞
- $ cat .trivyignore
- CVE-2018-14618
- CVE-2019-1543
- $ trivy python:3.4-alpine3.9
9. 指定缓存目录:
- $ trivy -–cache-dir /tmp/trivy/ python:3.4-alpine3.9
10.清除镜像缓存
-–clear cache 选项删除镜像缓存。如果更新具有相同 tag 的镜像(例如使用最新 tag 时),此选项非常有用。
- $ trivy -–clear-cache
--reset 选项删除所有缓存和数据库。在此之后,需要很长时间才能在本地重建漏洞数据库。
- $ trivy -–reset
11.使用轻量级数据库:
- $ trivy -–light alpine:3.10
轻量级数据库不包含诸如描述和引用之类的漏洞详细信息。因此,数据库的大小更小,下载速度更快。当您不需要漏洞详细信息时,此选项非常有用,并且适用于CI/CD。
要查找其他信息,可以在 NVD 网站上搜索漏洞详细信息。
网站地址:https://nvd.nist.gov/vuln/search
将 Trivy 集成进 CI
Trivy 有对 CI 友好的特点,并且官方也以这种方式使用它,想要集成 CI 只需要一段简单的 Yml 配置文件即可,如果发现漏洞,测试将失败。如果不希望测试失败,请指定 –exit code 0。由于在自动化场景(如CI/CD)中,您只对最终结果感兴趣,而不是对完整的报告感兴趣,因此请使用 –light 标志对此场景进行优化,以获得快速的结果。
集成 GitLab CI 的 Yml 配置可以参考:https://github.com/aquasecurity/trivy#gitlab-ci
使用注意点
- 国内拉取漏洞数据库慢。
- 同一台服务器,多个镜像扫描的时候不可并行执行。
- 可以使用 -–light 使用轻量级数据库来优化执行扫描的效率。