Clair源码分析
本文主要描述Clair架构、编译、部署、源码分析等内容。
Clair架构
Clair主要包括以下模块:
获取器(Fetcher)- 从公共源收集漏洞数据
检测器(Detector)- 指出容器镜像中包含的Feature
容器格式器(Image Format)- Clair已知的容器镜像格式,包括Docker,ACI
通知钩子(Notification Hook)- 当新的漏洞被发现时或者已经存在的漏洞发生改变时通知用户/机器
数据库(Databases)- 存储容器中各个层以及漏洞
- Worker - 每个Post Layer都会启动一个worker进行Layer Detect
Clair源码编译和使用
启动一个pgsql容器作为Clair的Backend DB
docker run -p 5432:5432 -e POSTGRES_PASSWORD=passw0rd postgres:latest
从源码编译clair
go get github.com/coreos/clair
go install github.com/coreos/clair/cmd/clair
配置Clair的Backend DB (vim /etc/clair/config.yaml)
启动clair
clair -config config.yaml
安装并启动本地镜像分析工具: analyze-local-images
go get -u github.com/coreos/clair/contrib/analyze-local-images
执行镜像扫描
analyze-local-images -endpoint “http://10.199.244.27:6060” -my-address “10.199.244.27” vipdocker-f9nub.vclound.com/centos:6.6
-endpoint配置clair部署的主机IP
docker-compose部署Clair
通过docker-compose部署clair的yaml文件内容如下:
version: '2'
services:
postgresql:
image: /libary/postgres:0.1
restart: always
ports:
- 5432:5432
volumes:
- /docker/postgresql/data:/var/lib/postgresql/data
clair:
image: libary/clair:0.2
depends_on:
- postgresql
ports:
- 6060:6060
- 6061:6061
environment:
- POSTGRESQL_HOST=postgresql
Clair源码分析
Clair内部各个模块之间的关系如下:
以Rest API请求为入口,相关模块的流程大致如下:
下面将具体进行入口和Post Layer接口的源码进行分析。
main方法
/cmd/clair/main.go
func main() {
...
// 加载配置文件
config, err := config.Load(*flagConfigPath)
...