Clair是CoreOS最近发布的一款开源容器漏洞扫描工具。该工具可以交叉检查Docker镜像的操作系统以及上面安装的任何包是否与任何已知不安全的包版本相匹配。漏洞是从特定操作系统的通用漏洞披露(CVE)数据库获取。该工具当前支持的操作系统包括Red Hat、Ubuntu和Debian。
\\通过从镜像文件系统中抽取静态信息以及维护一个组成镜像的不同层之间的差异列表,可以大大减少分析时间,而且不需要实际运行可能存在漏洞的容器。如果镜像所依赖的一个靠下的层存在漏洞,那么该镜像就会被识别为有漏洞,而且,通过使用图存储,可以避免重新分析镜像。
\\CoreOS使用Clair分析用户上传到Quay.io(一个类似DockerHub的容器注册中心)的Docker镜像。现已发现,Quay上的大多数镜像都存在漏洞,甚至是像Heartbleed(80%)或Ghost(67%)这样的著名漏洞。2015年初,一份有关DockerHub的报告推断,至少有30%的官方镜像和多达40%的用户上传镜像包含高级漏洞。期间,在DockerCon 2015欧洲大会上,除了其他安全相关的特性外,Docker还宣布了他们自己的镜像扫描和漏洞检测项目Nautilus。Nautilus并不开源,而且只能运行在Docker Hub上。
\\市场上还有其他容器漏洞检测工具,比如IBM的Vulnerability Advisor或FlawCheck。它们的主要不同之处在于它们是专有的,在IBM的场景中,仅应用于托管在Bluemix云产品上的镜像。IBM的解决方案还支持基本的安全策略(比如,“密码使用期限应该为90天”),会以同静态代码分析工具类似的方式生成警告。
\\当然,这些工具可以确定是否存在可能有漏洞的包,但不能验证它们实际上是否已被利用。另外,它们也无法检测运行实例中的动态行为,比如在运行时安装有漏洞的包版本。
\\Clair提供了一个JSON API,并且可以在本地运行以检查容器镜像,例如,作为持续集成或持续交付管道的一部分。
\\下面的代码片段初始化(默认配置)并启动了一个Clair本地服务:
\\\$ git clone https://github.com/coreos/clair.git \# 从Github克隆Clair库\\$ cp clair/config.example.yaml clair/config/config.yaml \# 使用默认设置创建一个初始配置文件\\$ docker pull quay.io/coreos/clair:latest \# 下载一个安装了Clair的CoreOS容器镜像\\$ docker run -p 6060:6060 -p 6061:6061 -v clair:$PWD/clair/config:ro quay.io/coreos/clair:latest --config=/config/config.yaml \# 启动服务——务必等待获取初始漏洞列表(消息 “升级器:升级完成”)\
\\
如果管道生成了可以部署的不可变Docker镜像,那么漏洞扫描就可以在某个阶段成为安全测试的一部分,这可能会中断管道。例如,下面的代码分析一个名为“tmpimage”的Docker镜像:
\\\$ go get -u github.com/coreos/clair/contrib/analyze-local-images \# 需要安装go\\$ $GOPATH/bin/analyze-local-images tmpimage \# analyze-local-images是一个包装器脚本,分析镜像中的所有层\
\\
上述代码片段查找镜像中任意层上的高级或严重漏洞。通过抽取每个层然后单个提交给Clair的API,可以指定其他的严重性等级。
\\单个层的完整漏洞列表(任意严重性等级,从可忽略到严重)可以通过稍后的分析生成,例如通过运行下面的代码:
\\\$ curl -s -H \"Content-Type: application/json\" -X POST -d \\\'{\ \"ID\": \"39bb80489af75406073b5364c9c326134015140e1f7976a370a8bd446889e6f8\