Menu
Notation : sécuriser et signer vos images Docker

Notation : sécuriser et signer vos images Docker

Avec l’adoption croissante de la containerisation, le besoin de sécuriser les applications containerisées et les images Docker devient de plus en plus crucial.

Les conteneurs permettent aux développeurs de packager et de distribuer leurs applications avec toutes leurs dépendances, garantissant une cohérence entre les différents environnements.
Cependant, cette facilité de distribution amène aussi son lot de défis en matière de sécurité. Un point critique est la vérification de l’intégrité et de l’authenticité des images Docker, qu’elles soient construites localement ou qu’il s’agisse d’une nouvelle image téléchargée depuis un registre sécurisé..


C’est là qu’intervient Notation.
J’ai eu l’occasion de l’utiliser dans un cadre professionnel, et je souhaite partager avec vous ce que je considère comme un futur standard en cybersécurité — si ce n’est pas déjà le cas.

Cet article va explorer ce qu’est Notation, pourquoi l’utiliser, et vous guider pas à pas pour le configurer et signer des images Docker.

 

Qu’est-ce que Notation ?

Notation est un outil open source développé dans le cadre du Notary Project qui permet de signer et vérifier des artefacts OCI ( images Docker,Helm charts, etc.) afin de garantir leur authenticité et leur intégrité.

Écrit en Go, Notation permet de garantir que ces artefacts n’ont pas été altérés et proviennent d’une source de confiance.

Cet outil s’intègre facilement dans des pipelines CI/CD sécurisés et des solutions comme Docker Compose, pour une gestion fluide de vos conteneurs Docker et de vos projets multi-conteneurs.

Nous allons ici détailler ses avantages et vous expliquer comment l’installer et l’utiliser pour signer des images Docker.

 

Pourquoi utiliser Notation ?

  1. Renforcer la sécurité des images Docker et artefacts OCI (Open Container Initiative): Signer un artefact permet de s’assurer qu’il n’a pas été modifié et qu’il provient d’une source de confiance. C’est un élément clé pour sécuriser la chaîne d’approvisionnement logicielle en environnement containerisé.
  2. Instaurer la confiance dans vos déploiements : Vérifier une signature avant d’importer une image en production permet de garantir que seules des images vérifiées et approuvées sont déployées.
  3. Répondre aux exigences réglementaires et de conformité : Certains secteurs imposent de prouver l’authenticité des logiciels utilisés. Signer les images Docker contribue à répondre aux normes telles que l’ISO 27001, NIS2, tout en assurant la traçabilité et la sécurité des mises à jour.

 

Artefacts OCI et registres

containerization-using-docker

Avant de plonger dans Notation, il est important de comprendre ce que sont les artefacts et registres OCI.

Artefacts OCI

Un artefact OCI est tout contenu conforme aux spécifications de l’OCI. Les images Docker en sont le type le plus courant. Elles sont composées de  :

  • couches représentant les modifications du système de fichiers,
  • et un manifeste décrivant ces couches.

 

Registres OCI

Les registres OCI sont des dépôts où sont stockés les artefacts. On les utilise souvent pour distribuer des images Docker.

Parmi les plus connus :

  • Docker Hub,
  • Amazon Elastic Container Registry (ECR)
  • Azure Container Registry (ACR).

Ces registres permettent aussi de stocker d'autres types d’artefacts comme des charts Helm.

 

Comment fonctionne Notation ?

Notation crée une signature cryptographique pour un artefact OCI. Cette signature est ensuite attachée à l’artefact et stockée avec lui dans le registre OCI. Lorsqu’un utilisateur télécharge un artefact, il peut vérifier la signature pour s’assurer de son authenticité et qu’il n’a pas été modifié.
Avec un outil comme ORAS, on peut également transférer un artefact OCI et sa signature vers un autre registre.

Génération de la signature

Lorsqu’un artefact est signé avec Notation, l’outil utilise une clé privée pour générer une signature cryptographique. Il s’agit d’un hash unique représentant le contenu exact de l’artefact au moment de la signature.

Attachement de la signature

Une fois la signature générée, Notation l’attache à l’artefact. Elle est stockée comme un artefact OCI à part entière dans le registre, associé à l’original. Cela permet à n’importe qui de le vérifier avec la clé publique correspondante.

Vérification de la signature

Quand un artefact est extrait du registre, Notation peut en vérifier la signature à l’aide de la clé publique. Si la signature est valide, cela confirme que l’artefact est authentique et n’a pas été altéré.

 

Setting Up Notation

Installation

  1. Installer le CLI de Notation :
    Téléchargez-le depuis : le dépôt GitHub officiel de Notation 
    ou via leur site web notary project
  2. Mettre en place un registre compatible OCI :
    Pour un setup rapide, vous pouvez utiliser le registre de Docker Hub : docker run -d -p 5001:5000 -e REGISTRY_STORAGE_DELETE_ENABLED=true --name registry registry
  3. Générer une clé de test et un certificat auto-signé :  notation cert generate-test --default "myfirstsign". Cette commande génère une clé de test avec un certificat X.509 auto-signé, stocké localement. L’option --default indique à Notation d’utiliser cette clé par défaut pour signer.
  4. Créer et importer une politique de confiance (trust policy) :
    Notation dispose de son propre trust store. Il faut donc configurer une politique qui définit les identités de confiance et le niveau de vérification à appliquer :
    shell 
yourtrustpolicy.json 
{ 
    "version": "1.0", 
    "trustPolicies": [ 
        { 
            "name": "simple-image-policy", 
            "registryScopes": [ "*" ], 
            "signatureVerification": { 
                "level" : "strict" 
            }, 
            "trustStores": [ "ca:myfirstsign" ], 
            "trustedIdentities": [ 
                "*" 
            ] 
        } 
    ] 
} 
  • registryScopes : détermine à quels artefacts s’applique la politique (ici, le joker «*» s’applique à tous).
  • signatureVerification.level : «strict» signifie que chaque étape du processus de vérification est contrôlée (Intégrité, Authenticité, Horodatage authentique, Expiration et Vérification de révocation). Si l’une d’elles échoue, la vérification échoue également. Ce comportement est entièrement personnalisable et vous pouvez modifier les différents paramètres prédéfinis en fonction de vos besoins.
  • trustStores : liste des stores de confiance (défini auparavant) à utiliser.
  • trustedIdentities : spécifie un ensemble d’identités que l’utilisateur considère comme fiables. Le «*» (wildcard) signifie que vous faites confiance à toute identité (certificat de signature) émise par la ou les autorités de certification (CA) présentes dans le «trustStore»

Pour plus de détails, je conseille fortement de consulter la documentation GitHub sur les trust policies.

Importer ensuite la politique (policy) : notation policy import ./yourtrustpolicy.json

 

Comment signer une image Docker ?

Étape 1 : Build et push de l’image Docker

docker build -t <your_registry>/myfirstimage:1.0
docker push <your_registry>/myfirstimage:1.0

La sortie de cette commande fournira le digest sha256 (un identifiant unique) de l’image dans le registre, au format «sha256:xyz». Il est important de conserver ce digest, car l’utiliser est une meilleure pratique de sécurité que de se baser sur le tag Docker (par exemple «1.0» ou «latest»), puisque le digest est immuable.

Pour retrouver la valeur du digest :
docker inspect --format='{{index .RepoDigests 0}}' <your_registry>/myfirstimage:1.0

 

Étape 2 : Signer l’image Docker

notation sign <your_registry>/myimage:1.0

Cela génère une signature pour l’image et la pousse dans le registre en l'associant à l'image. Sans option, Notation utilise la clé par défaut.

Étape 3 : Vérifier la signature

notation verify <your_registry>/myimage:1.0

Si la signature est valide, Notation confirmera que l’image est authentique et intacte.

 

Améliorations possibles

Automatiser la vérification

Vous pouvez automatiser la vérification des signatures dans votre pipeline CI/CD pour garantir que seules des images signées soient déployées en production. Cela s’intègre facilement avec des outils comme Jenkins ou GitHub Actions.

Quels registres OCI supportent Notation ?

Notation ne se limite pas aux images Docker. Vous pouvez également signer d’autres artefacts OCI comme :

  • Les charts Helm
  • Des déploiements multi-conteneurs via Docker Compose

Le principe reste le même, seul le type de contenu change.

 

Utiliser une CA de confiance et une PKI interne

Pour les organisations souhaitant renforcer la sécurité et simplifier la gestion de leurs conteneurs :

  • Intégrez Notation avec une autorité de certification (CA) reconnue.
  • Utilisez une infrastructure à clé publique (PKI) interne pour gérer les certificats et les documents signés.

Cela permet de garantir que toutes les signatures sont émises par une CA de confiance, facilitant ainsi leur gestion et leur validation à travers différents environnements.

 

Utiliser une CA de confiance avec Notation

En production, utiliser des certificats émis par une CA reconnue permet d’assurer que les signatures seront validées par des systèmes tiers. Cela implique de générer un certificat de signature auprès de la CA, configurer Notation pour l’utiliser, et distribuer le certificat public associé.

 

Développer des plugins notation pour s'intégrer à une PKI interne"

Pour les organisations disposant d’une PKI interne, le développement de plugins personnalisés pour Notation peut permettre une intégration fluide et une automatisation complète des processus de signature et de vérification.

Ces plugins peuvent connecter directement Notation à votre PKI, automatisant ainsi des tâches telles que la gestion des certificats, la vérification des révocations et la journalisation centralisée des événements de signature.

 

Conclusion

La sécurisation des images Docker est un aspect essentiel pour maintenir un environnement containerisé sûr et fiable.
Notation offre un outil simple d’utilisation pour signer et vérifier les artefacts OCI, garantissant ainsi l’authenticité et l’intégrité des images Docker.

En suivant ce guide, vous serez en mesure de :

  • configurer Notation,
  •  signer et vérifier vos images Docker,


Cela renforce la sécurité tout en instaurant la confiance dans vos processus de déploiement. Et même si ce guide couvre les bases, Notation offre de nombreuses possibilités d’extension et d’automatisation dans vos workflows de développement.

Retour aux articles

C'est à lire...