Как я могу быть уверен, что получаю надежный образ из докера?
Мы используем нотариальные услуги вместе со сторонним поставщиком aujas для подписания образов докеров. У меня есть машина для сборки, на которой мы запускаем сценарии для подписи изображений. Все идет нормально.
Когда мой клиент извлекает изображение, которое мы подписали, как он может быть уверен, что изображение является подписанным изображением и ему можно доверять?
Я тестировал с другой машины (отличной от машины сборки), и я могу успешно вытащить образ, когда отключу DOCKER_CONTENT_TRUST. В тот момент, когда я включаю DOCKER_CONTENT_TRUST, я получаю сообщение об ошибке,
Ошибка: данные удаленного доверия не существуют для docker.io/xxx/xxxx:notary.docker.io не имеет данных доверия для docker.io/xxxx/xxxx
Как мой клиент верит, что изображение, которое он рисует, подписано?
Спасибо, Мадхав
2 ответа
Не все изображения подписаны разработчиками. Ошибка, которую вы получаете, связана с тем, что это конкретное изображение не было подписано разработчиком этого образа.
Изображение, подписанное, например, является изображением nginx.
$ docker trust inspect nginx:alpine
[
{
"Name": "nginx:alpine",
"SignedTags": [
{
"SignedTag": "alpine",
"Digest": "1e9c503db9913a59156f78c6420f6e2f01c8a3b71ceeeddcd7f604c4db0f045e",
"Signers": [
"Repo Admin"
]
}
],
"Signers": [],
"AdministrativeKeys": [
{
"Name": "Root",
"Keys": [
{
"ID": "d2f02ea35ebffce87d31673efbff44c199b1af0be042989d4655a176e8aad40d"
}
]
},
{
"Name": "Repository",
"Keys": [
{
"ID": "ec92eb8e988506253f8590cb924b6becdbb0520f2fb430257d8879e2d3bed2cc"
}
]
}
]
}
]
Поэтому вы можете вытащить это изображение с включенным доверием контента.
$ DOCKER_CONTENT_TRUST=true docker pull nginx:alpine
Pull (1 of 1): nginx:alpine@sha256:1e9c503db9913a59156f78c6420f6e2f01c8a3b71ceeeddcd7f604c4db0f045e
docker.io/library/nginx@sha256:1e9c503db9913a59156f78c6420f6e2f01c8a3b71ceeeddcd7f604c4db0f045e: Pulling from library/nginx
Digest: sha256:1e9c503db9913a59156f78c6420f6e2f01c8a3b71ceeeddcd7f604c4db0f045e
Status: Image is up to date for nginx@sha256:1e9c503db9913a59156f78c6420f6e2f01c8a3b71ceeeddcd7f604c4db0f045e
Tagging nginx@sha256:1e9c503db9913a59156f78c6420f6e2f01c8a3b71ceeeddcd7f604c4db0f045e as nginx:alpine
docker.io/library/nginx:alpine
Однако изображение, которое не подписано, не может быть извлечено с включенным доверием содержимого.
$ docker trust inspect docker/whalesay
[]
No signatures or cannot access docker/whalesay
Как видите, тогда я получу ту же ошибку, что и вы.
$ DOCKER_CONTENT_TRUST=true docker pull docker/whalesay
Using default tag: latest
Error: remote trust data does not exist for docker.io/docker/whalesay: notary.docker.io does not have trust data for docker.io/docker/whalesay
Если вы хотите работать с подписанными изображениями, способ добиться этого - подписать их самостоятельно и отправить свой собственный репозиторий.
export DOCKER_CONTENT_TRUST=true # enable content trust globally
DOCKER_CONTENT_TRUST=false docker pull docker/whalesay # download unsiged image by disabling content trust
docker tag docker/whalesay marcofranssen/whalesay
docker push marcofranssen/whalesay # pushes and signs the image in my own repository with my keys
docker trust inspect marcofranssen/whalesay
[
{
"Name": "marcofranssen/whalesay",
"SignedTags": [
{
"SignedTag": "latest",
"Digest": "4a79736c5f63638261bc21228b48e9991340ca6d977b73de3598be20606e5d87",
"Signers": [
"marcofranssen"
]
}
],
"Signers": [
{
"Name": "marcofranssen",
"Keys": [
{
"ID": "eb9dd99255f91efeba139941fbfdb629f11c2353704de07a2ad653d22311c88b"
}
]
}
],
"AdministrativeKeys": [
{
"Name": "Root",
"Keys": [
{
"ID": "0428c356406a6ea3543012855c117d13d784774e49aa6db461cfbad5726d187b"
}
]
},
{
"Name": "Repository",
"Keys": [
{
"ID": "b635efeddff59751e8b6b59abb45383555103d702e7d3f46fbaaa9a8ac144ab8"
}
]
}
]
}
]
Теперь вы можете использовать свой собственный репозиторий с подписанными версиями изображения. Само собой разумеется, что вы должны подписывать изображения только после проверки их содержимого.
Изображениям, полученным через Docker Content Trust, можно доверять, поскольку их криптографические подписи проверяются автоматически. Из документации Docker:
Потребители изображений могут включить DCT, чтобы гарантировать, что изображения, которые они используют, были подписаны. Если потребитель включает DCT, он может извлекать, запускать или создавать только доверенные образы. Включение DCT немного похоже на применение «фильтра» к вашему реестру. Потребители «видят» только подписанные теги изображений, а менее желательные, неподписанные теги изображений для них «невидимы».