barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

четверг, 16 декабря 2021 г.

Подписывание docker-образов без docker cli

Задача

Нужно подписывать docker-образы подписями, совместимыми с docker trust, однако без использования docker-демона (т.к. подписание происходит в CI/CD без доступа к демону).

Решение

Для формирвания подписи необходимо 2 инструмента: 

  • notary cli для формирования подписи и ее загрузки на notary-сервер
  • skopeo для получения данных из манифеста подписываемого образа (умеет в т.ч. работать с докер-registry, а не только с локальным хранилищем образом, позволяя получать манифесты без pull'а самих образов)
# Если есть готовый docker-конфиг с учетками для авторизации в нужном docker registry,
# то указываем его для skopeo
export 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).