Clair与Docker Registry的集成(同时支持Clair API v1和v3)
Klar是一款简单工具,用于分析存储在私有或公共Docker Registry中的镜像是否存在安全漏洞,它利用Clair https://github.com/coreos/clair 进行检测。Klar设计为集成工具,因此依赖环境变量进行配置。它是一个独立的二进制文件,无需额外依赖。
Klar充当客户端,协调Docker Registry与Clair之间的镜像检查。
最简单的方式是从 https://github.com/optiopay/klar/releases/ 下载最新版本(支持OSX和Linux),并将二进制文件放入PATH中的某个文件夹(确保具有执行权限)。
确保已安装并配置好Go语言编译器 https://golang.org/doc/install
然后运行
go get github.com/optiopay/klar
确保你的Go二进制文件夹在PATH中(例如export PATH=$PATH:/usr/local/go/bin)
Klar进程返回0表示镜像中检测到的高严重性漏洞数量小于或等于阈值(见下文),如果超过则返回1。如果因错误导致镜像无法被分析,则返回2。
Klar可通过以下环境变量进行配置:
CLAIR_ADDR - Clair服务器的地址。格式为protocol://host:port - protocol和port分别默认为http和6060,可省略。你也可以在URL中指定基本身份验证:protocol://login:password@host:port。
CLAIR_OUTPUT - 严重级别阈值,将输出高于或等于此阈值的漏洞。支持的级别有Unknown、Negligible、Low、Medium、High、Critical、Defcon1。默认为。
用法:
CLAIR_ADDR=localhost CLAIR_OUTPUT=High CLAIR_THRESHOLD=10 DOCKER_USER=docker DOCKER_PASSWORD=secret klar postgres:9.5.1
你可以通过将KLAR_TRACE设置为true来启用更详细的输出。
export KLAR_TRACE=true以在多次运行间保持设置。Klar可以Docker化。进入$GOPATH/src/github.com/optiopay/klar并在项目根目录构建Klar。如果你在Linux上:
CGO_ENABLED=0 go build -a -installsuffix cgo .
如果你在Mac上,记得为Linux构建:
GOOS=linux go build .
然后在项目根目录构建Docker镜像(如果你想,可以用完全限定名称替换klar):
docker build -t klar .
然后将环境变量作为单独的--env参数传递,或者创建环境文件并作为--env-file参数传递。例如将环境变量保存为my-klar.env:
CLAIR_ADDR=localhost
CLAIR_OUTPUT=High
CLAIR_THRESHOLD=10
DOCKER_USER=docker
DOCKER_PASSWORD=secret
然后运行
docker run --env-file=my-klar.env klar postgres:9.5.1
Amazon ECR没有永久的用户名/密码,必须使用aws ecr get-login获取凭证,且有效期为12小时。以下是一个示例脚本,可用于为Klar提供ECR凭证:
DOCKER_LOGIN=`aws ecr get-login --no-include-email`
PASSWORD=`echo $DOCKER_LOGIN | cut -d' ' -f6`
REGISTRY=`echo $DOCKER_LOGIN | cut -d' ' -f7 | sed "s/https:\/\///"`
DOCKER_USER=AWS DOCKER_PASSWORD=${PASSWORD} ./klar ${REGISTRY}/my-image
对于向GCR(Google Cloud Registry)进行身份验证,最简单的方法是使用应用默认凭据。这仅在从GCP运行Klar时有效。唯一的要求是Google Cloud SDK。
DOCKER_USER=oauth2accesstoken
DOCKER_PASSWORD="$(gcloud auth application-default print-access-token)"
使用Docker时:
DOCKER_USER=oauth2accesstoken
DOCKER_PASSWORD="$(docker run --rm google/cloud-sdk:alpine gcloud auth application-default print-access-token)"
UnknownCLAIR_THRESHOLD - Klar在返回1之前可容忍的输出漏洞数量。默认为0。
CLAIR_TIMEOUT - Klar取消镜像扫描前的超时时间(分钟)。默认为1。
DOCKER_USER - Docker Registry账户名称。
DOCKER_PASSWORD - Docker Registry账户密码。
DOCKER_TOKEN - Docker Registry账户令牌。(可替代DOCKER_USER和DOCKER_PASSWORD使用)
DOCKER_INSECURE - 允许Klar访问SSL证书有问题的注册表。默认为false。Clair需要以-insecure-tls参数启动才能生效。
DOCKER_TIMEOUT - 从Docker注册表获取层时的超时时间(分钟)。
DOCKER_PLATFORM_OS - Docker镜像的操作系统。默认为linux。仅当指定的镜像引用的是Docker ManifestList而非常规清单时需要设置。
DOCKER_PLATFORM_ARCH - Docker镜像优化的架构。默认为amd64。仅当指定的镜像引用的是Docker ManifestList而非常规清单时需要设置。
REGISTRY_INSECURE - 允许Klar访问不安全的注册表(仅HTTP)。默认为false。
JSON_OUTPUT - 输出JSON格式,而非纯文本。默认为false。
FORMAT_OUTPUT - 漏洞的输出格式。支持的格式有standard、json、table。默认为standard。如果JSON_OUTPUT设为true,则忽略此选项。
WHITELIST_FILE - CVE白名单的YAML文件路径。文件格式请参考whitelist-example.yaml。
IGNORE_UNFIXED - 不计入没有修复方案的漏洞到阈值中。