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 | mkdir clair_config |
验证:
1 | $ curl -X GET -I http://${docker-host}:6061/health |
如果是第一次启动需要同步数据库,如果在国内需要等待更长时间,更新完毕后可以看到如下输出:
使用
刚刚启动的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 | General: |
假设配置文件保存为paclair.yml
,接下来使用如下命令上传docker并启动扫描1
2
3paclair --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
:
struts2没找到漏洞,换个ssh(CVE-2017-1000117)看看,这回我们导出json格式的
1 | paclair --debug --conf paclair.yml Docker medicean/vulapps:s_ssh_1 push |
这样就找到了:
报告分析
可以看到图片上,报告中展示了容器中使用的第三方组件,如gcc, unzip,openssl,并且给出了安全等级,当前版本和修复版本,但是也可以看到其不足:
- 对应用组件的检测能力不足,如测试镜像的主要问题在于低版本struts,但是其没有检测到
- 只是简单对比其组件hash,而没有更深入的检测,如即使是使用了gcc,但是容器暴漏在外部的部分并没有用,那么实际上攻击者是无法利用的;又比如空密码的redis,使用hash比较是没法测出来的。
总结
Clair是一款用来扫描容器中使用第三方不安全组件的工具,能够将容器分层扫描,匹配CVE,Ubuntu,Redhat等多个数据库,个人感觉有以下优缺点:
优点:
- 开源核心模块,方便二次开发
缺点:
- Client使用复杂,官方给出的client——analyze-local-images已经停止维护,更强大的client需要付费使用,而其他第三方的client不一定能持续维护
- 文档不全,GitHub主页的quickstart都有坑,而且更多配置没有说明
- 对应用组件的检测能力不足
- 检测逻辑简单,存在漏报和误报