Confiance de contenu dans Docker
Lors du transfert de données entre systèmes en réseau, la confiance est une préoccupation centrale. En particulier, lors de la communication sur un support non fiable tel qu'internet, il est critique d'assurer l'intégrité et l'éditeur de toutes les données sur lesquelles un système opère. Vous utilisez Docker Engine pour pousser et tirer des images (données) vers un registre public ou privé. La confiance de contenu vous donne la capacité de vérifier à la fois l'intégrité et l'éditeur de toutes les données reçues d'un registre sur n'importe quel canal.
À propos de Docker Content Trust (DCT)
Docker Content Trust (DCT) fournit la capacité d'utiliser des signatures numériques pour les données envoyées et reçues des registres Docker distants. Ces signatures permettent la vérification côté client ou à l'exécution de l'intégrité et de l'éditeur d'étiquettes d'image spécifiques.
Grâce à DCT, les éditeurs d'images peuvent signer leurs images et les consommateurs d'images peuvent s'assurer que les images qu'ils tirent sont signées. Les éditeurs peuvent être des individus ou des organisations signant manuellement leur contenu ou des chaînes d'approvisionnement logiciel automatisées signant le contenu dans le cadre de leur processus de publication.
Étiquettes d'image et DCT
Un enregistrement d'image individuel a l'identifiant suivant :
[REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
Un REPOSITORY
d'image particulier peut avoir plusieurs étiquettes. Par exemple, latest
et
3.1.2
sont toutes deux des étiquettes sur l'image mongo
. Un éditeur d'image peut construire une image
et une combinaison d'étiquette plusieurs fois en changeant l'image à chaque construction.
DCT est associé à la portion TAG
d'une image. Chaque dépôt d'image a
un ensemble de clés que les éditeurs d'images utilisent pour signer une étiquette d'image. Les éditeurs d'images
ont la discrétion sur quelles étiquettes ils signent.
Un dépôt d'image peut contenir une image avec une étiquette qui est signée et une autre
étiquette qui ne l'est pas. Par exemple, considérez le dépôt d'image Mongo
. L'étiquette latest
pourrait être non signée tandis que l'étiquette 3.1.6
pourrait être signée. Il est de la
responsabilité de l'éditeur d'image de décider si une étiquette d'image est signée ou
non. Dans cette représentation, certaines étiquettes d'image sont signées, d'autres ne le sont pas :


Les éditeurs peuvent choisir de signer une étiquette spécifique ou non. En conséquence, le contenu d'une
étiquette non signée et celui d'une étiquette signée avec le même nom peuvent ne pas correspondre. Par
exemple, un éditeur peut pousser une image étiquetée someimage:latest
et la signer.
Plus tard, le même éditeur peut pousser une image someimage:latest
non signée. Cette seconde
poussée remplace la dernière étiquette non signée latest
mais n'affecte pas la version latest
signée.
La capacité de choisir quelles étiquettes ils peuvent signer, permet aux éditeurs d'itérer sur
la version non signée d'une image avant de la signer officiellement.
Les consommateurs d'images peuvent activer DCT pour s'assurer que les images qu'ils utilisent ont été signées. Si un consommateur active DCT, ils ne peuvent que tirer, exécuter, ou construire avec des images de confiance. Activer DCT est un peu comme appliquer un "filtre" à votre registre. Les consommateurs "voient" seulement les étiquettes d'image signées et les étiquettes d'image non signées moins désirables sont "invisibles" pour eux.


Pour le consommateur qui n'a pas activé DCT, rien sur la façon dont ils travaillent avec les images Docker ne change. Chaque image est visible qu'elle soit signée ou non.
Clés Docker Content Trust
La confiance pour une étiquette d'image est gérée grâce à l'utilisation de clés de signature. Un ensemble de clés est créé lorsqu'une opération utilisant DCT est invoquée pour la première fois. Un ensemble de clés consiste en les classes de clés suivantes :
- Une clé hors ligne qui est la racine de DCT pour une étiquette d'image
- Des clés de dépôt ou d'étiquetage qui signent les étiquettes
- Des clés gérées par le serveur telles que la clé d'horodatage, qui fournit la fraîcheur des garanties de sécurité pour votre dépôt
L'image suivante décrit les diverses clés de signature et leurs relations :


WarningLa clé racine une fois perdue n'est pas récupérable. Si vous perdez toute autre clé, envoyez un email au Support Docker Hub. Cette perte nécessite également une intervention manuelle de chaque consommateur qui a utilisé une étiquette signée de ce dépôt avant la perte.
Vous devriez sauvegarder la clé racine quelque part en sécurité. Étant donné qu'elle n'est requise que pour créer de nouveaux dépôts, c'est une bonne idée de la stocker hors ligne dans le matériel. Pour des détails sur la sécurisation et la sauvegarde de vos clés, assurez-vous de lire comment gérer les clés pour DCT.
Signer des images avec Docker Content Trust
Dans la CLI Docker, nous pouvons signer et pousser une image conteneur avec la
syntaxe de commande $ docker trust
. Ceci est construit au-dessus de l'ensemble de fonctionnalités
Notary. Pour plus d'informations, voir le dépôt GitHub Notary.
Un prérequis pour signer une image est un registre Docker avec un serveur Notary attaché (tel que Docker Hub). Les instructions pour mettre en place un environnement auto-hébergé peuvent être trouvées ici.
Pour signer une image Docker, vous aurez besoin d'une paire de clés de délégation. Ces clés
peuvent être générées localement en utilisant $ docker trust key generate
ou générées
par une autorité de certification.
D'abord, nous ajouterons la clé privée de délégation au dépôt de confiance Docker local.
(Par défaut, ceci est stocké dans ~/.docker/trust/
). Si vous générez
des clés de délégation avec $ docker trust key generate
, la clé privée
est automatiquement ajoutée au magasin de confiance local. Si vous importez une clé séparée,
vous devrez utiliser la commande
$ docker trust key load
.
$ docker trust key generate jeff
Generating key for jeff...
Enter passphrase for new jeff key with ID 9deed25:
Repeat passphrase for new jeff key with ID 9deed25:
Successfully generated and loaded private key. Corresponding public key available: /home/ubuntu/Documents/mytrustdir/jeff.pub
Ou si vous avez une clé existante :
$ docker trust key load key.pem --name jeff
Loading key from "key.pem"...
Enter passphrase for new jeff key with ID 8ae710e:
Repeat passphrase for new jeff key with ID 8ae710e:
Successfully imported key from key.pem
Ensuite, nous devrons ajouter la clé publique de délégation au serveur Notary ; ceci est spécifique à un dépôt d'image particulier dans Notary connu sous le nom de Nom Globalement Unique (GUN). Si c'est la première fois que vous ajoutez une délégation à ce dépôt, cette commande initialisera également le dépôt, en utilisant une clé racine canonique Notary locale. Pour en savoir plus sur l'initialisation d'un dépôt, et le rôle des délégations, dirigez-vous vers délégations pour la confiance de contenu.
$ docker trust signer add --key cert.pem jeff registry.example.com/admin/demo
Adding signer "jeff" to registry.example.com/admin/demo...
Enter passphrase for new repository key with ID 10b5e94:
Enfin, nous utiliserons la clé privée de délégation pour signer une étiquette particulière et la pousser vers le registre.
$ docker trust sign registry.example.com/admin/demo:1
Signing and pushing trust data for local image registry.example.com/admin/demo:1, may overwrite remote trust data
The push refers to repository [registry.example.com/admin/demo]
7bff100f35cb: Pushed
1: digest: sha256:3d2e482b82608d153a374df3357c0291589a61cc194ec4a9ca2381073a17f58e size: 528
Signing and pushing trust metadata
Enter passphrase for signer key with ID 8ae710e:
Successfully signed registry.example.com/admin/demo:1
Alternativement, une fois que les clés ont été importées, une image peut être poussée avec la
commande $ docker push
, en exportant la variable d'environnement DCT.
$ export DOCKER_CONTENT_TRUST=1
$ docker push registry.example.com/admin/demo:1
The push refers to repository [registry.example.com/admin/demo:1]
7bff100f35cb: Pushed
1: digest: sha256:3d2e482b82608d153a374df3357c0291589a61cc194ec4a9ca2381073a17f58e size: 528
Signing and pushing trust metadata
Enter passphrase for signer key with ID 8ae710e:
Successfully signed registry.example.com/admin/demo:1
Les données de confiance distantes pour une étiquette ou un dépôt peuvent être visualisées par la
commande $ docker trust inspect
:
$ docker trust inspect --pretty registry.example.com/admin/demo:1
Signatures for registry.example.com/admin/demo:1
SIGNED TAG DIGEST SIGNERS
1 3d2e482b82608d153a374df3357c0291589a61cc194ec4a9ca2381073a17f58e jeff
List of signers and their keys for registry.example.com/admin/demo:1
SIGNER KEYS
jeff 8ae710e3ba82
Administrative keys for registry.example.com/admin/demo:1
Repository Key: 10b5e94c916a0977471cc08fa56c1a5679819b2005ba6a257aa78ce76d3a1e27
Root Key: 84ca6e4416416d78c4597e754f38517bea95ab427e5f95871f90d460573071fc
Les données de confiance distantes pour une étiquette peuvent être supprimées par la commande $ docker trust revoke
:
$ docker trust revoke registry.example.com/admin/demo:1
Enter passphrase for signer key with ID 8ae710e:
Successfully deleted signature for registry.example.com/admin/demo:1
Application côté client avec Docker Content Trust
La confiance de contenu est désactivée par défaut dans le client Docker. Pour l'activer,
définissez la variable d'environnement DOCKER_CONTENT_TRUST
à 1
. Cela empêche
les utilisateurs de travailler avec des images étiquetées à moins qu'elles ne contiennent une signature.
Lorsque DCT est activé dans le client Docker, les commandes CLI docker
qui opèrent sur
des images étiquetées doivent soit avoir des signatures de contenu ou des hachages de contenu explicites.
Les commandes qui opèrent avec DCT sont :
push
build
create
pull
run
Par exemple, avec DCT activé, un docker pull someimage:latest
ne
réussit que si someimage:latest
est signé. Cependant, une opération avec un
hachage de contenu explicite réussit toujours tant que le hachage existe :
$ docker pull registry.example.com/user/image:1
Error: remote trust data does not exist for registry.example.com/user/image: registry.example.com does not have trust data for registry.example.com/user/image
$ docker pull registry.example.com/user/image@sha256:d149ab53f8718e987c3a3024bb8aa0e2caadf6c0328f1d9d850b2a2a67f2819a
sha256:ee7491c9c31db1ffb7673d91e9fac5d6354a89d0e97408567e09df069a1687c1: Pulling from user/image
ff3a5c916c92: Pull complete
a59a168caba3: Pull complete
Digest: sha256:ee7491c9c31db1ffb7673d91e9fac5d6354a89d0e97408567e09df069a1687c1
Status: Downloaded newer image for registry.example.com/user/image@sha256:ee7491c9c31db1ffb7673d91e9fac5d6354a89d0e97408567e09df069a1687c1