Signature des images de conteneurs : comparaison de Sigstore, Notary et Docker Content Trust
Hrittik Roy
26 septembre 2023
0 minutes de lectureDans l’écosystème logiciel actuel, la conteneurisation est devenue une méthode populaire pour empaqueter et déployer des applications. Avec cette tendance croissante, la sécurisation des chaînes d’approvisionnement logicielles est devenue une préoccupation majeure pour les entreprises de toutes tailles. La mise en œuvre de bonnes pratiques, comme la signature et la vérification des images pour atténuer les attaques de l’intercepteur (MITM) et valider leur authenticité et leur fraîcheur, joue un rôle essentiel dans la protection de l’intégrité de la chaîne d’approvisionnement logicielle.
La signature des images de conteneurs s’appuie sur des techniques cryptographiques qui associent l’image à une entité ou à une organisation spécifique, créant ainsi une chaîne de confiance. Cela permet de garantir l’authenticité et l’intégrité du code contenu dans les images.
La signature des images de conteneurs permet également d’établir la propriété et la responsabilité. Les signatures peuvent être utiles à des fins d’audit, en aidant les organisations à suivre et à vérifier l’origine des images ainsi que les modifications qui leur ont été apportées au fil du temps, et à appliquer des normes et des réglementations de conformité spécifiques.
Dans cet article, nous comparons trois solutions populaires de signature de conteneurs : Sigstore Cosign, Notary v2 et Docker Content Trust (DCT), également appelé Notary v1. Découvrez leurs fonctionnalités, leurs capacités et leur pertinence pour sécuriser les chaînes d’approvisionnement des images de conteneurs. Nous terminerons par un tutoriel qui vous apprendra à intégrer l’un de ces outils à votre flux de travail.
Outils de signature de conteneurs
Pour signer vos images en toute sécurité, de nombreux outils sont disponibles. Trois d’entre eux se distinguent particulièrement : Cosign, Notary et DCT. Chacun possède ses propres spécifications et exigences.
Sigstore Cosign
Cosign est un outil qui permet aux utilisateurs de signer, vérifier et protéger des logiciels de façon simple et sécurisée. Distribué sous licence Apache 2.0, il repose sur la norme Sigstore, qui garantit l’intégrité et l’authenticité des images de conteneurs. Cosign gagne rapidement en popularité, avec plus de 3 400 étoiles sur GitHub.
Cosign est réputé pour prendre en charge la signature sans clé, grâce à l’autorité de certification Sigstore Fulcio et au journal de transparence immuable Rekor, avec une identité OpenID Connect (OIDC) authentifiée. Cette approche s’appuie sur une infrastructure invisible, ce qui évite aux utilisateurs de gérer et de maintenir eux-mêmes des clés. Cosign simplifie le processus en générant des clés éphémères et facilite la vérification et la signature de l’authenticité des images et des blobs signés.
Docker Content Trust
Docker a développé Docker Content Trust (DCT) en 2015, puis en a fait don à la Cloud Native Computing Foundation (CNCF) sous la forme du projet Notary, qui est actuellement en incubation.
DCT permet aux utilisateurs de signer et de vérifier des images de conteneurs tout en garantissant l’intégrité et l’authenticité de balises d’image spécifiques grâce à une vérification côté client ou à l’exécution.
Notary v1 fonctionne en ajoutant votre clé publique au registre, puis en signant votre image avec la clé privée correspondante avant de la charger. Les utilisateurs peuvent ensuite vérifier l’image en comparant la clé publique aux données récupérées par le groupe de commandes du registre. Vous pouvez également automatiser les chaînes d’approvisionnement logicielles en signant le contenu dans le cadre du processus de publication.
Notary v2
Le système de signature Notary v2 est une version nouvelle et améliorée qui vise à dépasser les limites de son prédécesseur. Avec Notation et Notary v2, les utilisateurs peuvent créer leur propre implémentation des spécifications et l’intégrer à leurs flux de travail de signature et de vérification afin de signer plusieurs artefacts (c’est-à-dire des images de conteneurs, des nomenclatures logicielles et des résultats d’analyse). C’est possible grâce à un groupe formé en décembre 2019, dont l’objectif est d’améliorer l’expérience de signature des images et de résoudre des problèmes tels que la prise en charge de plusieurs registres et le déplacement d’images entre registres avec l’implémentation v1 d’origine.
Notary v2 est relativement récent et a été lancé en décembre 2022. Il vise à devenir une spécification intersectorielle et compatible avec différents registres pour signer et vérifier toute image Open Container Initiative (OCI) ou tout artefact de registre. Le projet est toujours en développement et de nouvelles fonctionnalités seront ajoutées à l’avenir.
Comparaison de Cosign, Notary v2 et Docker Content Trust
Dans cet article, nous examinons quatre caractéristiques clés pour vous aider à déterminer quel outil répond le mieux à vos besoins :
Le modèle de délégation de confiance désigne le mécanisme utilisé pour établir et distribuer la confiance dans les artefacts et le registre, afin d’en garantir l’intégrité et l’authenticité.
La transparence et l’auditabilité désignent la capacité à observer et à vérifier les actions et les modifications apportées au système, pour garantir la responsabilité et l’intégrité.
La facilité d’utilisation englobe la simplicité et la convivialité des outils de signature, qui facilitent leur adoption et leur intégration.
Le soutien de la communauté englobe le niveau d’engagement, de collaboration et de ressources fourni par la communauté autour du système, afin d’assurer son évolution continue et d’offrir de l’aide.
Chacun de ces facteurs peut avoir une incidence considérable sur l’efficacité de chaque outil. Dans les sections suivantes, examinez chaque catégorie et évaluez les outils en fonction de ces critères.
Modèle de délégation de confiance
Cosign utilise un modèle décentralisé et fédéré de délégation de confiance, avec une racine de confiance composée de certificats et de clés publiques fournis par le projet Sigstore. The Update Framework (TUF) sert à distribuer et à obtenir les éléments de clé. La racine de confiance de Sigstore permet également de vérifier la preuve d’inclusion dans Rekor.
À l’inverse, Notary v1 et v2 utilisent un modèle hiérarchique de délégation de confiance qui implique la distribution des images à l’aide de TUF. Dans ce modèle, un magasin de confiance sert à stocker les identités fiables.
Pour produire des artefacts avec la v2, les utilisateurs ou les administrateurs configurent la politique de confiance afin de définir les identités considérées comme fiables. L’authenticité des artefacts signés est déterminée en fonction de la confiance accordée aux identités du magasin et de la politique de confiance.
Avec la v1, DCT utilise une clé hors ligne comme source de confiance pour les balises d’image. La confiance est déléguée à des clés de dépôt ou de balisage, tandis que des clés gérées par le serveur apportent une sécurité supplémentaire. Ce modèle permet d’établir différents niveaux de confiance au sein du système afin d’appliquer différentes politiques de sécurité et différents contrôles d’accès.
En résumé, Cosign met l’accent sur une confiance décentralisée et fédérée, avec une racine de confiance fournie par Sigstore, ce qui en fait un bon choix pour la délégation de confiance. Il implémente un schéma de découverte basé sur les balises et prend en charge la plupart des registres de production. À l’inverse, choisissez Notary v1 si vous n’avez pas besoin de prendre en charge plusieurs registres, car ceux-ci ne sont pas interopérables. Si vous avez besoin d’interopérabilité, v2 la propose et permet de distribuer la confiance entre différents registres.
Transparence et auditabilité
En matière de transparence et d’auditabilité, Sigstore offre un système sécurisé et transparent pour les mises à jour logicielles en stockant toutes les signatures dans un registre public. Les organisations peuvent ainsi facilement vérifier l’authenticité des mises à jour. De plus, Rekor permet d’auditer publiquement tous les événements de signature, ce qui contribue à garantir la responsabilité et la confiance dans la chaîne d’approvisionnement logicielle.
DCT présente quant à lui certains inconvénients. Il ne prend en charge qu’une seule signature par image. Ainsi, si le fournisseur a déjà signé l’image sur Docker Hub, vous ne pouvez pas lui ajouter votre propre signature pour indiquer qu’elle convient à votre organisation. Cela peut limiter votre flexibilité et votre contrôle sur la chaîne d’approvisionnement logicielle.
Notary v2 adopte une approche plus globale pour préserver la confiance dans tout l’écosystème. Il remet en question l’idée selon laquelle les images récupérées directement depuis Docker Hub sont intrinsèquement sûres. Grâce à la prise en charge de plusieurs signatures, Notary v2 permet de valider la sécurité des images et aux organisations d’apposer leur propre sceau d’approbation, renforçant ainsi la confiance dans la chaîne d’approvisionnement logicielle.
À la date de publication de cet article, Notary v2 1.0.0 est une version candidate, mais n’a pas encore fait l’objet d’une version générale. Dans les environnements nouveaux et complexes, Sigstore peut donc être un meilleur choix grâce à sa maturité et à ses intégrations.
Facilité d’utilisation
Cosign s’efforce d’offrir une expérience conviviale en simplifiant la gestion des clés et le processus de signature. Les développeurs peuvent également l’intégrer facilement à leur flux de travail existant lors de la création d’images. La signature sans clé élimine la complexité de la gestion des clés, et la paire de clés publique/privée générée par cosign rend les étapes de mise en œuvre simples.
Notary s’intègre facilement à l’écosystème de conteneurs Docker et fournit des outils en ligne de commande et des API pour signer et vérifier les conteneurs. Toutefois, étant relativement récent, il est compatible avec peu de clients, à l’exception de Notation. De plus, avec les deux versions de Notary, vous devez gérer un grand nombre de clés ; une bonne maîtrise de TUF est donc nécessaire.
DCT est étroitement intégré à Docker, ce qui facilite l’activation de la signature et de la vérification des images grâce à des commandes intuitives. Cependant, il ne fonctionne pas entre les registres, et les données de signature sont perdues lorsque vous récupérez une image publique puis la poussez vers un registre privé sans serveur Notary associé. De plus, la mise en place d’un service Notary nécessite un serveur Notary, un signataire Notary, un client Notary et une base de données MySQL, ainsi que mTLS (TLS mutuel) entre le serveur et le signataire Notary. Cela demande souvent des efforts supplémentaires et devrait disparaître à mesure que la v2 se généralise.
En matière de facilité d’utilisation, Cosign semble avoir l’avantage grâce à son approche conviviale, à la gestion simplifiée des clés et à son intégration aux flux de travail existants. Notary v2 propose également des intégrations et des outils en ligne de commande, mais sa configuration et sa gestion demandent plus d’efforts et de connaissances que DCT. Toutefois, il est fourni avec docker trust, qui est très facile à utiliser.
Soutien de la communauté
Tous les projets sont placés sous l’égide de la CNCF et bénéficient donc d’un bon soutien communautaire. Cosign reçoit également le soutien de partenaires du secteur et s’appuie sur une communauté active de contributeurs qui assurent son évolution, son soutien et sa collaboration en continu. Notary est lui aussi un projet open source soutenu par une communauté solide. Largement utilisé dans l’écosystème Docker, il bénéficie des contributions et des commentaires d’un grand nombre d’utilisateurs. Le projet v2 étant relativement récent, sa documentation et ses tutoriels sont moins nombreux que ceux des autres solutions, ce qui peut freiner les nouveaux utilisateurs qui souhaitent apprendre à utiliser v2 avec des interfaces en ligne de commande comme Notation.
DCT fait partie de la plateforme Docker et bénéficie de la vaste communauté Docker. Il a suscité un vif intérêt et dispose d’un écosystème solide d’outils et d’intégrations, ce qui facilite son activation. De nombreux tutoriels vous aideront également à vous lancer.
Et le gagnant est…
Le choix du gagnant dépend des exigences, des priorités et des contraintes propres à l’organisation ou au système avec lequel vous travaillez. Sigstore convient bien aux organisations qui privilégient des mises à jour logicielles sécurisées et transparentes pour différents artefacts, notamment les charts Helm, ainsi que les images. Il bénéficie d’un excellent soutien communautaire et offre des fonctionnalités telles que l’interopérabilité entre registres, ce qui en fait un excellent choix pour la plupart des organisations. De plus, la plupart des registres de conteneurs prennent en charge son format de signature.
En comparaison, DCT se distingue dans les cas où la simplicité et une intégration transparente avec Docker sont essentielles. Son intégration étroite à Docker et ses commandes intuitives facilitent la signature et la vérification des images, sans modèles de confiance complexes ni interopérabilité entre différents registres.
Notary v2 offre une solution plus complète pour préserver la confiance dans la chaîne d’approvisionnement logicielle et remédie aux limites de DCT. Toutefois, comme ce projet est encore en cours de développement, son déploiement à l’échelle d’une organisation peut nécessiter une réflexion et une planification approfondies. La configuration ainsi que la gestion des certificats TLS et des clés TUF peuvent être complexes, nécessiter une courbe d’apprentissage plus longue et devenir une charge opérationnelle si elles ne sont pas correctement prises en charge. De plus, tous les registres ne le prennent pas en charge : son adoption peut donc impliquer certains compromis.
Comment signer avec Cosign
Maintenant que vous en savez un peu plus sur Cosign, Notary et DCT, passons à l’étape suivante en utilisant l’un de ces outils : Cosign. Dans cet exemple, nous utiliserons l’image de référence Docker registry:2 pour exécuter un registre simple. Dans un contexte réel, vous pouvez utiliser un registre géré tel que Harbor, Amazon ECR, Docker Hub, etc.
Prérequis
Avant de commencer, vous devez avoir installé les outils suivants :
Cosign : l’outil que vous utiliserez pour signer et vérifier les images de conteneurs.
Docker : un outil pour créer, exécuter et gérer des conteneurs Docker.
Une fois ces deux outils installés, vous pouvez commencer !
Configurer un registre
Pour stocker vos images, vous devez créer une instance de l’image de référence Docker registry:2 afin d’exécuter un registre.
Remarque : nous associons ici le port local 15000 afin d’éviter les conflits — notamment sur les Mac, où les versions récentes utilisaient le port 5000 pour les services AirDrop. Vous pouvez le remplacer par n’importe quel port disponible sur votre poste de travail, mais veillez à utiliser le même port dans les commandes suivantes.
Envoyer une image vers le registre
Pour signer une image Docker et l’envoyer vers le registre, suivez les étapes suivantes :
Récupérez une image depuis un registre public (dans cet exemple, nous utilisons BusyBox) :
Cette commande récupère l’image BusyBox depuis le registre Docker public.
Ensuite, vous devez étiqueter l’image avec l’adresse IP de votre registre local :
Puis, pour téléverser l’image signée, envoyez-la vers votre registre Harbor :
Cette commande envoie l’image étiquetée vers votre registre Harbor à l’aide de la commande docker push. Dans la réponse, vous devriez voir apparaître un condensat sha256 semblable à celui-ci :
Copiez la valeur du condensat, depuis sha256: jusqu’à la fin de la chaîne (sans l’espace ni la valeur « size » qui suit). Il s’agit de l’empreinte cryptographique de l’image. Nous l’utiliserons à l’étape suivante pour nous assurer que nous signons bien l’image exacte que nous venons d’envoyer.
Une fois ces étapes terminées, vous aurez envoyé une image Docker à votre registre. Elle sera alors disponible pour le déploiement et la distribution dans votre environnement. Il vous reste toutefois à la signer.
Signer l’image envoyée
Avant de signer une image de conteneur envoyée à l’aide de Cosign, vous devez générer une clé privée et une clé publique. Exécutez la commande suivante pour créer la paire de clés qui servira à la signature :
Après avoir exécuté la commande précédente, vous serez invité à saisir un mot de passe pour la clé privée. Saisissez un mot de passe, puis confirmez-le. La clé privée est enregistrée dans un fichier nommé cosign.key, et la clé publique dans cosign.pub. Veillez à protéger la clé privée et le mot de passe que vous avez définis.
Ensuite, utilisez la commande cosign sign pour signer l’image comme ceci :
Si vous avez changé de répertoire, remplacez cosign.key par le chemin d’accès à votre fichier de clé privée et [sha256 digest] par la valeur complète du condensat copiée à l’étape précédente. Vous serez invité à saisir le mot de passe de la clé privée. Saisissez-le pour continuer.
En signant l’image avec Cosign, vous en garantissez l’actualité, l’authenticité et l’intégrité. Vous ajoutez ainsi une couche de sécurité à vos images de conteneurs et contribuez à préserver la confiance dans votre chaîne d’approvisionnement logicielle.
Vérifier l’image signée
Pour vérifier l’image signée, utilisez la commande intégrée cosign verify comme ceci :
Vous devrez probablement répondre à quelques questions par oui ou par non concernant l’utilisation d’un registre privé et l’acceptation des conditions d’utilisation du projet Sigstore. Lisez-les attentivement et répondez en conséquence.
Si la signature est validée, un message de confirmation vous indiquera que l’image est signée et vérifiée en toute sécurité. Ce message ressemble à ceci :
Ce message de confirmation est essentiel pour maintenir une posture de sécurité solide au sein de votre organisation.
Signer d’autres artefacts
Si les images de conteneurs sont un élément essentiel des chaînes d’approvisionnement logicielles, la signature d’autres artefacts logiciels est tout aussi importante pour assurer une sécurité de bout en bout. Outre les images de conteneurs, différents types d’artefacts logiciels, comme les exécutables, les fichiers Java Archive (JAR), les packages et les nomenclatures logicielles (SBOM), peuvent bénéficier du processus de signature. Voici, par exemple, un tutoriel sur la prise en charge de la signature des SBOM par Cosign.
La signature d’autres artefacts offre les mêmes avantages que ceux présentés précédemment, notamment l’intégrité, l’actualité et la provenance, et vous aide à répondre aux exigences de conformité, d’audit ou de référence. Notez toutefois que le processus peut être moins simple que pour la signature de conteneurs, comme dans le cas des SBOM, qui sont signées avec Cosign après avoir été associées à l’image de conteneur hébergée dans un registre.
Pour des artefacts tels que les fichiers JAR, vous pouvez utiliser des outils comme Jarsigner. Le processus est un peu plus complexe que la signature traditionnelle d’images, car il faut gérer des étapes supplémentaires, comme la génération, le stockage, le transfert et l’utilisation sécurisée des clés et des signatures.
Conclusion
Même si la signature de différents artefacts peut ajouter de la complexité, il est essentiel de comprendre que ces étapes supplémentaires renforcent la sécurité et l’intégrité des artefacts logiciels, et facilitent la conformité. En intégrant des signatures numériques et en appliquant les bonnes pratiques de gestion des clés, les organisations peuvent établir la confiance, satisfaire aux exigences de conformité et faciliter les audits et la traçabilité, afin de se protéger contre les risques de sécurité majeurs.
Pour commencer à réduire les risques liés à la sécurité de vos images et à les protéger contre toute altération, la signature des conteneurs est une bonne première étape. Les différents outils présentés dans cet article répondent aux besoins de différents groupes d’utilisateurs. Votre choix dépendra du niveau d’efficacité et de flexibilité exigé par vos normes de sécurité et de conformité. Une fois la signature des images mise en place, vous pouvez utiliser des solutions pour analyser et auditer la sécurité des couches de vos images.
Par exemple, Snyk est une plateforme de sécurité destinée aux développeurs qui privilégie une expérience développeur fluide. Elle propose des fonctionnalités d’analyse des images de conteneurs permettant d’identifier les vulnérabilités connues dans les packages inclus dans votre image Docker. Vous pouvez ainsi détecter et corriger les vulnérabilités de manière proactive avant d’envoyer l’image sur Docker Hub ou vers tout autre registre, et renforcer votre posture de sécurité globale.
La sécurité des conteneurs, pensée pour les développeurs
Snyk détecte et corrige automatiquement les vulnérabilités dans les images de conteneurs et les workloads Kubernetes.
