Задача
Нужно подписывать docker-образы подписями, совместимыми с docker trust, однако без использования docker-демона (т.к. подписание происходит в CI/CD без доступа к демону).
Решение
Для формирвания подписи необходимо 2 инструмента:
- notary cli для формирования подписи и ее загрузки на notary-сервер
- skopeo для получения данных из манифеста подписываемого образа (умеет в т.ч. работать с докер-registry, а не только с локальным хранилищем образом, позволяя получать манифесты без pull'а самих образов)
Сам процесс описан тут https://www.unboundsecurity.com/docs/UKC/UKC_Code_Signing_IG/HTML/Content/Products/UKC-EKM/UKC_Code_Signing_IG/Notary/notary_overview.htm, вот краткая выжимка:
# Если есть готовый docker-конфиг с учетками для авторизации в нужном docker registry,# то указываем его для skopeoexport REGISTRY_AUTH_FILE=$HOME/.docker/config.json# Вычислям хэш и размер манифеста докер-образаMANIFEST_HASH=`skopeo inspect --raw docker://$IMAGE_NAME:$IMAGE_VERSION | sha256sum`MANIFEST_HASH=${MANIFEST_HASH:0:64}MANIFEST_SIZE=`skopeo inspect --raw docker://$IMAGE_NAME:$IMAGE_VERSION | wc -c`# импортируем ключ для подписания из файла delegation.key (используемый рандомный passphrase)export NOTARY_DELEGATION_PASSPHRASE=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c10)notary key import ~/delegation.key -d ~/.docker/trust# собственно подписание и загрузка подписи на Notary-сервер (с debug-выводом)notary -D addhash -p $IMAGE_NAME $IMAGE_VERSION "$MANIFEST_SIZE" --sha256 "$MANIFEST_HASH" -r targets/releases -s https://my.notary.server -d ~/.docker/trust
Важный моментом является использование роли targets/releases при формировании подписи. Docker trust доверяет только этой роли, а также роли targets. Если использовать другую роль, докер будет считать, что образ не подписан (см. https://github.com/notaryproject/notary/blob/master/docs/advanced_usage.md#use-delegations-with-content-trust).
Комментариев нет:
Отправить комментарий