
Интеграция Clair и Docker Registry
Интеграция Clair и Docker Registry (поддерживает обе версии API Clair: v1 и v3)
Klar — это простой инструмент для анализа образов, хранящихся в частном или публичном Docker registry, на наличие уязвимостей безопасности с помощью Clair (https://github.com/coreos/clair). Klar предназначен для использования в качестве инструмента интеграции, поэтому он полагается на переменные окружения. Это один бинарный файл, не требующий зависимостей.
Klar выступает в роли клиента, который координирует проверки образов между Docker registry и Clair.
Самый простой способ — скачать последний релиз (для OSX и Linux) с https://github.com/optiopay/klar/releases/ и поместить бинарный файл в папку, находящуюся в вашем 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. По умолчанию Unknown.
CLAIR_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 доступ к registry с неправильными SSL-сертификатами. По умолчанию false. Clair необходимо запускать с флагом -insecure-tls, чтобы это работало.
DOCKER_TIMEOUT — время ожидания в минутах при попытке получить слои из Docker registry.
DOCKER_PLATFORM_OS — операционная система Docker-образа. По умолчанию linux. Это необходимо задавать только в том случае, если указанный образ ссылается на Docker ManifestList вместо обычного манифеста.
DOCKER_PLATFORM_ARCH — архитектура, для которой оптимизирован Docker-образ. По умолчанию amd64. Это необходимо задавать только в том случае, если указанный образ ссылается на Docker ManifestList вместо обычного манифеста.
REGISTRY_INSECURE — разрешить Klar доступ к небезопасным registry (только HTTP). По умолчанию false.
JSON_OUTPUT — выводить JSON, а не обычный текст. По умолчанию false.
FORMAT_OUTPUT — формат вывода уязвимостей. Поддерживаемые форматы: standard, json, table. По умолчанию standard. Если JSON_OUTPUT установлен в true, этот параметр игнорируется.
WHITELIST_FILE — путь к YAML-файлу с белым списком CVE. Посмотрите whitelist-example.yaml для формата файла.
IGNORE_UNFIXED — не учитывать уязвимости без исправления при подсчете порога.
Использование:
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) проще всего использовать стандартные учетные данные приложения. Они работают только при запуске Klar из GCP. Единственное требование — 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)"