Clair 助力 Docker 镜像安全

  • Manuel Pais
  • 谢丽

2016 年 1 月 3 日

话题:DevOps持续交付

ClairCoreOS最近发布的一款开源容器漏洞扫描工具。该工具可以交叉检查 Docker 镜像的操作系统以及上面安装的任何包是否与任何已知不安全的包版本相匹配。漏洞是从特定操作系统的通用漏洞披露(CVE)数据库获取。该工具当前支持的操作系统包括Red HatUbuntuDebian

通过从镜像文件系统中抽取静态信息以及维护一个组成镜像的不同层之间的差异列表,可以大大减少分析时间,而且不需要实际运行可能存在漏洞的容器。如果镜像所依赖的一个靠下的层存在漏洞,那么该镜像就会被识别为有漏洞,而且,通过使用图存储,可以避免重新分析镜像。

CoreOS使用 Clair 分析用户上传到Quay.io(一个类似 DockerHub 的容器注册中心)的 Docker 镜像。现已发现,Quay 上的大多数镜像都存在漏洞,甚至是像 Heartbleed(80%)或 Ghost(67%)这样的著名漏洞。2015 年初,一份有关DockerHub的报告推断,至少有 30% 的官方镜像和多达 40% 的用户上传镜像包含高级漏洞。期间,在DockerCon 2015 欧洲大会上,除了其他安全相关的特性外,Docker 还宣布了他们自己的镜像扫描和漏洞检测项目Nautilus。Nautilus 并不开源,而且只能运行在 Docker Hub 上。

市场上还有其他容器漏洞检测工具,比如 IBM 的Vulnerability AdvisorFlawCheck。它们的主要不同之处在于它们是专有的,在 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",
    "Path": "/tmp/docker/layers/39bb80489af75406073b5364c9c326134015140e1f7976a370a8bd446889e6f8.tar"
}' \
127.0.0.1:6060/v1/layers
# 向 Clair 提交层,分析并存储在 DB 中 

$ curl -s "127.0.0.1:6060/v1/layers/39bb80489af75406073b5364c9c326134015140e1f7976a370a8bd446889e6f8/vulnerabilities?minimumPriority=Negligible" | python -m json.tool > all_vulnerabilities.json
# 获取在层里找到的所有漏洞

此外,CoreOS 最近还宣布了TectonicCoreOS 的容器即服务产品)中的分布式信任计算(DTC)能力。DTC 在整个栈上建立了一个受信任的加密链,从应用程序层到容器、操作系统,再到硬件。

查看英文原文:Clair Helps Secure Docker Images

DevOps持续交付