Comment signer vos images Docker pour accroître la confiance
Liens rapides
- Générer des clés
- Ajouter votre clé publique à votre registre
- Images de signature
- Vérification des images fiables
- Résumé
La plupart des images Docker sont distribuées sans aucune vérification de leur authenticité. Vous pouvez accroître la confiance dans vos images en les signant numériquement. Cela prouve aux utilisateurs que vous avez publié l'image et non un imposteur.
Le système de signature de Docker est connu sous le nom de confiance de contenu. Il est exposé via la commande CLI docker trust. Content Trust utilise des ensembles de clés pour permettre aux registres de vérifier l'identité des éditeurs potentiels. Les utilisateurs d’images signées peuvent être sûrs qu’elles proviennent de la source attendue.
Générer des clés
Vous aurez besoin d'une paire de clés pour commencer à utiliser Content Trust. Les paires de clés peuvent être émises par les autorités de certification ou générées par la Docker CLI.
Courir
docker trust key generate your-name
pour créer une clé. Vous serez invité à saisir une phrase secrète. Celui-ci devra être fourni chaque fois que vous utiliserez la clé pour signer ou vérifier des images. Appuyez sur Entrée à chaque invite pour continuer.
Une fois que vous avez terminé, deux fichiers seront générés dans
~/.docker/trust: la clé privée et sa clé publique correspondante. Comme pour les clés SSH, la clé privée ne doit jamais être partagée et ne doit pas être perdue. Si vous devez vous déplacer entre les machines, vous pouvez importer un fichier de clé privée dans une autre installation Docker en utilisant
docker trust key load my-key.pemAjouter votre clé publique à votre registre
Docker Hub prend en charge toutes les fonctionnalités de docker trust. Si vous utilisez un serveur Docker Registry privé, un processus de configuration plus complexe est requis.
Le serveur de registre n'offre pas de prise en charge intégrée des signatures. Vous avez besoin d'un service Docker Notary distinct qui gère la vérification de la signature pour les transferts et les extractions d'images. Notary comporte trois composants : le serveur, un service de signature et une base de données MySQL. Il doit être déployé sur la même URL que votre serveur de registre.
Vous pouvez faire fonctionner Notary en utilisant son fichier Docker Compose :
git clone https://github.com/theupdateframework/notary.git
docker-compose up -dCe déploiement de base s'exécutera avec un certificat TLS auto-signé. Il est destiné uniquement à un usage de développement. Vous devrez faire confiance au fichier de l'autorité de certification fixtures/root-ca.crt dans le référentiel avant que les clients puissent se connecter avec succès.
sudo mkdir -p /usr/share/ca-certificates/extra
sudo cp fixtures/root-ca.crt /usr/share/ca-certificates/extra/notary.crt
sudo update-ca-certificatesLes commandes ci-dessus copieront le fichier de certificat dans l'emplacement de stockage ca-certificates. update-ca-certificates recharge tous les certificats, ajoutant l'autorité notariale à votre système.
Si vous envisagez d'exécuter Notary en production, vous devrez configurer l'authentification afin que seuls les utilisateurs autorisés puissent ajouter de nouvelles clés. La variable d'environnement NOTARY_AUTH doit être définie lors du démarrage du service avec docker-compose. Cela accepte les informations d'identification codées en Base64 au format username:password. Vous serez invité à les fournir lors de votre interaction avec le notaire.
export NOTARY_AUTH=$(echo "username" | base64):$(echo "password" | base64)
docker-compose up -d
Vous êtes maintenant prêt à ajouter votre clé publique à votre serveur notaire. Les clés sont ajoutées par référentiel. Cela vous permet d'isoler les images les unes des autres et permet la prise en charge des contributeurs tiers délégués. Vous pouvez ajouter ultérieurement d'autres personnes disposant de droits de publication en leur demandant de répéter la commande avec leur clé privée.
docker trust signer add your-key-name registry.example.com/my-imageVous devrez saisir la phrase secrète de la clé. Il sera alors disponible sur votre serveur de registre.
Images de signature
Une fois votre clé inscrite dans le registre, vous pouvez commencer à signer des images. Utilisez la commande docker trust sign. Assurez-vous que chaque image est étiquetée avec l'URL de registre correcte.
docker trust sign registry.example.com/my-image:latestCette commande signera l’image avec votre clé, puis la transmettra directement au registre. Il n'est pas nécessaire d'exécuter manuellement docker push par la suite. Vous devrez configurer une clé de référentiel et une phrase secrète pour protéger les données de confiance de l'image individuelle. Suivez chaque invite pour configurer vos clés de signature.
Si vous disposez de workflows existants utilisant docker push, vous pouvez opter pour cette commande au lieu de docker trust. Effectuez les étapes précédentes pour créer une clé et l'ajouter au notaire. Définissez la variable d'environnement DOCKER_CONTENT_TRUST pour que les commandes Docker CLI détectent Content Trust et l'appliquent automatiquement.
export DOCKER_CONTENT_TRUST=1
docker push registry.example.com/my-image:latestVous verrez que la sortie du shell correspond à ce que produit le docker trust sign. Docker effectue les mêmes actions que la commande plus explicite.
Vérification des images fiables
La variable DOCKER_CONTENT_TRUST réapparaît avec plus d'importance lorsqu'il s'agit de vérifier les images que vous extrayez. Docker ne tente pas de vérifier les images par défaut, même si elles contiennent des données de confiance. Vous devez définir la variable d'environnement dans votre shell pour activer la validation de la confiance du contenu.
export DOCKER_CONTENT_TRUST=1
docker pull registry.example.com/my-image:latestLorsque la variable est définie, toutes les images extraites seront vérifiées par rapport au serveur notaire de leur registre. Si le notaire ne peut fournir aucune donnée de confiance, l'image est traitée comme non signée et l'extraction sera abandonnée. Cela vous protège des images publiées par des acteurs malveillants se faisant passer pour un véritable éditeur.
Les utilisateurs de Docker Enterprise peuvent configurer un paramètre de démon facultatif pour empêcher Docker Engine de fonctionner avec des images non fiables déjà sur l'hôte. Ceux-ci peuvent provenir d'archives tar provenant d'une source non sécurisée.
Modifiez /etc/docker/daemon.json et ajoutez la clé suivante :
{
"content-trust": {
"mode": "enforced"
}
}Rechargez la configuration du démon Docker avec systemctl reload docker pour appliquer la modification.
Vous pouvez inspecter l'état de confiance d'une image à l'aide de docker trust inspect. Cela affichera les signatures associées à l'image, vous permettant de vérifier si elle a été signée.
docker trust inspect registry.example.com/my-image:latestSi vous avez publié une image que vous ne souhaitez plus signer, utilisez la commande docker trust revoke. Cela supprimera les données de confiance de l'image, ce qui entraînera l'échec de toutes les vérifications ultérieures du client Docker.
docker trust revoke registry.example.com/my-image:latestRésumé
Docker Content Trust ajoute des signatures numériques à l'écosystème Docker, augmentant ainsi la sécurité lors de l'utilisation des images. Si vous transférez des images vers Docker Hub, vous disposez déjà de tout ce dont vous avez besoin pour utiliser la fonctionnalité. Définissez la variable d'environnement DOCKER_CONTENT_TRUST et utilisez les commandes Docker comme d'habitude.
Pour les utilisateurs de registre auto-hébergés, la configuration est plus compliquée mais en vaut toujours la peine dans un environnement critique en matière de confiance. Au moment de la rédaction de cet article, Notary n'a toujours pas de version stable officielle et la documentation se trouve dans son référentiel GitHub.



