0%

Clair初探

Clair简介

clair是CoreOS公司开源的一套针对容器安全性检测工具,主要用于发掘容器中使用的组件是否存在安全性问题。

GitHub项目地址: https://github.com/quay/clair

Clair Framework

术语

  • Ancestry——表示容器
  • Feature——容器中任何具有脆弱性的实体,如软件包和文件
  • Feature Namespace——Feature所在的上下文,如操作系统和编程语言
  • Vulnerability Source——Clair中用来跟踪上有漏洞数据库(如CVE)的组件
  • Vulnerability Metadata Source——漏洞元数据,用来关联上游漏洞数据和Clair数据库

Detector

  • DataDector: 用来检测容器类型(除了docker还有appc)
  • FeaturesDector:发掘容器中使用的组件
  • NamespaceDetector:用来命名空间中存在的安全性问题

Updaters & Notifiers

  • updaters:用来从漏洞库里获取漏洞信息
  • Notifier:用来通知用户安全问题,同时支持webhook

Datastore

主要用来存储漏洞数据

Quick Start

安装(Server)

1
2
3
4
mkdir clair_config
curl -L https://raw.githubusercontent.com/coreos/clair/master/config.yaml.sample -o $PWD/clair_config/config.yaml
docker run -d -e POSTGRES_PASSWORD="" -p 5432:5432 postgres:9.6
docker run --net=host -v $PWD/clair_config:/config quay.io/coreos/clair:latest -config=/config/config.yaml # 选择稳定的版本

验证:

1
2
3
4
5
$ curl -X GET -I http://${docker-host}:6061/health
HTTP/1.1 200 OK
Server: clair
Date: Sat, 16 Nov 2019 12:39:46 GMT
Content-Length: 0

如果是第一次启动需要同步数据库,如果在国内需要等待更长时间,更新完毕后可以看到如下输出:

image-20191117195355945

使用

刚刚启动的Clair只是一个API Server,具体API可以参考 https://app.swaggerhub.com/apis/coreos/clair/3.0 ,要使用它扫描本地容器可以使用analyze-local-images,然而Clair认为扫描本地容器不是值得提倡的实践,因此这个项目就被废弃掉了(其原理是本地启动一个dockerhub服务,但是由于docker版本问题如今已无法使用),但是类似的Client还有很多,在 https://github.com/quay/clair/blob/master/Documentation/integrations.md 上可以看到,比如paclair,它允许我们将公有/私有docker仓库中的镜像上传到clair扫描,下面就以它为例,说明Clair使用方法。

安装paclair很简单:

1
pip install paclair

接下来需要创建paclair配置(GitHub上还有其他仓库的配置):

1
2
3
4
5
6
7
8
9
10
General:
clair_url: 'http://docker.test:6060'
Plugins:
Docker:
class: paclair.plugins.docker_plugin.DockerPlugin
registries:
hub.docker.com:
auth:
- "anemone95"
- "***"

假设配置文件保存为paclair.yml,接下来使用如下命令上传docker并启动扫描

1
2
3
paclair --debug --conf paclair.yml Docker registry.cn-hangzhou.aliyuncs.com/anemone/test push # 将dockerhub上的镜像上传到Clair
paclair --conf paclair.yml Docker registry.cn-hangzhou.aliyuncs.com/anemone/test analyse --output-format html 2>result.html # 扫描产生html的报告
paclair --conf conf/conf.yml Docker registry.cn-hangzhou.aliyuncs.com/anemone/test delete # 删除容器

产生的报告如下(test上的容器实际上是medicean/vulapps:s_struts2_s2-037

image-20191117172303850

struts2没找到漏洞,换个ssh(CVE-2017-1000117)看看,这回我们导出json格式的

1
2
paclair --debug --conf paclair.yml Docker medicean/vulapps:s_ssh_1 push
paclair --conf paclair.yml Docker medicean/vulapps:s_ssh_1 analyse 2>ssh.json

这样就找到了:

image-20191124155822590

报告分析

可以看到图片上,报告中展示了容器中使用的第三方组件,如gcc, unzip,openssl,并且给出了安全等级,当前版本和修复版本,但是也可以看到其不足:

  • 对应用组件的检测能力不足,如测试镜像的主要问题在于低版本struts,但是其没有检测到
  • 只是简单对比其组件hash,而没有更深入的检测,如即使是使用了gcc,但是容器暴漏在外部的部分并没有用,那么实际上攻击者是无法利用的;又比如空密码的redis,使用hash比较是没法测出来的。

总结

Clair是一款用来扫描容器中使用第三方不安全组件的工具,能够将容器分层扫描,匹配CVE,Ubuntu,Redhat等多个数据库,个人感觉有以下优缺点:

优点:

  • 开源核心模块,方便二次开发

缺点:

  • Client使用复杂,官方给出的client——analyze-local-images已经停止维护,更强大的client需要付费使用,而其他第三方的client不一定能持续维护
  • 文档不全,GitHub主页的quickstart都有坑,而且更多配置没有说明
  • 对应用组件的检测能力不足
  • 检测逻辑简单,存在漏报和误报