Aller au contenu
Conteneurs & Orchestration medium

Confiance et provenance Helm : signer vos charts pour sécuriser la supply chain

11 min de lecture

logo helm

La provenance Helm garantit que le chart que vous installez provient bien de l’auteur attendu et n’a pas été modifié. Un fichier .prov contient une signature cryptographique du chart — si le chart est altéré, la vérification échoue. En production, c’est une couche de sécurité essentielle contre les attaques de type supply chain.


Imaginez ce scénario :

  1. Vous utilisez un chart public bitnami/postgresql
  2. Un attaquant compromet le repository ou fait du man-in-the-middle
  3. Vous téléchargez un chart modifié avec un backdoor
  4. Le backdoor s’exécute dans votre cluster → compromission
AspectGarantie
IntégritéLe chart n’a pas été modifié depuis la signature
AuthenticitéLe chart a été signé par le détenteur de la clé privée
Non-répudiationL’auteur ne peut pas nier avoir signé
AspectLimitation
Qualité du codeUn chart signé peut contenir des bugs ou vulnérabilités
Intention malveillanteL’auteur légitime peut publier un chart malveillant
Sécurité de la cléSi la clé privée est compromise, les signatures sont inutiles

  1. Générer une paire de clés

    Fenêtre de terminal
    gpg --full-generate-key

    Choisissez :

    • Type : RSA and RSA (option 1)
    • Taille : 4096 bits
    • Expiration : 2 ans (recommandé)
    • Identité : Helm Charts <helm@example.com>
  2. Lister les clés disponibles

    Fenêtre de terminal
    gpg --list-secret-keys --keyid-format LONG

    Résultat :

    sec rsa4096/ABCD1234EFGH5678 2026-02-01 [SC] [expires: 2028-02-01]
    Key fingerprint = 1234 5678 ABCD EFGH ...
    uid [ultimate] Helm Charts <helm@example.com>

    Notez l’ID de la clé : ABCD1234EFGH5678

  3. Exporter la clé publique

    Fenêtre de terminal
    gpg --armor --export ABCD1234EFGH5678 > helm-charts.pub.asc

    Ce fichier sera distribué aux utilisateurs pour vérifier vos charts.


Fenêtre de terminal
# Packager ET signer en une commande
helm package ./my-chart --sign --key "Helm Charts" --keyring ~/.gnupg/secring.gpg

Deux fichiers sont créés :

my-chart-1.2.3.tgz # Le chart packagé
my-chart-1.2.3.tgz.prov # Le fichier de provenance (signature)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
apiVersion: v2
appVersion: "2.0.0"
description: My awesome chart
name: my-chart
version: 1.2.3
...
files:
my-chart-1.2.3.tgz: sha256:abc123def456...
-----BEGIN PGP SIGNATURE-----
...
-----END PGP SIGNATURE-----

Le .prov contient :

  • Les métadonnées du chart
  • Le hash SHA256 du tarball
  • La signature GPG de l’ensemble

  1. Importer la clé publique de l’auteur

    Fenêtre de terminal
    gpg --import helm-charts.pub.asc
  2. Vérifier le chart

    Fenêtre de terminal
    helm verify my-chart-1.2.3.tgz

    Succès :

    Signed by: Helm Charts <helm@example.com>
    Using Key With Fingerprint: 1234 5678 ABCD EFGH ...
    Chart Hash Verified: sha256:abc123def456...
  3. Installer si vérifié

    Fenêtre de terminal
    helm install my-release my-chart-1.2.3.tgz -n prod
ErreurCause probableAction
Error: could not find a valid signatureFichier .prov manquantContacter l’auteur, télécharger le .prov
Error: signature verification failedChart modifié ou mauvaise cléNe pas installer — télécharger depuis source officielle
Error: key not foundClé publique non importéeImporter la clé de l’auteur

MéthodeAvantagesInconvénients
README du repoSimple, visiblePeut être modifié par un attaquant
Keyserver publicStandard GPG, décentraliséPeut contenir des clés abandonnées
Site web HTTPSContrôle total, HTTPS = TLSNécessite infra web
DNS (DANE)Très sécuriséComplexe à configurer
Fenêtre de terminal
# Envoyer la clé sur un keyserver public
gpg --keyserver keyserver.ubuntu.com --send-keys ABCD1234EFGH5678
Fenêtre de terminal
# Télécharger la clé depuis un keyserver
gpg --keyserver keyserver.ubuntu.com --recv-keys ABCD1234EFGH5678

.gitlab-ci.yml
variables:
GPG_KEY_ID: "ABCD1234EFGH5678"
package-and-sign:
stage: build
script:
# Importer la clé privée depuis les secrets
- echo "$GPG_PRIVATE_KEY" | gpg --import
- gpg --export-secret-keys > ~/.gnupg/secring.gpg
# Packager et signer
- helm package ./charts/my-chart --sign --key "$GPG_KEY_ID" --keyring ~/.gnupg/secring.gpg
# Publier chart + provenance
- helm push my-chart-*.tgz oci://registry.example.com/charts
# Note: le .prov doit être publié séparément ou avec le chart
artifacts:
paths:
- "*.tgz"
- "*.tgz.prov"

LimitationImpact
GPG uniquementPas de support natif pour d’autres systèmes (Cosign, Notation)
.prov séparéDoit être distribué en plus du chart
Pas d’intégration OCI nativeLe .prov ne fait pas partie de l’artefact OCI
Gestion des clés manuelleRotation, révocation à gérer vous-même

Cosign (projet Sigstore) permet de signer des artefacts OCI (y compris des charts Helm) :

Fenêtre de terminal
# Signer un chart OCI avec Cosign
cosign sign oci://registry.example.com/charts/my-chart:1.2.3
# Vérifier
cosign verify oci://registry.example.com/charts/my-chart:1.2.3

Avantages de Cosign :

  • Signature intégrée à l’artefact OCI (pas de fichier séparé)
  • Support des clés éphémères (keyless signing via OIDC)
  • Intégration native avec les registries OCI

Objectif : Créer une clé GPG, signer un chart, publier chart + provenance, vérifier l’intégrité avant installation.

  1. Créer une clé de test

    Fenêtre de terminal
    # Clé rapide pour le lab (pas pour production)
    gpg --batch --gen-key <<EOF
    Key-Type: RSA
    Key-Length: 2048
    Name-Real: Helm Lab
    Name-Email: helm-lab@local
    Expire-Date: 1d
    %no-protection
    %commit
    EOF
    # Récupérer l'ID
    GPG_KEY=$(gpg --list-secret-keys --keyid-format LONG | grep sec | awk '{print $2}' | cut -d'/' -f2 | head -1)
    echo "Key ID: $GPG_KEY"
  2. Exporter le keyring

    Fenêtre de terminal
    gpg --export-secret-keys > ~/.gnupg/secring.gpg
  3. Créer et signer un chart

    Fenêtre de terminal
    helm create lab-signed-chart
    helm package lab-signed-chart --sign --key "Helm Lab" --keyring ~/.gnupg/secring.gpg
  4. Vérifier la signature

    Fenêtre de terminal
    # La clé publique est déjà importée (on l'a créée localement)
    helm verify lab-signed-chart-0.1.0.tgz
  5. Simuler une altération

    Fenêtre de terminal
    # Décompresser le chart
    tar -xzf lab-signed-chart-0.1.0.tgz
    # Modifier un fichier
    echo "# Malicious change" >> lab-signed-chart/values.yaml
    # Recompresser
    tar -czf lab-signed-chart-0.1.0.tgz lab-signed-chart
    # Tenter de vérifier → doit échouer
    helm verify lab-signed-chart-0.1.0.tgz
  6. Nettoyer

    Fenêtre de terminal
    rm -rf lab-signed-chart lab-signed-chart-*.tgz*
    gpg --delete-secret-and-public-key "Helm Lab"

Critères de réussite :

  • Clé GPG créée
  • Chart signé avec .prov généré
  • helm verify réussit sur le chart original
  • helm verify échoue sur le chart altéré

  • Provenance = garantie d’intégrité et d’authenticité via signature cryptographique
  • helm package --sign = créer le chart + fichier .prov
  • helm verify = vérifier la signature avant installation
  • Clé privée = secrète, protégée, jamais partagée
  • Clé publique = distribuée aux utilisateurs pour vérification
  • Alternative moderne : Cosign pour les artefacts OCI

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.