7

head.png

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
    • yum install
    • brew install

无需安装数据库、库等先决条件(例外情况是需要安装rpm以扫描基于RHEL/CentOS的图像)。

Trivy的安装

这里安装Trivy的环境是Centos7,安装的版本是0.4.4,安装的命令如下:

rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.4.4/trivy_0.4.4_Linux-64bit.rpm

安装结果如下图所示即安装成功:

image

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格式的文件

图片

  • 其他更多使用命令如下,结果可自行测试:

    • 按严重性筛选漏洞:

$ trivy --severity HIGH,CRITICAL ruby:2.3.0

  • 按类型筛选漏洞:

$ trivy --vuln-type os ruby:2.3.0

  • 跳过漏洞数据库的跟新:Trivy在开始运行时总是更新其漏洞数据库。这通常很快,因为这是一个差异更新。但是,如果您甚至想跳过这一步,请使用--skip update选项。

$ trivy --skip-update python:3.4-alpine3.9

  • 仅下载漏洞数据库:您还可以要求Trivy简单地检索漏洞数据库。这对于初始化连续集成系统中的工作人员非常有用。在第一次运行中,--only update选项将被忽略。

$ trivy --download-db-only

$ trivy --download-db-only --only-update alpine

  • 忽略未修复的漏洞:默认情况下,Trivy还会检测未修补/未修复的漏洞。这意味着即使更新了所有包,也无法修复这些漏洞。如果要忽略它们,请使用--ignore unfixed选项。

$ trivy --ignore-unfixed ruby:2.3.0

  • 指定退出代码:默认情况下,即使检测到漏洞,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

  • 忽略指定的漏洞:

$ cat .trivyignore

CVE-2018-14618

CVE-2019-1543

$ trivy python:3.4-alpine3.9

  • 指定缓存目录:

$ trivy --cache-dir /tmp/trivy/ python:3.4-alpine3.9

  • 清除镜像缓存:--clear cache选项删除镜像缓存。如果更新具有相同tag的图像(例如使用最新tag时),此选项非常有用。

$ trivy --clear-cachez

  • --reset选项删除所有缓存和数据库。在此之后,需要很长时间才能在本地重建漏洞数据库。

$ trivy --reset

  • 使用轻量级数据库:

$ trivy --light alpine:3.10

轻量级数据库不包含诸如描述和引用之类的漏洞详细信息。因此,数据库的大小更小,下载速度更快。

当您不需要漏洞详细信息时,此选项非常有用,并且适用于CI/CD。

要查找其他信息,可以在NVD网站上搜索漏洞详细信息。(https://nvd.nist.gov/vuln/search网站

不推荐使用的选项:

--only-update,--refresh并且--auto-refresh被废弃了,因为他们现在是不必要的。这些选项将在下一版本中删除。

将Trivy集成进CI

Trivy有对CI友好的特点,并且官方也以这种方式使用它,想要集成CI只需要一段简单的Yml配置文件即可,如果发现漏洞,测试将失败。如果不希望测试失败,请指定--exit code 0。由于在自动化场景(如CI/CD)中,您只对最终结果感兴趣,而不是对完整的报告感兴趣,因此请使用--light标志对此场景进行优化,以获得快速的结果。

集成GitLab CI的Yml配置可以参考:

https://github.com/aquasecurity/trivy#gitlab-ci

使用注意点

  • 国内拉取漏洞数据库慢。
  • 同一台服务器,多个镜像扫描的时候不可并行执行。
  • 可以使用--light使用轻量级数据库来优化执行扫描的效率。
参考资料:https://github.com/aquasecurity/trivy

本篇文章出自Choerodon猪齿鱼社区汪翔。


ZKNOW甄知科技
1.5k 声望946 粉丝

上海甄知科技有限公司(简称甄知科技)是一家服务管理数字化领先企业,由业界知名的数字化服务综合提供商上海汉得信息技术股份有限公司(股票代码:300170)孵化而成,承袭汉得信息20年的企业信息化服务经验和对...