安全性对任何产品来说都非常重要,比如著名的HeartBleed就就曾经给很多忽视安全问题的企业带来了很大的影响。而随着容器化的推进,早在2015年的一次调查中,研究者就曾发现取样的Dockerhub上有30%-40%的镜像存在安全性的问题。Clair正是由coreos所推出的这样一款针对容器的安全扫描的工具,类似于Docker在其收费版中提供的功能那样,能对应用容器的脆弱性进行静态扫描,同时支持APPC和DOCKER。

项目地址

项目 详细
项目地址 https://github.com/coreos/clair

为什么使用Clair

随着容器化的逐渐推进,使用的安全性也受到越来越多地重视。在很多场景下,都需要对容器的脆弱性进行扫描,比如

项目 详细
镜像来源不明 在互联网上下载的镜像,可以直接使用,非常的方便,但是是否真正安全还非常难说
生产环境的实践 容器上到生产环境之后,生产环境对容器的安全性要求一般较高,此时需要容器的安全性得到保证

名称的由来

clair的目标是能够从一个更加透明的维度去看待基于容器化的基础框架的安全性。Clair=clear + bright + transparent

工作原理

通过对容器的layer进行扫描,发现漏洞并进行预警,其使用数据是基于Common Vulnerabilities and Exposures数据库(简称CVE), 各Linux发行版一般都有自己的CVE源,而Clair则是与其进行匹配以判断漏洞的存在与否,比如HeartBleed的CVE为:CVE-2014-0160。

数据源支持

目前Clair支持如下数据源:

数据源 具体数据 格式 License
Debian Security Bug Tracker Debian 6, 7, 8, unstable namespaces dpkg Debian
Ubuntu CVE Tracker Ubuntu 12.04, 12.10, 13.04, 14.04, 14.10, 15.04, 15.10, 16.04 namespaces dpkg GPLv2
Red Hat Security Data CentOS 5, 6, 7 namespaces rpm CVRF
Oracle Linux Security Data Oracle Linux 5, 6, 7 namespaces rpm CVRF
Alpine SecDB Alpine 3.3, Alpine 3.4, Alpine 3.5 namespaces apk MIT
NIST NVD Generic Vulnerability Metadata N/A Public Domain

数据库

Clair的运行需要一个数据库实例,目前经过测试的数据库的版本为

数据库 版本
postgresql 9.6
postgresql 9.5
postgresql 9.4

运行方式

因为clair以镜像的方式进行打包和发布,所以其运行支持如下几种方式:

  • Kubernetes
  • docker-compose
  • docker

本文使用docker-compose来演示起使用方法,其他方式大同小异。

事前准备

docker版本

[root@liumiaocn ~]# docker version
Client:Version:      1.13.1API version:  1.26Go version:   go1.7.5Git commit:   092cba3Built:        Wed Feb  8 08:47:51 2017OS/Arch:      linux/amd64Server:Version:      1.13.1API version:  1.26 (minimum version 1.12)Go version:   go1.7.5Git commit:   092cba3Built:        Wed Feb  8 08:47:51 2017OS/Arch:      linux/amd64Experimental: false
[root@liumiaocn ~]#

docker-compose版本

[root@liumiaocn ~]# docker-compose version
docker-compose version 1.14.0, build c7bdf9e
docker-py version: 2.4.2
CPython version: 2.7.5
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
[root@liumiaocn ~]#

运行Clair

下载docker-compose.yml

使用docker-compose方式运行Clair,下载相关的yaml文件

[root@liumiaocn ~]# curl -L https://raw.githubusercontent.com/coreos/clair/master/docker-compose.yml -o $HOME/docker-compose.yml% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100   497  100   497    0     0    450      0  0:00:01  0:00:01 --:--:--   453
[root@liumiaocn ~]# ls
anaconda-ks.cfg  docker-compose.yml
[root@liumiaocn ~]# 

确认内容,可以看到postgresql和clair的设定以及券和端口的设定,以及依赖的config.yaml文件

[root@liumiaocn ~]# cat docker-compose.yml
version: '2'
services:postgres:container_name: clair_postgresimage: postgres:latestrestart: unless-stoppedenvironment:POSTGRES_PASSWORD: passwordclair:container_name: clair_clairimage: quay.io/coreos/clair-git:latestrestart: unless-stoppeddepends_on:- postgres
    ports:- "6060-6061:6060-6061"
    links:- postgres
    volumes:- /tmp:/tmp
      - ./clair_config:/config
    command: [-config, /config/config.yaml]
[root@liumiaocn ~]# 

注意: 镜像有时会发现很难下载下来,尤其是clair-git的镜像,因此使用liumiaocn/clair-git的镜像作为替代(此镜像仅仅是搬运而已,未作任何自定义)

[root@liumiaocn ~]# grep clair-git *.ymlimage: liumiaocn/clair-git:latest
[root@liumiaocn ~]#

创建目录

[root@liumiaocn ~]# mkdir $HOME/clair_config
[root@liumiaocn ~]# ls
anaconda-ks.cfg  clair_config  docker-compose.yml
[root@liumiaocn ~]# 

下载config.yaml文件

[root@liumiaocn ~]# curl -L https://raw.githubusercontent.com/coreos/clair/master/config.example.yaml -o $HOME/clair_config/config.yaml% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100  2810  100  2810    0     0   1431      0  0:00:01  0:00:01 --:--:--  1438
[root@liumiaocn ~]# ls clair_config/
config.yaml
[root@liumiaocn ~]#

修改config文件

[root@liumiaocn ~]# cp clair_config/config.yaml clair_config/config.yaml.org
[root@liumiaocn ~]# vi clair_config/config.yaml
[root@liumiaocn ~]# diff clair_config/config.yaml clair_config/config.yaml.org
23,24c23
<       #source: host=localhost port=5432 user=postgres sslmode=disable statement_timeout=60000
<       source: postgresql://postgres:password@postgres:5432?sslmode=disable
---
>       source: host=localhost port=5432 user=postgres sslmode=disable statement_timeout=60000
[root@liumiaocn ~]# 

启动docker-compose

使用 docker-compose -f $HOME/docker-compose.yml up -d启动clair, 第一次如果本地没有相关镜像,会自动去pull该镜像。

[root@liumiaocn ~]# docker-compose -f $HOME/docker-compose.yml up -d
Creating network "root_default" with the default driver
Pulling postgres (postgres:latest)...
latest: Pulling from library/postgres
ad74af05f5a2: Pull complete
8996b4a29b2b: Pull complete
bea3311ef15b: Pull complete
b1b9eb0ac9c8: Pull complete
1d6d551d6af0: Pull complete
ba16377760f9: Pull complete
2b514f6e3ef7: Pull complete
0e114ac261be: Pull complete
eb5c1803318c: Pull complete
2969cff5710e: Pull complete
78a73d03b014: Pull complete
d38698b91d10: Pull complete
efdd4c790d34: Pull complete
Digest: sha256:07d178f4b071971208b912f888c0375838435a06728c431f8a1ef3cc04cdee8d
Status: Downloaded newer image for postgres:latest
Pulling clair (liumiaocn/clair-git:latest)...
latest: Pulling from liumiaocn/clair-git
019300c8a437: Already exists
ba570f08729a: Pull complete
65f959ba8ec2: Pull complete
43126a124ea6: Pull complete
70c83f72e91e: Pull complete
edfbbcd5d91d: Pull complete
a3ed95caeb02: Pull complete
db01cda90a09: Pull complete
ad9b36e2881f: Pull complete
988d3a801f0c: Pull complete
Digest: sha256:1e73a24713bae3a6dc45945bd7914bc85d00a55fc9b14dd01880f45b6cd06aa7
Status: Downloaded newer image for liumiaocn/clair-git:latest
Creating clair_postgres ...
Creating clair_postgres ... done
Creating clair_clair ...
Creating clair_clair ... done
[root@liumiaocn ~]#

启动后确认

[root@liumiaocn ~]# docker-compose psName                   Command               State                       Ports
--------------------------------------------------------------------------------------------------------
clair_clair      /clair -config /config/con ...   Up      0.0.0.0:6060->6060/tcp, 0.0.0.0:6061->6061/tcp
clair_postgres   docker-entrypoint.sh postgres    Up      5432/tcp
[root@liumiaocn ~]#

安装辅助工具

Clair提供Restful服务,但是演示略显繁琐,可以通过辅助工具比如clairctl来实现。

安装go

下载go的tar包,解压到/usr/local下即可

[root@liumiaocn ~]# ls /usr/local/go
api  AUTHORS  bin  blog  CONTRIBUTING.md  CONTRIBUTORS  doc  favicon.ico  lib  LICENSE  misc  PATENTS  pkg  README.md  robots.txt  src  test  VERSION
[root@liumiaocn ~]# export PATH=$PATH:/usr/local/go/bin
[root@liumiaocn ~]# export GOROOT=/usr/local/go
[root@liumiaocn ~]# go version
go version go1.8.3 linux/amd64
[root@liumiaocn ~]# 

analyze-local-images

analyze-local-images是一个用来与clair进行交互分析本地镜像的工具,由于使用上有很多限制,已经不再建议使用,而且不再更新,详细参看如下说明

项目 详细
地址 https://github.com/coreos/analyze-local-images

clairctl安装(源码方式)

安装go

下载如下go的package

项目 详细
地址 https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
解压目录 /usr/local/go
PATH export PATH=$PATH:/usr/local/go/bin
GOROOT export GOROOT=/usr/local/go

确认结果如下

[root@ku8-1 ~]# go version
go version go1.8.3 linux/amd64
[root@ku8-1 ~]#

安装glide

curl https://glide.sh/get | sh

源码方式

git clone git@github.com:jgsqware/clairctl.git $GOPATH/src/github.com/jgsqware/clairctl
cd $GOPATH/src/github.com/jgsqware/clairctl
glide install -v
go generate ./clair
go build

clairctl安装(二进制方式)

curl -L https://raw.githubusercontent.com/jgsqware/clairctl/master/install.sh | sh

版本确认

[root@liumiaocn ~]# clairctl versionClairctl version 1.2.8
[root@liumiaocn ~]#

检查连接

如果显示✔,则说明clairctl和clair能够进行正常连接。

[root@liumiaocn ~]# clairctl healthClair: ✔
[root@liumiaocn ~]#

准备镜像

[root@liumiaocn ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
94ed0c431eb5: Pull complete
9406c100a1c3: Pull complete
aa74daafd50c: Pull complete
Digest: sha256:788fa27763db6d69ad3444e8ba72f947df9e7e163bad7c1f5614f8fd27a311c3
Status: Downloaded newer image for nginx:latest
[root@liumiaocn ~]# docker images |grep nginx |grep latest
nginx                        latest              b8efb18f159b        11 days ago         107 MB
[root@liumiaocn ~]#

上传镜像至clair

[root@liumiaocn ~]# clairctl push -l nginx
nginx:latest has been pushed to Clair
[root@liumiaocn ~]#

分析本地镜像

使用analyze命令可以对镜像进行分析,如下可以显示对于pull下来的nginx的镜像相关的分析结果如下:

[root@liumiaocn ~]# clairctl analyze -l nginxImage: /nginx:latestUnknown: 4Negligible: 25Low: 3Medium: 16High: 4Critical: 0Defcon1: 0
[root@liumiaocn ~]# 

生成结果

如果希望堪当更加详细的信息,可以使用report命令

[root@liumiaocn ~]# clairctl report -l nginx
HTML report at reports/html/analysis-nginx-latest.html
[root@liumiaocn ~]# 

详细的html信息如下:

总结

这篇文章介绍了Clair的使用方式,了解到了Clair的原理,并使用clairctl的客户端演示了如何利用clair进行镜像的安全扫描并获取扫描的报告信息。容器作为目前比较热门的一种虚拟化的技术虽然已经开始被广泛地使用,但是安全性方面还是有很多事情需要做,而这些也是不容忽视的重要内容。

安全防护工具之:Clair相关推荐

  1. 充分利用Linux操作系统安全防护工具(转贴)

    Linux的安全防护离不开各种工具,Linux的开源性也促进了这些优秀的安全防护工具的发展. 目前在Linux环境下的安全工具林林总总,种类繁多.本文精选一些比较常用的.具有代表性的加以介绍,它们包括 ...

  2. 4、木马防范:木马分析检测及常见木马防护工具

    主讲老师:郭盛华 什么是木马? 木马病毒是指通过特定的程序(木马程序)来控制另一台计算机,是目前比较流行的病毒文件.它通过将自身伪装吸引用户下载执行,向施种木马者提供打开被种主机的门户,使施种者可以任 ...

  3. 【Docker】镜像安全扫描工具clair与clairctl

    镜像扫描结构图 方式2的具体操作步骤 clair是什么? clair是一个开源项目,用于静态分析appc和docker容器中的漏洞. 漏洞元数据从一组已知的源连续导入,并与容器映像的索引内容相关联,以 ...

  4. CoreOS发布开源容器漏洞分析工具Clair

    今天我们开源了一个新的项目,Clair,这是一个用来对容器安全进行监控的工具.Clair是个API驱动(API-Driven)的分析引擎,能逐层逐层地对已知的安全漏洞进行审查.你能轻松使用Clair构 ...

  5. Harbor集成Clair镜像安全扫描并手动导入漏洞数据

    通过这篇文章,你会了解到: harbor启停方法 clair镜像扫描原理 harbor数据库(MySQL)一览 clair数据库(PostgreSql)一览 harbor手动导入漏洞数据方法 背景 先 ...

  6. 2007年100款最佳安全工具谱

    2007年100款最佳安全工具谱   在2000和2003年非常成功的推出了安全工具调查后,Insecure.Org 非常高兴为大家带来2006年度的安全工具调查.我-Fyodor对nmap-hack ...

  7. 有了这8款Mac安全杀毒和流氓防护软件,让你的mac清理优化,更加安全

    其实Mac系统相对Windows来说更加安全,主要原因是针对Mac系统的病毒和流氓软件并不多,而且Mac系统的安全机制也更加完善,不过为了更加安全的使用Mac,使用以下8款Mac 杀毒安全.安全防护和 ...

  8. 计算机常用工具软件第5版,计算机常用工具软件(第3版)

    计算机常用工具软件(第3版) 出版时间:2011年11月 定 价:25.00 I S B N :9787121148163 所属分类: 计算机•网络 &nbsp计算机•网络  >  软件 ...

  9. 计算机课教学软件,计算机实用工具软件课程的的特点及教学的方法.doc

    计算机实用工具软件课程的的特点及教学的方法 计算机实用工具软件课程的的特点及教学的方法 摘要:<计算机实用工具软件>课程是职业学校计算机及相关专业开设的一门专业基础课.本文根据作者的教学体 ...

最新文章

  1. excel转成csv格式的默认分隔符
  2. 安卓学习 之 ContentResolver内容提供者(七)
  3. java如何做全局缓存_传智播客JNI第七讲 – JNI中的全局引用/局部引用/弱全局引用、缓存jfieldID和jmethodID的两种方式...
  4. [导入]写了个img2ppt的demo,为写PDF2PPT做准备
  5. RocketMQ之消息中间件需要解决的问题
  6. clipse和IDEA快捷键对照表
  7. MapReduce学习要点
  8. Dictionary的遍历和修改
  9. DELMIA人机工程 ---- 二次开发 第一篇:开发指南
  10. 全面解析机房综合布线结构、设计方案及未来发展趋势
  11. python修改ppt的字体和颜色,PPT小技巧:批量修改文字颜色,批量替换字体
  12. YY 0709|视觉报警信号的要求和测试方法
  13. The harvester安装使用
  14. 网站中PV、UV、IP的区别
  15. 转载:解决采集UTF-8网页空格变成问号乱码
  16. 关于笔试遇到的题 1
  17. 日期和时间范围区间怎么查询
  18. js PhotoSwipe库开源的手机版相册产品的Code.PhotoSwipe.attach方法使用
  19. 云原生边缘计算:探索与展望
  20. ADAMoeacle预言机竞争优势|支持广域网节点喂价|节点挖ADAM

热门文章

  1. win10启动linux蓝屏,系统之家重装 win10启动蓝屏0xc000021a如何修复
  2. 网络红人百度百科怎么做_如何做网红搜狗好搜百科技巧分享
  3. 杰理之二、IO维持T卡升级死机问题【篇】
  4. SpringBoot之:SpringBoot中使用HATEOAS
  5. 逻辑回归(LR)原理讲解
  6. 论文笔记——基于多传感器融合的紧耦合SLAM系统
  7. 直播预告丨Oracle数据库网络及存储技术详解-2022云和恩墨大讲堂
  8. 离散数学学习笔记----集合代数
  9. Activiti初识
  10. 印有祖师爷图灵的钞票要发行了