{"id":457,"date":"2026-03-13T09:18:00","date_gmt":"2026-03-13T08:18:00","guid":{"rendered":"https:\/\/secure-pipelines.com\/?p=457"},"modified":"2026-03-25T08:46:08","modified_gmt":"2026-03-25T07:46:08","slug":"container-image-signing-tools-compared-cosign-notation-gpg","status":"publish","type":"post","link":"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/container-image-signing-tools-compared-cosign-notation-gpg\/","title":{"rendered":"Outils de Signature d&rsquo;Images Container Compar\u00e9s : Cosign vs Notation vs GPG"},"content":{"rendered":"<h2>Pourquoi la signature d&rsquo;images container est essentielle<\/h2>\n<p>Chaque fois que vous r\u00e9cup\u00e9rez une image container et la d\u00e9ployez en production, vous accordez une confiance implicite \u00e0 cet artefact. Mais comment <em>v\u00e9rifiez-vous<\/em> que l&rsquo;image n&rsquo;a pas \u00e9t\u00e9 alt\u00e9r\u00e9e ? Comment confirmez-vous qu&rsquo;elle a r\u00e9ellement \u00e9t\u00e9 construite par votre pipeline CI\/CD et non inject\u00e9e par un attaquant ayant compromis votre registre ?<\/p>\n<p>La signature d&rsquo;images container r\u00e9sout ce probl\u00e8me en attachant une signature cryptographique \u00e0 vos images. Avant le d\u00e9ploiement, votre orchestrateur ou contr\u00f4leur d&rsquo;admission peut v\u00e9rifier cette signature, garantissant que seules des images fiables et authentifi\u00e9es acc\u00e8dent \u00e0 votre environnement. C&rsquo;est un pilier fondamental de la <strong>s\u00e9curit\u00e9 de la cha\u00eene d&rsquo;approvisionnement logicielle<\/strong> et une exigence dans des r\u00e9f\u00e9rentiels tels que <a href=\"https:\/\/slsa.dev\/\" target=\"_blank\" rel=\"noopener\">SLSA<\/a> et <a href=\"https:\/\/www.nist.gov\/itl\/executive-order-14028-improving-nations-cybersecurity\" target=\"_blank\" rel=\"noopener\">NIST SSDF<\/a>.<\/p>\n<p>Cependant, tous les outils de signature ne se valent pas. Les trois approches dominantes aujourd&rsquo;hui \u2014 <strong>Cosign<\/strong> (issu du projet Sigstore), <strong>Notation<\/strong> (le client Notary v2) et <strong>GPG<\/strong> (l&rsquo;approche traditionnelle) \u2014 pr\u00e9sentent chacune des compromis radicalement diff\u00e9rents en mati\u00e8re de gestion des cl\u00e9s, d&rsquo;int\u00e9gration CI\/CD et de compatibilit\u00e9 avec l&rsquo;\u00e9cosyst\u00e8me.<\/p>\n<p>Dans ce guide, nous r\u00e9alisons une comparaison approfondie et pratique des trois outils afin de vous aider \u00e0 faire le bon choix pour vos pipelines.<\/p>\n<h2>Cosign et l&rsquo;\u00e9cosyst\u00e8me Sigstore<\/h2>\n<h3>Pr\u00e9sentation<\/h3>\n<p>Cosign est l&rsquo;outil de signature d&rsquo;images container du <a href=\"https:\/\/www.sigstore.dev\/\" target=\"_blank\" rel=\"noopener\">projet Sigstore<\/a>, d\u00e9sormais un projet dipl\u00f4m\u00e9 (graduated) sous la Linux Foundation. La mission de Sigstore est de rendre la signature logicielle omnipr\u00e9sente en supprimant le plus grand obstacle : <strong>la gestion des cl\u00e9s<\/strong>.<\/p>\n<p>Cosign stocke les signatures en tant qu&rsquo;artefacts OCI directement aux c\u00f4t\u00e9s de l&rsquo;image sign\u00e9e dans le m\u00eame registre. Cela signifie qu&rsquo;il n&rsquo;y a aucun syst\u00e8me de stockage de signatures s\u00e9par\u00e9 \u00e0 maintenir \u2014 votre registre de conteneurs existant (Docker Hub, GitHub Container Registry, AWS ECR, Google Artifact Registry, etc.) remplit cette double fonction.<\/p>\n<h3>Signature keyless avec Fulcio et Rekor<\/h3>\n<p>La fonctionnalit\u00e9 la plus r\u00e9volutionnaire de Cosign est la <strong>signature keyless<\/strong>. Au lieu de g\u00e9rer des cl\u00e9s de signature \u00e0 longue dur\u00e9e de vie, Cosign s&rsquo;int\u00e8gre \u00e0 deux services :<\/p>\n<ul>\n<li><strong>Fulcio<\/strong> \u2014 Une autorit\u00e9 de certification qui \u00e9met des certificats de signature \u00e0 dur\u00e9e de vie courte bas\u00e9s sur une identit\u00e9 OpenID Connect (OIDC). Dans un contexte CI\/CD, il s&rsquo;agit g\u00e9n\u00e9ralement du jeton d&rsquo;identit\u00e9 fourni par votre fournisseur de pipeline (GitHub Actions OIDC, GitLab CI OIDC, etc.).<\/li>\n<li><strong>Rekor<\/strong> \u2014 Un journal de transparence immuable qui enregistre chaque \u00e9v\u00e9nement de signature. Cela fournit une piste d&rsquo;audit infalsifiable indiquant qui a sign\u00e9 quoi et quand.<\/li>\n<\/ul>\n<p>Avec la signature keyless, le flux de travail se d\u00e9roule ainsi :<\/p>\n<ol>\n<li>Votre pipeline CI demande un jeton OIDC au fournisseur de pipeline.<\/li>\n<li>Cosign pr\u00e9sente ce jeton \u00e0 Fulcio, qui \u00e9met un certificat \u00e0 courte dur\u00e9e de vie liant l&rsquo;identit\u00e9 du pipeline \u00e0 une paire de cl\u00e9s \u00e9ph\u00e9m\u00e8re.<\/li>\n<li>Cosign signe le digest de l&rsquo;image avec la cl\u00e9 priv\u00e9e \u00e9ph\u00e9m\u00e8re.<\/li>\n<li>La signature et le certificat sont enregistr\u00e9s dans le journal de transparence Rekor.<\/li>\n<li>La cl\u00e9 priv\u00e9e \u00e9ph\u00e9m\u00e8re est supprim\u00e9e \u2014 elle n&rsquo;a exist\u00e9 que pendant quelques secondes.<\/li>\n<\/ol>\n<p>Cela \u00e9limine toute la cat\u00e9gorie de probl\u00e8mes li\u00e9s \u00e0 la rotation des cl\u00e9s, au stockage des cl\u00e9s et \u00e0 la compromission des cl\u00e9s. Il n&rsquo;y a aucun secret \u00e0 longue dur\u00e9e de vie \u00e0 prot\u00e9ger.<\/p>\n<h3>Signature bas\u00e9e sur des cl\u00e9s<\/h3>\n<p>Cosign prend \u00e9galement en charge la signature traditionnelle par paire de cl\u00e9s pour les environnements o\u00f9 le mode keyless n&rsquo;est pas envisageable (r\u00e9seaux isol\u00e9s, exigences r\u00e9glementaires imposant une garde sp\u00e9cifique des cl\u00e9s). Vous g\u00e9n\u00e9rez une paire de cl\u00e9s avec <code>cosign generate-key-pair<\/code> et signez avec <code>cosign sign --key cosign.key<\/code>.<\/p>\n<h3>Exemple d&rsquo;int\u00e9gration CI\/CD : GitHub Actions<\/h3>\n<pre><code># .github\/workflows\/sign.yml\njobs:\n  sign:\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write   # Required for keyless signing\n      packages: write   # Required to push signatures to GHCR\n    steps:\n      - uses: sigstore\/cosign-installer@v3\n\n      - name: Sign the container image (keyless)\n        env:\n          COSIGN_EXPERIMENTAL: 1\n        run: |\n          cosign sign --yes ghcr.io\/myorg\/myapp@sha256:abc123...\n\n      - name: Verify the signature\n        run: |\n          cosign verify \\\n            --certificate-oidc-issuer https:\/\/token.actions.githubusercontent.com \\\n            --certificate-identity-regexp https:\/\/github.com\/myorg\/myapp\/.github\/workflows\/* \\\n            ghcr.io\/myorg\/myapp@sha256:abc123...\n<\/code><\/pre>\n<p>La permission <code>id-token: write<\/code> est l&rsquo;\u00e9l\u00e9ment critique \u2014 elle permet \u00e0 GitHub Actions de g\u00e9n\u00e9rer le jeton OIDC que Fulcio utilise pour \u00e9mettre le certificat de signature. Aucun secret \u00e0 configurer, aucune cl\u00e9 \u00e0 stocker. Pour un tutoriel pratique pas \u00e0 pas, consultez notre <a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-signing-verifying-container-images-cosign-github-actions\/\">Lab de signature keyless avec Cosign<\/a>.<\/p>\n<h3>Points forts<\/h3>\n<ul>\n<li>La signature keyless \u00e9limine enti\u00e8rement la gestion des cl\u00e9s en CI\/CD<\/li>\n<li>Le journal de transparence (Rekor) fournit une piste d&rsquo;audit immuable<\/li>\n<li>Stockage natif en artefact OCI \u2014 aucun magasin de signatures externe n\u00e9cessaire<\/li>\n<li>V\u00e9rification riche par politique avec correspondance d&rsquo;identit\u00e9 de certificat<\/li>\n<li>Large support de l&rsquo;\u00e9cosyst\u00e8me (Kyverno, OPA Gatekeeper, contr\u00f4leurs de politiques Kubernetes)<\/li>\n<li>Communaut\u00e9 open source active et bien financ\u00e9e<\/li>\n<\/ul>\n<h3>Limitations<\/h3>\n<ul>\n<li>Le mode keyless n\u00e9cessite un acc\u00e8s internet \u00e0 Fulcio et Rekor (contraignant pour les environnements isol\u00e9s)<\/li>\n<li>La v\u00e9rification en environnement isol\u00e9 n\u00e9cessite la mise en miroir du journal de transparence<\/li>\n<li>Projet relativement jeune par rapport \u00e0 GPG (bien que d\u00e9sormais stable et dipl\u00f4m\u00e9)<\/li>\n<\/ul>\n<h2>Notation et Notary v2<\/h2>\n<h3>Pr\u00e9sentation<\/h3>\n<p><a href=\"https:\/\/notaryproject.dev\/\" target=\"_blank\" rel=\"noopener\">Notation<\/a> est le client CLI de la sp\u00e9cification Notary v2, un projet CNCF soutenu principalement par Microsoft et AWS. L\u00e0 o\u00f9 Cosign a \u00e9t\u00e9 con\u00e7u sp\u00e9cifiquement pour l&rsquo;\u00e9cosyst\u00e8me Sigstore, Notation a \u00e9t\u00e9 pens\u00e9 pour s&rsquo;int\u00e9grer aux infrastructures PKI d&rsquo;entreprise et aux workflows de certificats X.509 existants.<\/p>\n<p>Notation utilise des signatures <strong>COSE (CBOR Object Signing and Encryption)<\/strong> stock\u00e9es en tant qu&rsquo;artefacts OCI attach\u00e9s \u00e0 l&rsquo;image sign\u00e9e via la sp\u00e9cification <a href=\"https:\/\/oras.land\/\" target=\"_blank\" rel=\"noopener\">ORAS<\/a> (OCI Registry As Storage). Comme Cosign, cela signifie que les signatures r\u00e9sident dans le registre OCI aux c\u00f4t\u00e9s des images.<\/p>\n<h3>Gestion des cl\u00e9s avec des plugins<\/h3>\n<p>Notation utilise une architecture de plugins pour la gestion des cl\u00e9s. Au lieu de manipuler les cl\u00e9s directement, il d\u00e9l\u00e8gue \u00e0 des plugins qui interfacent avec des coffres-forts de cl\u00e9s externes :<\/p>\n<ul>\n<li><strong>Plugin Azure Key Vault<\/strong> \u2014 Signe en utilisant des cl\u00e9s stock\u00e9es dans Azure Key Vault.<\/li>\n<li><strong>Plugin AWS Signer<\/strong> \u2014 Utilise AWS Signer, un service de signature enti\u00e8rement manag\u00e9.<\/li>\n<li><strong>Plugin HashiCorp Vault<\/strong> \u2014 S&rsquo;int\u00e8gre au moteur de secrets de transit de Vault.<\/li>\n<\/ul>\n<p>Ce mod\u00e8le de plugins est naturellement adapt\u00e9 aux entreprises disposant d\u00e9j\u00e0 d&rsquo;une gestion centralis\u00e9e des cl\u00e9s et d&rsquo;une infrastructure PKI. La cl\u00e9 de signature ne quitte jamais le HSM ou le KMS cloud \u2014 Notation envoie le digest au plugin, et le plugin renvoie la signature.<\/p>\n<h3>Politiques de confiance et magasins de confiance<\/h3>\n<p>Notation utilise un syst\u00e8me de <strong>politiques de confiance<\/strong> bas\u00e9 sur JSON pour la v\u00e9rification. Vous d\u00e9finissez quels registres, d\u00e9p\u00f4ts et images vous faites confiance, ainsi que les certificats ou cha\u00eenes de certificats autoris\u00e9s \u00e0 les signer. Ceci est particuli\u00e8rement puissant pour les sc\u00e9narios de gouvernance d&rsquo;entreprise o\u00f9 diff\u00e9rentes \u00e9quipes disposent de diff\u00e9rentes autorit\u00e9s de signature.<\/p>\n<pre><code>\/\/ trustpolicy.json\n{\n  \"version\": \"1.0\",\n  \"trustPolicies\": [\n    {\n      \"name\": \"production-images\",\n      \"registryScopes\": [\"registry.example.com\/prod\/*\"],\n      \"signatureVerification\": {\n        \"level\": \"strict\"\n      },\n      \"trustStores\": [\"ca:production-ca\"],\n      \"trustedIdentities\": [\"x509.subject: CN=prod-signer, O=MyOrg\"]\n    }\n  ]\n}\n<\/code><\/pre>\n<h3>Exemple d&rsquo;int\u00e9gration CI\/CD : GitHub Actions avec AWS Signer<\/h3>\n<pre><code># .github\/workflows\/notation-sign.yml\njobs:\n  sign:\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write  # For AWS OIDC federation\n    steps:\n      - name: Configure AWS credentials\n        uses: aws-actions\/configure-aws-credentials@v4\n        with:\n          role-to-assume: arn:aws:iam::123456789012:role\/signer-role\n          aws-region: us-east-1\n\n      - name: Setup Notation\n        uses: notaryproject\/notation-action\/setup@v1\n\n      - name: Install AWS Signer plugin\n        run: |\n          notation plugin install \\\n            --url https:\/\/d2hvyiie56hcat.cloudfront.net\/linux\/amd64\/plugin\/latest\/notation-aws-signer-plugin.zip\n\n      - name: Sign the container image\n        run: |\n          notation sign \\\n            --plugin com.amazonaws.signer.notation.plugin \\\n            --id arn:aws:signer:us-east-1:123456789012:\/signing-profiles\/MyProfile \\\n            registry.example.com\/myapp@sha256:abc123...\n<\/code><\/pre>\n<h3>Points forts<\/h3>\n<ul>\n<li>Architecture de plugins adapt\u00e9e aux entreprises, s&rsquo;int\u00e9grant aux PKI et KMS existants<\/li>\n<li>Cadre riche de politiques de confiance pour une v\u00e9rification granulaire par registre<\/li>\n<li>Le format de signature COSE est un standard IETF bien \u00e9tabli<\/li>\n<li>Fort soutien de Microsoft (Azure) et AWS<\/li>\n<li>Con\u00e7u pour les organisations disposant de workflows de certificats X.509 existants<\/li>\n<li>La v\u00e9rification hors ligne est simple \u2014 il suffit de disposer des certificats du magasin de confiance<\/li>\n<\/ul>\n<h3>Limitations<\/h3>\n<ul>\n<li>Pas de signature keyless \u2014 vous devez g\u00e9rer des certificats et des cl\u00e9s (m\u00eame si d\u00e9l\u00e9gu\u00e9s \u00e0 un KMS)<\/li>\n<li>Pas d&rsquo;\u00e9quivalent int\u00e9gr\u00e9 de journal de transparence<\/li>\n<li>L&rsquo;\u00e9cosyst\u00e8me de plugins est encore en croissance ; moins de plugins que les points d&rsquo;int\u00e9gration de Cosign<\/li>\n<li>Communaut\u00e9 plus restreinte et moins de tutoriels par rapport \u00e0 Cosign<\/li>\n<li>La configuration des politiques de confiance peut \u00eatre complexe pour des cas d&rsquo;usage simples<\/li>\n<\/ul>\n<h2>GPG : l&rsquo;approche traditionnelle<\/h2>\n<h3>Pr\u00e9sentation<\/h3>\n<p>GPG (GNU Privacy Guard) est le v\u00e9t\u00e9ran du monde de la signature. Bien avant l&rsquo;existence des outils de signature natifs pour conteneurs, GPG \u00e9tait utilis\u00e9 pour signer de tout \u2014 des courriels aux commits Git en passant par les paquets Linux. Certaines \u00e9quipes utilisent encore GPG pour signer des images container, notamment via Docker Content Trust (DCT) ou en signant les manifestes d&rsquo;images de mani\u00e8re externe (out-of-band).<\/p>\n<h3>Fonctionnement de la signature GPG pour les conteneurs<\/h3>\n<p>La signature GPG des conteneurs suit g\u00e9n\u00e9ralement l&rsquo;un de ces deux sch\u00e9mas :<\/p>\n<ul>\n<li><strong>Signature out-of-band :<\/strong> Exporter le manifeste ou le digest de l&rsquo;image, le signer avec <code>gpg --detach-sign<\/code>, et stocker le fichier <code>.sig<\/code> aux c\u00f4t\u00e9s de l&rsquo;image (dans un d\u00e9p\u00f4t d&rsquo;artefacts s\u00e9par\u00e9, un bucket S3 ou un d\u00e9p\u00f4t Git).<\/li>\n<li><strong>Int\u00e9gration Podman\/Skopeo :<\/strong> Podman et Skopeo disposent d&rsquo;un support natif des signatures GPG. Les signatures sont stock\u00e9es sur un serveur de signatures s\u00e9par\u00e9 (un serveur web servant des signatures d\u00e9tach\u00e9es) et v\u00e9rifi\u00e9es au moment du pull \u00e0 l&rsquo;aide d&rsquo;un fichier de politique (<code>\/etc\/containers\/policy.json<\/code>).<\/li>\n<\/ul>\n<p>Docker Content Trust (DCT) utilise une approche apparent\u00e9e mais distincte bas\u00e9e sur The Update Framework (TUF), avec Notary v1 comme backend. Bien que DCT utilise des primitives cryptographiques diff\u00e9rentes du GPG brut, il partage le m\u00eame d\u00e9fi fondamental : la gestion de cl\u00e9s \u00e0 longue dur\u00e9e de vie.<\/p>\n<h3>D\u00e9fis de la gestion des cl\u00e9s<\/h3>\n<p>La plus grande faiblesse de GPG dans un contexte CI\/CD est la gestion des cl\u00e9s :<\/p>\n<ul>\n<li>Vous devez g\u00e9n\u00e9rer, distribuer, renouveler et r\u00e9voquer des paires de cl\u00e9s \u00e0 longue dur\u00e9e de vie<\/li>\n<li>Les cl\u00e9s priv\u00e9es doivent \u00eatre inject\u00e9es de mani\u00e8re s\u00e9curis\u00e9e dans les runners CI\/CD en tant que secrets<\/li>\n<li>Il n&rsquo;existe aucun m\u00e9canisme int\u00e9gr\u00e9 de s\u00e9questre ou de r\u00e9cup\u00e9ration de cl\u00e9s<\/li>\n<li>La distribution des cl\u00e9s aux v\u00e9rificateurs (n\u0153uds de cluster, contr\u00f4leurs d&rsquo;admission) n\u00e9cessite des processus manuels ou un serveur de cl\u00e9s<\/li>\n<li>La compromission d&rsquo;une cl\u00e9 n\u00e9cessite une rotation d&rsquo;urgence sur tous les syst\u00e8mes<\/li>\n<\/ul>\n<h3>Exemple d&rsquo;int\u00e9gration CI\/CD : GitLab CI avec GPG<\/h3>\n<pre><code># .gitlab-ci.yml\nsign-image:\n  stage: sign\n  image: alpine:latest\n  before_script:\n    - apk add --no-cache gnupg skopeo\n    - echo \"$GPG_PRIVATE_KEY\" | gpg --batch --import\n  script:\n    - skopeo copy \\\n        --sign-by signing-key@myorg.com \\\n        docker:\/\/registry.example.com\/myapp:${CI_COMMIT_SHORT_SHA} \\\n        docker:\/\/registry.example.com\/myapp:${CI_COMMIT_SHORT_SHA}\n  variables:\n    GPG_PRIVATE_KEY: $GPG_SIGNING_KEY  # Stored in CI\/CD variables\n<\/code><\/pre>\n<p>Remarquez comment la cl\u00e9 priv\u00e9e doit \u00eatre stock\u00e9e en tant que secret CI\/CD et inject\u00e9e au moment de l&rsquo;ex\u00e9cution \u2014 exactement le type de gestion de secrets \u00e0 longue dur\u00e9e de vie que la signature keyless a \u00e9t\u00e9 con\u00e7ue pour \u00e9liminer.<\/p>\n<h3>Points forts<\/h3>\n<ul>\n<li>Cryptographie \u00e9prouv\u00e9e \u2014 GPG a \u00e9t\u00e9 audit\u00e9 et durci pendant des d\u00e9cennies<\/li>\n<li>Fonctionne dans des environnements enti\u00e8rement isol\u00e9s sans aucune d\u00e9pendance externe<\/li>\n<li>Familier pour les \u00e9quipes d&rsquo;exploitation ayant une exp\u00e9rience Linux\/s\u00e9curit\u00e9<\/li>\n<li>Large support d&rsquo;outillage dans l&rsquo;\u00e9cosyst\u00e8me Podman\/Skopeo<\/li>\n<li>Contr\u00f4le total sur le mat\u00e9riel cryptographique (important pour certains cadres de conformit\u00e9)<\/li>\n<\/ul>\n<h3>Limitations<\/h3>\n<ul>\n<li>La gestion manuelle et sujette aux erreurs des cl\u00e9s est le principal fardeau op\u00e9rationnel<\/li>\n<li>Pas de mode keyless \u2014 les cl\u00e9s priv\u00e9es doivent r\u00e9sider quelque part accessible au CI\/CD<\/li>\n<li>Pas de stockage natif en artefact OCI \u2014 les signatures sont stock\u00e9es de mani\u00e8re externe (out-of-band)<\/li>\n<li>Pas de journal de transparence pour les pistes d&rsquo;audit<\/li>\n<li>La distribution et la d\u00e9couverte des signatures sont fragment\u00e9es<\/li>\n<li>Docker\/containerd ne v\u00e9rifient pas nativement les signatures GPG (n\u00e9cessite Podman\/Skopeo ou un outillage personnalis\u00e9)<\/li>\n<\/ul>\n<h2>Comparaison c\u00f4te \u00e0 c\u00f4te<\/h2>\n<table>\n<thead>\n<tr>\n<th>Fonctionnalit\u00e9<\/th>\n<th>Cosign (Sigstore)<\/th>\n<th>Notation (Notary v2)<\/th>\n<th>GPG<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Gestion des cl\u00e9s<\/strong><\/td>\n<td>Keyless (OIDC) ou paires de cl\u00e9s statiques<\/td>\n<td>Bas\u00e9e sur des plugins (KMS, HSM, coffres-forts cloud)<\/td>\n<td>Paires de cl\u00e9s PGP manuelles<\/td>\n<\/tr>\n<tr>\n<td><strong>Signature keyless<\/strong><\/td>\n<td>Oui (Fulcio + OIDC)<\/td>\n<td>Non<\/td>\n<td>Non<\/td>\n<\/tr>\n<tr>\n<td><strong>Format de signature<\/strong><\/td>\n<td>Enveloppe JSON (in-toto\/DSSE)<\/td>\n<td>Signatures COSE (CBOR)<\/td>\n<td>Signatures d\u00e9tach\u00e9es PGP<\/td>\n<\/tr>\n<tr>\n<td><strong>Stockage des signatures<\/strong><\/td>\n<td>Registre OCI (en tant qu&rsquo;artefacts OCI)<\/td>\n<td>Registre OCI (via ORAS)<\/td>\n<td>Externe (serveur web, S3, Git)<\/td>\n<\/tr>\n<tr>\n<td><strong>Compatibilit\u00e9 registre OCI<\/strong><\/td>\n<td>Excellente \u2014 fonctionne avec tous les registres majeurs<\/td>\n<td>Bonne \u2014 n\u00e9cessite le support de l&rsquo;API OCI 1.1 referrers<\/td>\n<td>Aucune \u2014 signatures stock\u00e9es en externe<\/td>\n<\/tr>\n<tr>\n<td><strong>Journal de transparence<\/strong><\/td>\n<td>Oui (Rekor)<\/td>\n<td>Non (pr\u00e9vu)<\/td>\n<td>Non<\/td>\n<\/tr>\n<tr>\n<td><strong>Int\u00e9gration CI\/CD<\/strong><\/td>\n<td>Excellente \u2014 GitHub Actions, GitLab CI, Tekton, support OIDC natif<\/td>\n<td>Bonne \u2014 GitHub Actions, compatible avec tout CI via plugins<\/td>\n<td>Manuelle \u2014 n\u00e9cessite l&rsquo;injection de secrets de cl\u00e9s priv\u00e9es<\/td>\n<\/tr>\n<tr>\n<td><strong>Politiques Kubernetes<\/strong><\/td>\n<td>Kyverno, OPA Gatekeeper, Sigstore Policy Controller<\/td>\n<td>Ratify (avec Gatekeeper), Kyverno (limit\u00e9)<\/td>\n<td>N\u00e9cessite un webhook d&rsquo;admission personnalis\u00e9<\/td>\n<\/tr>\n<tr>\n<td><strong>Support environnement isol\u00e9<\/strong><\/td>\n<td>Possible (n\u00e9cessite miroir TUF root, miroir Rekor)<\/td>\n<td>Oui (simple avec un magasin de confiance local)<\/td>\n<td>Oui (enti\u00e8rement utilisable hors ligne)<\/td>\n<\/tr>\n<tr>\n<td><strong>\u00c9cosyst\u00e8me et communaut\u00e9<\/strong><\/td>\n<td>Large \u2014 Linux Foundation, Google, Red Hat, GitHub<\/td>\n<td>En croissance \u2014 CNCF, Microsoft, AWS<\/td>\n<td>Mature mais en d\u00e9clin pour l&rsquo;usage container<\/td>\n<\/tr>\n<tr>\n<td><strong>Courbe d&rsquo;apprentissage<\/strong><\/td>\n<td>Faible (keyless) \u00e0 Moyenne (cl\u00e9s avec politiques)<\/td>\n<td>Moyenne \u00e0 \u00c9lev\u00e9e (plugins, politiques de confiance, PKI)<\/td>\n<td>Moyenne (outillage familier, op\u00e9rations p\u00e9nibles)<\/td>\n<\/tr>\n<tr>\n<td><strong>Support des attestations<\/strong><\/td>\n<td>Oui (SBOM, provenance SLSA, pr\u00e9dicats personnalis\u00e9s)<\/td>\n<td>Oui (via artefacts attach\u00e9s ORAS)<\/td>\n<td>Pas de support natif<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Matrice de d\u00e9cision : quand utiliser quel outil<\/h2>\n<p>Le choix du bon outil de signature d\u00e9pend du contexte de votre organisation. Voici un cadre d\u00e9cisionnel pratique :<\/p>\n<h3>Choisissez Cosign si :<\/h3>\n<ul>\n<li><strong>Vous d\u00e9marrez de z\u00e9ro<\/strong> avec la signature de conteneurs et souhaitez le chemin le plus rapide vers la production.<\/li>\n<li><strong>Vous utilisez GitHub Actions, GitLab CI ou un autre syst\u00e8me CI\/CD compatible OIDC<\/strong> \u2014 la signature keyless fonctionne imm\u00e9diatement.<\/li>\n<li><strong>Vous souhaitez un journal de transparence<\/strong> pour l&rsquo;audit et la conformit\u00e9 sans avoir \u00e0 en construire un vous-m\u00eame.<\/li>\n<li><strong>Vous adoptez les attestations SLSA ou in-toto<\/strong> \u2014 Cosign offre un support de premier ordre pour attacher des SBOM et des m\u00e9tadonn\u00e9es de provenance.<\/li>\n<li><strong>Vous souhaitez une large int\u00e9gration des politiques Kubernetes<\/strong> avec Kyverno ou Sigstore Policy Controller.<\/li>\n<li><strong>Vous \u00eates une startup ou une organisation de taille moyenne<\/strong> sans \u00e9quipe PKI d\u00e9di\u00e9e.<\/li>\n<\/ul>\n<p>Pour un guide complet sur Sigstore et la signature keyless, consultez notre <a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/signing-verifying-container-images-sigstore-cosign\/\">Guide de signature keyless Sigstore et Cosign<\/a>.<\/p>\n<h3>Choisissez Notation si :<\/h3>\n<ul>\n<li><strong>Votre organisation dispose d&rsquo;une infrastructure PKI existante<\/strong> et de workflows de gestion de certificats X.509 que vous souhaitez exploiter.<\/li>\n<li><strong>Vous \u00eates fortement investi dans Azure ou AWS<\/strong> et souhaitez une int\u00e9gration native avec Azure Key Vault ou AWS Signer.<\/li>\n<li><strong>Vous avez besoin de politiques de confiance granulaires<\/strong> scop\u00e9es \u00e0 des registres, d\u00e9p\u00f4ts ou \u00e9quipes sp\u00e9cifiques.<\/li>\n<li><strong>Les exigences de conformit\u00e9 imposent une garde sp\u00e9cifique des cl\u00e9s<\/strong> (FIPS 140-2, FedRAMP) o\u00f9 la signature keyless ne satisfait pas aux crit\u00e8res.<\/li>\n<li><strong>Vous op\u00e9rez dans un environnement o\u00f9 l&rsquo;infrastructure publique Sigstore n&rsquo;est pas accessible<\/strong> mais vous disposez d&rsquo;une PKI interne.<\/li>\n<\/ul>\n<h3>Choisissez GPG si :<\/h3>\n<ul>\n<li><strong>Vous \u00eates dans un environnement enti\u00e8rement isol\u00e9<\/strong> sans aucune d\u00e9pendance externe autoris\u00e9e.<\/li>\n<li><strong>Vous utilisez Podman\/Skopeo comme runtime de conteneurs principal<\/strong> et disposez d\u00e9j\u00e0 d&rsquo;une infrastructure de cl\u00e9s GPG.<\/li>\n<li><strong>Des exigences r\u00e9glementaires imposent sp\u00e9cifiquement GPG<\/strong> (rare, mais certains contrats gouvernementaux le sp\u00e9cifient).<\/li>\n<li><strong>Vous signez des artefacts non-OCI<\/strong> en plus des conteneurs et souhaitez un outil de signature unique.<\/li>\n<\/ul>\n<p>Pour la plupart des \u00e9quipes d\u00e9veloppant des applications cloud-native modernes, <strong>Cosign avec la signature keyless est le choix recommand\u00e9 par d\u00e9faut<\/strong>. Il offre le meilleur ratio s\u00e9curit\u00e9\/complexit\u00e9 op\u00e9rationnelle et \u00e9limine le fardeau de la gestion des cl\u00e9s qui fait \u00e9chouer la plupart des initiatives de signature en pratique.<\/p>\n<h2>Sch\u00e9mas d&rsquo;int\u00e9gration CI\/CD<\/h2>\n<p>Au-del\u00e0 des exemples individuels ci-dessus, voici des sch\u00e9mas architecturaux pour int\u00e9grer la signature dans votre pipeline :<\/p>\n<h3>Sch\u00e9ma 1 : Signature \u00e0 la construction (Cosign Keyless)<\/h3>\n<p>Le sch\u00e9ma le plus simple. Le m\u00eame job de pipeline qui construit et pousse l&rsquo;image la signe \u00e9galement. La signature keyless signifie qu&rsquo;aucun secret n&rsquo;est \u00e0 g\u00e9rer :<\/p>\n<pre><code>Build Image \u2192 Push to Registry \u2192 Cosign Sign (keyless) \u2192 Record in Rekor\n<\/code><\/pre>\n<p>Cela fonctionne parfaitement avec GitHub Actions, GitLab CI 16.0+ et tout syst\u00e8me CI fournissant des jetons OIDC. L&rsquo;identit\u00e9 OIDC du pipeline <em>devient<\/em> l&rsquo;identit\u00e9 de signature, cr\u00e9ant une cha\u00eene v\u00e9rifiable du commit source \u00e0 l&rsquo;image sign\u00e9e.<\/p>\n<h3>Sch\u00e9ma 2 : Service de signature centralis\u00e9 (Notation + KMS)<\/h3>\n<p>Pour les entreprises souhaitant une s\u00e9paration des responsabilit\u00e9s, un service de signature centralis\u00e9 re\u00e7oit les artefacts de build et les signe \u00e0 l&rsquo;aide de cl\u00e9s stock\u00e9es dans un KMS :<\/p>\n<pre><code>Build Pipeline \u2192 Push to Registry \u2192 Request Signing \u2192 Notation Sign (KMS plugin) \u2192 Approval Workflow\n<\/code><\/pre>\n<p>Ce sch\u00e9ma permet des sc\u00e9narios o\u00f9 l&rsquo;\u00e9quipe de build ne peut pas signer directement \u2014 une \u00e9quipe de s\u00e9curit\u00e9 distincte ou un moteur de politiques automatis\u00e9 doit approuver et signer l&rsquo;artefact. Les politiques d&rsquo;acc\u00e8s d&rsquo;AWS Signer et d&rsquo;Azure Key Vault contr\u00f4lent qui peut demander des signatures.<\/p>\n<h3>Sch\u00e9ma 3 : Portes de v\u00e9rification (tout outil)<\/h3>\n<p>Quel que soit l&rsquo;outil de signature utilis\u00e9, la v\u00e9rification est tout aussi importante. Impl\u00e9mentez la v\u00e9rification \u00e0 plusieurs points :<\/p>\n<ul>\n<li><strong>Porte de pr\u00e9-d\u00e9ploiement :<\/strong> Un contr\u00f4leur d&rsquo;admission Kubernetes (Kyverno, Gatekeeper + Ratify, Sigstore Policy Controller) rejette les images non sign\u00e9es ou mal sign\u00e9es.<\/li>\n<li><strong>Porte de promotion :<\/strong> Avant de promouvoir une image du registre de staging vers celui de production, v\u00e9rifiez sa signature.<\/li>\n<li><strong>Audit en runtime :<\/strong> Analysez p\u00e9riodiquement les charges de travail en cours d&rsquo;ex\u00e9cution et v\u00e9rifiez que leurs signatures sont toujours valides par rapport aux politiques de confiance actuelles.<\/li>\n<\/ul>\n<h3>Strat\u00e9gie multi-outils<\/h3>\n<p>Certaines organisations utilisent plusieurs outils. Par exemple, Cosign pour la signature dans les pipelines CI\/CD (commodit\u00e9 du keyless) et Notation pour la signature des releases (conformit\u00e9 PKI d&rsquo;entreprise). Les deux stockent les signatures en tant qu&rsquo;artefacts OCI, ils peuvent donc coexister sur la m\u00eame image. Les politiques de v\u00e9rification peuvent exiger des signatures des <em>deux<\/em> outils avant d&rsquo;autoriser le d\u00e9ploiement.<\/p>\n<h2>L&rsquo;avenir de la signature de conteneurs<\/h2>\n<p>Le paysage de la signature de conteneurs converge vers plusieurs tendances importantes :<\/p>\n<ul>\n<li><strong>OCI 1.1 et l&rsquo;API Referrers :<\/strong> La sp\u00e9cification de distribution OCI supporte d\u00e9sormais nativement les r\u00e9f\u00e9rences d&rsquo;artefacts, que Cosign et Notation exploitent. Cela standardise la fa\u00e7on dont les signatures, SBOM et attestations s&rsquo;attachent aux images.<\/li>\n<li><strong>Attestations SLSA et in-toto :<\/strong> La signature \u00e9volue au-del\u00e0 de \u00ab qui a construit ceci \u00bb pour inclure la provenance de build v\u00e9rifiable, les manifestes de d\u00e9pendances et les r\u00e9sultats d&rsquo;analyses de s\u00e9curit\u00e9 \u2014 le tout sign\u00e9 et attach\u00e9 \u00e0 l&rsquo;image.<\/li>\n<li><strong>Policy-as-Code :<\/strong> Des outils comme Kyverno et Gatekeeper permettent d&rsquo;exprimer des exigences de signature complexes sous forme de politiques d\u00e9claratives, r\u00e9duisant l&rsquo;\u00e9cart entre l&rsquo;intention de s\u00e9curit\u00e9 et son application.<\/li>\n<li><strong>Adoption de Sigstore :<\/strong> Les \u00e9cosyst\u00e8mes majeurs de paquets (npm, PyPI, Maven Central) adoptent Sigstore, ce qui accro\u00eet la familiarit\u00e9 et la maturit\u00e9 de l&rsquo;outillage \u00e0 travers l&rsquo;industrie.<\/li>\n<\/ul>\n<h2>Conclusion et recommandation<\/h2>\n<p>Les trois outils r\u00e9solvent le probl\u00e8me fondamental de la v\u00e9rification de l&rsquo;authenticit\u00e9 des images container, mais ils r\u00e9pondent \u00e0 des contextes diff\u00e9rents :<\/p>\n<ul>\n<li><strong>Cosign<\/strong> est le meilleur choix pour la plupart des \u00e9quipes. La signature keyless supprime le fardeau op\u00e9rationnel qui fait \u00e9chouer les initiatives de signature, le journal de transparence fournit des capacit\u00e9s d&rsquo;audit pr\u00eates \u00e0 l&#8217;emploi, et l&rsquo;int\u00e9gration dans l&rsquo;\u00e9cosyst\u00e8me est la plus large. Si vous lancez une nouvelle initiative de signature de conteneurs, commencez ici.<\/li>\n<li><strong>Notation<\/strong> est le bon choix pour les entreprises disposant d&rsquo;une PKI \u00e9tablie et d&rsquo;exigences de conformit\u00e9 sp\u00e9cifiques en mati\u00e8re de garde des cl\u00e9s. Son mod\u00e8le de plugins et son cadre de politiques de confiance sont con\u00e7us pour les organisations n\u00e9cessitant une autorit\u00e9 de signature fine et d\u00e9l\u00e9gu\u00e9e.<\/li>\n<li><strong>GPG<\/strong> devrait \u00eatre r\u00e9serv\u00e9 aux environnements legacy, aux syst\u00e8mes enti\u00e8rement isol\u00e9s ou aux workflows natifs Podman o\u00f9 les autres outils ne peuvent v\u00e9ritablement pas \u00eatre utilis\u00e9s. Pour les nouveaux d\u00e9ploiements, la charge op\u00e9rationnelle de la gestion des cl\u00e9s GPG est difficile \u00e0 justifier.<\/li>\n<\/ul>\n<p>Le plus important est de <strong>commencer \u00e0 signer<\/strong>. Une impl\u00e9mentation de signature imparfaite qui est r\u00e9ellement mise en production a infiniment plus de valeur qu&rsquo;une impl\u00e9mentation parfaite qui reste dans une feuille de route. Choisissez l&rsquo;outil qui correspond aux capacit\u00e9s de votre \u00e9quipe, impl\u00e9mentez-le dans votre pipeline et ajoutez des portes de v\u00e9rification dans Kubernetes. Vous pourrez toujours faire \u00e9voluer votre outillage par la suite \u2014 l&rsquo;\u00e9tape critique est d&rsquo;\u00e9tablir la pratique.<\/p>\n<p>Pr\u00eat \u00e0 passer \u00e0 la pratique ? Commencez par notre <a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/signing-verifying-container-images-sigstore-cosign\/\">Guide de signature keyless Sigstore<\/a> pour les fondements conceptuels, puis travaillez sur le <a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-signing-verifying-container-images-cosign-github-actions\/\">Lab de signature keyless Cosign<\/a> pour l&rsquo;impl\u00e9menter dans un vrai pipeline GitHub Actions.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pourquoi la signature d&rsquo;images container est essentielle Chaque fois que vous r\u00e9cup\u00e9rez une image container et la d\u00e9ployez en production, vous accordez une confiance implicite \u00e0 cet artefact. Mais comment v\u00e9rifiez-vous que l&rsquo;image n&rsquo;a pas \u00e9t\u00e9 alt\u00e9r\u00e9e ? Comment confirmez-vous qu&rsquo;elle a r\u00e9ellement \u00e9t\u00e9 construite par votre pipeline CI\/CD et non inject\u00e9e par un attaquant &#8230; <a title=\"Outils de Signature d&rsquo;Images Container Compar\u00e9s : Cosign vs Notation vs GPG\" class=\"read-more\" href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/container-image-signing-tools-compared-cosign-notation-gpg\/\" aria-label=\"En savoir plus sur Outils de Signature d&rsquo;Images Container Compar\u00e9s : Cosign vs Notation vs GPG\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[49,50],"tags":[],"post_folder":[],"class_list":["post-457","post","type-post","status-publish","format-standard","hentry","category-ci-cd-security","category-software-supply-chain"],"_links":{"self":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts\/457","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/comments?post=457"}],"version-history":[{"count":2,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts\/457\/revisions"}],"predecessor-version":[{"id":740,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts\/457\/revisions\/740"}],"wp:attachment":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/media?parent=457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/categories?post=457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/tags?post=457"},{"taxonomy":"post_folder","embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/post_folder?post=457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}