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 时踩得几个坑,后续遇到其他问题再重新记录。

