当前位置:   article > 正文

Docker镜像安全扫描工具_代码安全扫描工具 docker镜像

代码安全扫描工具 docker镜像

                                                                                                                ----Clair-scanner

                                                                                                                ----Trivy

                                                                                                                ----Gripe

                                                                                                                ----Dockerscan

一、背景

镜像是容器的最基础的载体,docker是流行的runtime,其最大的贡献就是把镜像作为容器应用的标准交付方式,镜像包含了容器运行的所有基础文件,可以说镜像的安全决定了容器的安全。

但镜像本质上来说是一个静态文件,由很多层构成,只要其中一层发现漏洞,就会对应用服务造成威胁。目前Docker Hub上的镜像76%都存在漏洞,针对这些安全漏洞,安全前移是目前最主流的治理思路,希望镜像在进入生产环境前尽量解决安全问题,所以在镜像进入仓库之前扫描镜像,定位漏洞格外重要。

二、镜像扫描工具

2.1 Clair-scanner

2.1.1 Clair原理

Clair是CoreOS官方推出的容器静态安全漏洞扫描工具,该工具被多款docker registry成,比如Harbor、dockyard、quary等。

架构图如下:

图一:Clair整体架构图

镜像扫描流程:

  1. Clair定期从配置的源获取漏洞元数据然后存进数据库;
  2. 客户端使用Clair API处理镜像,获取镜像的特征并存进数据库;
  3. 客户端使用Clair API从数据库查询特定镜像的漏洞情况,为每个请求关联漏洞的特征特征,避免需要重新扫描镜像;
  4. 当更新元数据时,将会有系统通知产生。

2.1.2部署clair-scanner

#需安装golang,及配置go加速,测试环境使用git和go版本如下:

#解压clair-scanner,进行编译

$ cd clair-scanner

$ make build

$ make installLocal

#运行clair-scanner

$ clair-scanner -h

#导入漏洞数据库和clair-local-scan镜像

$ docker load -i clair-scanner.tar

#下载测试镜像

$ docker load -i  httpd:2.4.43

#运行容器

$ docker run -d --name clair-db arminc/clair-db:v1

$ docker run -p 6060:6060 --link clair-db:postgres -d --name clair arminc/clair-local-scan:v1

#查看运行容器

$ docker ps

2.1.3使用clair-scanner扫描镜像

#获取docker0的ip信息

$ ifconfig docker0 | grep inet

        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

#对下载的httpd镜像进行扫描

$ clair-scanner --ip="172.17.0.1" -c "http://localhost:6060" httpd:2.4.43

#本质:找到每个镜像文件系统中已经安装的软件包与版本,然后跟官方系统公布的信息比对,官方已经给出了在哪个系统版本上哪个软件版本有哪些漏洞,比如Debian 7系统上,nginx 1.12.1有哪些CVE漏洞,通过对逐个安装的软件包比对,获知当前镜像一共有多少CVE。

2.2Trivy

trivy是由Aqua Security公司开发一款全面且多功能的安全扫描开源程序,目前在github上有21.8k个关注,支持扫描容器镜像、文件系统、Git Repository (远程)、虚拟机映像、Kubernetes、AWS系统。

图二:trivy在github上概况

2.2.1Trivy原理

       Trivy本身只是一个扫描工具,实际支撑这个工具的还有一个工具链,多种工具/库的协同,完成了从CVE到扫描识别的各个环节。

组件构成:

①vuln-list-update:负责更新各个来源的威胁数据,转换为json数据;

②trivy-db:既是工具,也是库,用于操作trivy的数据库;

③fanal:从vuln-list获取数据,并构建bbolt格式的数据库文件,可以用upload命令上传到Github Release;

④trivy:获取trivy-db的release数据,进行漏洞扫描工。

工作流程:

①从操作系统厂商等CVE源获取数据,使用vuln-list-update脚本进行汇总,转换为一致的json数据;

②trivy-db从vuln-list下载数据,转换为bbolt格式,发布到trivy-db的release;

③trivy下载trivy-db数据,作为本地检测的数据源。

图三:trivy工作流程图

2.1.2部署trivy

#部署可以采用多种方式部署,官网上提及:yum、rpm、二进制、docker部署,针对docker部署,需将/var/lib/docker.sock映射到容器内部,经过实验,选择二进制部署trivy

#解压github上拉取的二进制包

$ tar -xf trivy_0.48.3_Linux-64bit.tar.gz

$ mv  ./trivy  /usr/local/bin/

$ chmod +x /usr/local/bin/trivy

$ which trivy

/usr/local/bin/trivy

2.2.3使用trivy扫描镜像

#可联网,直接使用trivy image IMAGE:TAG

$ trivy image httpd:2.4.43

table的形式展示了该镜像包含的漏洞,提示漏洞所在库(Library)、漏洞编号(Vulnerability)、严重程度(Severity)、当前使用版本(Installed Version)、漏洞修复版本(Fixed Version)以及其他信息(Title),在Title 信息中有一个网站,说明漏洞的详情,可以更好去处理漏洞。

#不能联网

#命令参数

--cache-dir ,指定漏洞数据库的本地缓存目录,默认在是 ~/.cache/trivy 下

--skip-db-update, 扫描启动的时候,会检查本地漏洞库。如果超过 12 小时为更新,会自动下载更新漏洞库。由于官方漏洞库放在 github,下载比较慢,可以使用 --skip-db-update 跳过这一过程。

--skip-java-db-update 同样java 的漏洞库,每周四凌晨自动更新,也是存在github上,以使用–skip-java-db-update 跳过这一过程。

--severity CRITICAL , 指定扫描的严重程度,分为,CRITICAL[紧急],HIGH[高的],MEDIUM[中等],LOW[低的]

--vuln-type , 指定想要扫描的漏洞种类 , os仅扫描目标(比如容器镜像或文件系统)中操作系统包含的已知漏洞; library 应用程序库的漏洞扫描;

--vuln-type os,library 同时包含操作系统包和应用程序库的漏洞扫描

-f ,指定输出的格式,默认的输出格式是 table, 以表格的形式显示扫描结果。-f json 以json 格式输出结果, 配合 -o 输出文件 ,如 trivy -f json -o nginx.1.22.1.json

--ignore-unfixed , 会忽略那些当前没有可用修复的已知漏洞,这个选项对于聚焦于立即可行的修复措施特别有用。

$ trivy --cache-dir TRIVY_DB_DIR(下载下的漏洞包缓存位置)  image httpd:2.4.43 --skip-db-update

例:trivy  --cache-dir /tmp/trivy/  image  httpd:2.4.43 --skip-db-update

2.3 Grype

Grype是一款针对容器镜像和文件系统的漏洞扫描器。该完成针对容器镜像和文件系统的漏洞扫描和安全审计任务。

2.3.1部署grype

#从官网获取安装文件,目前安装的是v0.77.2

2.3.2 使用grype扫描镜像

#安装完成后,执行扫描镜像命令

$ grype httpd:2.4.43

#对于联网环境,可使用GRYPE_DB_AUTO_UPDATE=false环境变量禁止更新漏洞库

#对于离线环境,需下载db包,并配置config.yaml文件;

2.4 Dockerscan

2.4.1部署dockerscan

#python3.5+环境直接使用pip拉取dockerscan

$ python3.6 -m pip install dockerscan

2.4.2使用dockerscan扫描镜像

#dockerscan是docker官方的一款镜像扫描工具,可离线使用,更具扫描结果进行人工判定,从而判别漏洞

#扫描结果比较单一;

三、总结

工具

clair-scanner

trivy

grype

dockerscan

扫描镜像

需上传镜像

直接扫描

直接扫描

需下载镜像至本地

扫描速度

漏洞数据库

CVE

CVE

CVE

扫描结果

only漏洞(见2.1.3章节)

漏洞+细节(见2.2.3章节)

only漏洞(见2.3.2章节)

无漏洞信息,需更具扫描结果自己判定(见2.4.2章节)

备注

通过对容器的layer进行扫描,对镜像进行特征提取,依据特征匹配CVE漏洞

原理和clair-scanner类似,都是对比已有的CVE库,获取数据,但是trivy获取的信息更多,在Title 信息中有一个网站,说明漏洞的详情,可以更好去处理漏洞

和clair-scanner类似

不推荐

参考文献:

github:arminc/clair-local-scan at 2.1.0 (github.com)

Trivy官网:Trivy Open Source Vulnerability Scanner | Aqua (aquasec.com)

阿里云社区:容器镜像安全扫描之Trivy-阿里云开发者社区 (aliyun.com)

github:anchore/grype: A vulnerability scanner for container images and filesystems (github.com)

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号