一、概要
Trivy是一个简单易用并且全面的容器漏洞扫描程序。
Trivy可检测操作系统软件包(Alpine,RHEL,CentOS等)和应用程序依赖项(Bundler,Composer,npm,yarn等)的漏洞。
Trivy很容易使用,只要安装二进制文件,就可以扫描了。扫描只需指定容器的镜像名称。与其他镜像扫描工具相比,例如Clair,Anchore Engine,Quay相比,Trivy在准确性、方便性和对CI的支持等方面都有着明显的优势。
二、Trivy的安装
从官方网站下载RPM包安装,或者直接拉取docker镜像安装
https://github.com/aquasecurity/trivy
三、Trivy的使用命令
直接扫描镜像
trivy elasticsearch:7.10
输出如下
按严重性级别筛选漏洞
trivy --severity HIGH,CRITICAL ruby:2.3.0
按漏洞类型筛选漏洞
trivy --vuln-type os ruby:2.3.0
忽略指定的漏洞(使用.trivyignore文件)
$ cat .trivyignore
CVE-2018-14618
CVE-2019-1543
结果输出为json文件
trivy -f json -o results.json golang:1.12-alpine
指定缓存目录
trivy --cache-dir /tmp/trivy/ python:3.4-alpine3.9
清除镜像缓存
删除镜像缓存。如果更新具有相同tag的图像(例如使用最新tag时),此选项非常有用。
trivy --clear-cache
删除所有缓存和数据库
trivy --reset
使用轻量级数据库
trivy --light alpine:3.10
轻量级数据库不包含诸如描述和引用之类的漏洞详细信息。因此,数据库的大小更小,下载速度更快。
当您不需要漏洞详细信息时,此选项非常有用,并且适用于CI/CD。
四、C/S模式
上面我们展示的是单机模式的情况,如果一些客户端例如,CICD runner等可以以C/S模式运行。这样就不需要去下载漏洞数据库了。
服务器端Server需要使用如下命令开启,并指定端口和TOKEN
/usr/local/bin/trivy server --listen 0.0.0.0:8080 --token ipcpuchines
客户端Client在调用时指定服务器地址和TOKEN就可以了
trivy client --remote http://aq.ipcpu.com:8080 --token ipcpuchines alpine:3.10
五、数据库更新问题
Trivy启动以后会去github加载漏洞库数据,并且每个一段时间(6小时)会自动更新。但是很多时候我们连不上github。
会出现下面的报错:
2021-12-14T13:57:17.606+0800 FATAL DB error: failed to download vulnerability DB: failed to download vulnerability DB: failed to list releases: Get "https://api.github.com/repos/aquasecurity/trivy-db/releases": dial tcp 192.30.255.117:443: connect: connection timed out
下面有两个办法给大家:
第一个是使用离线模式
从下面的地址下载离线数据包,解压以后放置到缓存目录中(默认是"/root/.cache/trivy")
https://github.com/aquasecurity/trivy-db/releases/
启动Trivy扫描时还要加上--skip-update 参数。
这个后期还是有些复杂,过段时间--skip-update也不行了,需要手动更新下离线数据包。
第二个就是直接给Trivy设置代理
例如我的systemd文件就是这样设置的
[Service]
Type=simple
Environment="HTTP_PROXY=http://172.28.9.46:10802/"
Environment="HTTPS_PROXY=http://172.28.9.46:10802/"
Environment="NO_PROXY=localhost,127.0.0.1,.ipcpu.com"
ExecStart=/usr/local/bin/trivy server --listen 0.0.0.0:8080 --token ipcpuchines
六、错误返回码和Gitlab CICD集成
默认情况下,即使检测到漏洞,Trivy 也会以代码 0 退出。如果要使用非零退出代码退出,需要使用 --exit code 选项。此选项对 CI/CD 很有用。我们以GitlabCICD为例,仅当发现关键漏洞时,测试才会失败。
# Fail on severe vulnerabilities
- ./trivy client --remote http://10.140.100.35:8080 --token ipcpuchines --exit-code 1 --no-progress --severity CRITICAL $IMAGE
转载请注明:IPCPU-网络之路 » Docker镜像漏洞扫描工具Trivy