trivy
trivy 扫描工具踩坑记录
介绍
trivy
是一个镜像扫描工具,用于扫描 docker image
是否有漏洞。现在最新版本不仅支持 image
扫描,也有了其他功能。
基础使用
1 | 扫描镜像,并按照模板内容输出json格式 |
其他的用法在官方文档中有比较详细的记载,我这里就不摘抄了,着重记录一下踩坑后的记录
踩坑记录
基于
docker
的trivy
使用时,如何保存数据库,而不是每次重新下载
最初使用时,按照教程,直接通过docker run aquasec/trivy image nginx
这种方式,他需要下载一个内置数据库
。
按照文档所说(文档是英文,有点理解不到位),我尝试通过挂载容器中/root/.trivy
路径来保留缓存
。但是发现并没生效。
后来发现实际的默认数据库路径
在/tmp
下,为了防止每次执行都重新下载,我自己构建了一个trivy:with_db
镜像。
在这个镜像中,通过docker run -v /tmp/cache:/data/cache aquasec/trivy --cache-dir /data/cache image nginx
自定义了一个cache
路径,用于存储数据库
。
但是在使用中又发现,不止有一个基础库
,还有一个java
相关的库,所以这里又重新构建了一次镜像。
如果后续有相同需求,第一次打包镜像的时候就要下载好两个基础库
。自己创建一个
db
镜像
官方文档里边有些,可以指定外部数据库
,这样就不需要上一步中的操作,只需要直接在扫描时指定db
源即可。
查看了github
上有关trivy_db
的仓库,他虽然有一个docker image
,但是并不是一个可以直接使用的镜像,具体使用方法还没研究透,至此自己创建db
镜像的想法搁置了。
搭建一个
trivy
服务
按照1
中的方案,每次扫描的时候,只需要调用自己构建的images
并指定缓存路径
就可以。
但是作为一个安全工具,trivy
的数据库是动态更新的。官方每12小时
会更新自己的数据库,所以如果你的缓存数据库
时间过久就需要在扫描之前更新数据库
。
当然可以通过类似--skip-db-update
的参数进行跳过,但是最新的安全漏洞就无法扫描了。
如果每次扫描镜像之前都更新一下基础镜像
也是不现实的,首先很多生产环境是纯内网的,无法在ci
过程中进行数据库更新
,再就是这就会拉长整个扫描的时间。
后来在文档在发现trivy
支持server模式
,客户端只需要将镜像推给server
,server
就可以对镜像进行扫描。
这种模式下只要保持server
是最新的数据库
就可以。server
模式下的docker login
在使用server
之后,又有了一个问题就是怎么让server
也能访问私有仓库
中的image
。
尝试了各种方式,各种位置的docker login
之后,发现了trivy
文档中早就给出了解决方案。只需要添加username
和password
即可。
以上就是在使用 trivy
时踩得几个坑,后续遇到其他问题再重新记录。