Cosign & Sigstore : signer et vérifier vos images

À la fin de ce tutoriel, vous saurez signer et vérifier des images conteneur avec Cosign et la pile Sigstore (Fulcio, Rekor) : flux keyless OIDC, signatures attachées/détachées, vérification en CI, bases d’admission, et un lab CLI orienté ca-central-1 (ECR). Angle supply chain DevOps Elastic Hayway (DEH) — pas une intro Docker.

Niveau : Intermédiaire · Temps estimé : 50–70 min · Versions cibles : Cosign ≥ 2.x · Sigstore (Fulcio/Rekor publics) · AWS CLI v2 / ECR · Dernière vérification : 2026-09-11 · Region : ca-central-1

Slug : wow-cosign-sigstore · Série : WOW (46/50) · Mot-clé SEO : cosign sigstore · Publish : GO

← Précédent : Dockerfile multistage Buildx Trivy · → Suivant : GitHub Actions OIDC AWS · Aussi : Docker Registry · Kubernetes Pod Security · Platform Engineering 2026

Prérequis

Coût estimé : 0–quelques € (push ECR optionnel, cleanup obligatoire). Cosign keyless via Sigstore public = gratuit. Pas de cluster EKS obligatoire pour le lab de base.

export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
aws sts get-caller-identity
cosign version

Ce que nous allons construire

Cosign & Sigstore (WOW 46/50) — ca-central-1
  ├── Pourquoi signer (supply chain, registries, SLSA)
  ├── Pile Sigstore : Cosign, Fulcio, Rekor, keyless vs clés
  ├── Install Cosign + premier sign / verify
  ├── Lab : image → ECR ca-central-1 → cosign sign → verify
  ├── CI : verify bloquant + idées admission (Kyverno)
  ├── Rekor transparency log (ce qu’on lit vraiment)
  └── Anti-patterns + checklist + quiz + FAQ

(Schéma — alt : « Pipeline DEH : build → scan → cosign sign (Fulcio) → push → verify CI / admission ».)

Étape 1 — Pourquoi signer des images en 2026

Une image dans un registry n’est pas une preuve d’origine. Tag latest, digests volés, registry miroir compromis, pipeline CI injecté : la supply chain conteneur est une cible classique. Signer = attester qui a produit quel digest, de façon vérifiable hors confiance aveugle au registry.

Approche Idée Limite
Tags seuls Humain Spoofable
Digest SHA256 Intégrité contenu Pas d’identité auteur
Signature Cosign Identité + digest Processus à industrialiser
SBOM + attestations Contenu + provenance Complément, pas substitut

DEH : digest + signature + verify en CI avant deploy. Scan Trivy (vulns) ≠ signature (provenance). Les deux.

Étape 2 — Pile Sigstore en clair

Sigstore = écosystème open source pour signatures logicielles. Pièces utiles au quotidien :

  1. Cosign — CLI (et libs) pour signer / vérifier images OCI, blobs, attestations.
  2. Fulcio — CA éphémère : certificat court lié à une identité OIDC (GitHub, Google, etc.).
  3. Rekortransparency log append-only : preuve publique qu’une signature a existé à un instant T.

Keyless vs clés longues

Mode Comment Quand DEH
Keyless (recommandé CI) OIDC → Fulcio → cert court + entrée Rekor Pipelines GitHub/GitLab
Clés asymétriques cosign generate-key-pair Labs, air-gap, contrôle total clés
KMS (AWS KMS, etc.) Clé dans KMS ca-central-1 Prod régulée, rotation centralisée

Keyless = pas de clé privée longue à rotater dans le secret store CI. L’identité = le workflow / le compte OIDC. En local lab, Cosign peut ouvrir un flux OIDC navigateur, ou vous utilisez une paire de clés jetable.

Étape 3 — Installer Cosign

Sur une machine lab Linux (ou CI) :

# Exemple version — pinnez en prod
COSIGN_VERSION=2.4.1
curl -sL "https://github.com/sigstore/cosign/releases/download/v${COSIGN_VERSION}/cosign-linux-amd64" 
  -o /tmp/cosign && chmod +x /tmp/cosign
sudo mv /tmp/cosign /usr/local/bin/cosign
cosign version

Packages distro / Homebrew existent aussi ; en CI, action officielle sigstore/cosign-installer évite le curl manuel.

Étape 4 — Premier cycle sign / verify (clés lab)

Pour un lab sans OIDC navigateur, générez une paire jetable (ne committez jamais la clé) :

cd /tmp && cosign generate-key-pair
# cosign.key + cosign.pub
export COSIGN_PASSWORD=""   # lab only — en prod : secret fort / KMS

Construisez une image locale minimale et taguez-la par digest mentalité (tag + digest) :

docker build -t deh-cosign-lab:demo - <<'DOCKER'
FROM public.ecr.aws/docker/library/alpine:3.20
CMD ["echo","deh-cosign-lab"]
DOCKER
docker images deh-cosign-lab:demo --digests

Signature detachée dans le registry (Cosign stocke un artefact signature à côté de l’image) :

# Remplacez par VOTRE registry une fois push fait (étape 5)
# cosign sign --key cosign.key <image@sha256:...>

Vérification :

# cosign verify --key cosign.pub <image@sha256:...>

Si verify échoue : mauvais digest, mauvaise clé, ou signature absente. Toujours vérifier le digest, pas seulement le tag.

Étape 5 — Lab ECR ca-central-1 (push + sign + verify)

Créez un repo ECR lab et poussez :

ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
REGION=ca-central-1
REPO=deh-cosign-lab
aws ecr describe-repositories --repository-names "$REPO" --region "$REGION" 2>/dev/null 
  || aws ecr create-repository --repository-name "$REPO" --region "$REGION"

aws ecr get-login-password --region "$REGION" 
  | docker login --username AWS --password-stdin "${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com"

IMG="${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:demo"
docker tag deh-cosign-lab:demo "$IMG"
docker push "$IMG"
DIGEST=$(aws ecr describe-images --repository-name "$REPO" --image-ids imageTag=demo 
  --query 'imageDetails[0].imageDigest' --output text --region "$REGION")
REF="${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/${REPO}@${DIGEST}"
echo "$REF"

Signez et vérifiez la référence par digest :

cosign sign --key /tmp/cosign.key "$REF"
cosign verify --key /tmp/cosign.pub "$REF"

Cosign écrira un tag/artefact signature dans ECR. IAM : droits push + lecture manifestes sur le repo. Cleanup lab :

aws ecr batch-delete-image --repository-name "$REPO" --region "$REGION" 
  --image-ids imageTag=demo || true
# optionnel : delete-repository --force

Variante keyless (CI)

En GitHub Actions, après login registry :

- uses: sigstore/cosign-installer@v3
- run: cosign sign --yes ${{ env.REF }}
  # OIDC workload identity → Fulcio ; pas de cosign.key
- run: cosign verify ${{ env.REF }} 
    --certificate-identity-regexp='https://github.com/ORG/REPO/.*' 
    --certificate-oidc-issuer=https://token.actions.githubusercontent.com

Ajustez ORG/REPO et l’issuer. --yes / flags non-interactifs selon version Cosign. Pinnez l’action et documentez les identity regexp — trop larges = signature « de n’importe quel workflow ».

Étape 6 — Où vérifier : CI vs admission cluster

Gate Rôle DEH
CI (obligatoire) cosign verify avant promote / deploy staging-prod
Registry policies Bloquer tags non signés si le produit le permet
Admission (K8s) Kyverno / Gatekeeper / Ratify : refuser Pods dont l’image échoue verify

Ne comptez pas seulement sur l’admission : un cluster mal configuré laisse passer. CI = filet principal ; admission = défense en profondeur.

Exemple d’intention Kyverno (illustratif — adaptez CRD/version) : rule verifyImages avec public key ou identity keyless. Testez en Audit avant Enforce.

Étape 7 — Rekor : ce que le transparency log change

Chaque signature keyless (et souvent keyed avec upload) laisse une entrée Rekor. Avantages :

  • Preuve externe au registry
  • Détection de signatures « fantômes » si quelqu’un signe hors process
  • Audit : qui (identité OIDC) a signé quoi, quand

En local : cosign tree / search Rekor selon version. En incident : digests + identité OIDC + timestamp Rekor = timeline.

Anti-patterns

  1. Vérifier le tag sans digérer — tags bougent.
  2. Clé privée Cosign dans le repo Git.
  3. Identity regexp OIDC trop large (https://github.com/.*/.*).
  4. Signer sans scanner (Trivy) — signature ≠ absence de CVE.
  5. Admission seule, CI sans verify.
  6. Oublier le cleanup ECR lab (coûts + surface).
  7. Mélanger environnements : même clé pour sandbox et prod sans isolation.

Checklist DEH

  • [ ] Cosign installé / pinné en CI
  • [ ] Images référencées par digest en prod
  • [ ] Sign après build + scan
  • [ ] cosign verify bloquant sur pipeline deploy
  • [ ] Keyless OIDC avec identity restreinte, ou KMS ca-central-1
  • [ ] Admission cluster en Audit puis Enforce
  • [ ] Runbook : rotation / revoke (clé ou trust policy)
  • [ ] Cleanup repos lab ECR

Quiz (5 questions)

1. Cosign keyless s’appuie surtout sur :
– A. Un mot de passe registry
– B. OIDC + Fulcio (+ Rekor)
– C. Uniquement un fichier .env

2. En prod DEH, la référence image préférée pour verify est :
– A. Le tag latest
– B. Le digest repo@sha256:…
– C. Le nom du Dockerfile

3. Region lab de ce tuto :
– A. us-east-1
– B. ca-central-1
– C. eu-west-3

4. Rekor sert principalement à :
– A. Scanner les CVE
– B. Enregistrer des preuves de signature dans un log transparent
– C. Remplacer ECR

5. Où placer le premier gate cosign verify ?
– A. Uniquement sur le laptop du lead
– B. Dans la CI avant promote/deploy (puis admission en profondeur)
– C. Jamais — le push suffit

Réponses : 1‑B · 2‑B · 3‑B · 4‑B · 5‑B

FAQ

Cosign remplace-t-il Trivy ?

Non. Trivy = vulnérabilités / misconfig. Cosign = provenance / intégrité signature. DEH : les deux dans le pipeline.

Keyless ou AWS KMS en ca-central-1 ?

CI cloud publique → keyless OIDC. Contraintes compliance / air-gap → KMS ou clés HSM. Les deux sont valides ; documentez le trust root.

Les signatures vivent-elles dans l’image ?

Souvent artefacts séparés dans le registry (tag signature / referrers OCI). D’où l’importance des droits registry et du verify sur le bon digest.

Faut-il un cluster Kubernetes pour ce lab ?

Non pour sign/verify ECR. Le cluster intervient pour l’admission. Commencez CI + ECR.

Que faire si verify échoue en prod ?

Stop deploy. Vérifiez digest, identity/issuer, clé publique, présence artefact signature, horloge/Rekor. Ne « force push » pas un tag non signé.

Cosign et multi-arch (manifest lists) ?

Signez / vérifiez la liste ou chaque digest d’architecture selon votre politique ; soyez cohérents buildx ↔ verify.

Gratuit ?

Sigstore public Fulcio/Rekor : oui pour usage standard. ECR / CI minutes : selon compte. Lab : cleanup.

Pour aller plus loin

Maillage série WOW

← Précédent Dockerfile multistage Buildx Trivy
→ Suivant GitHub Actions OIDC AWS
Aussi Docker Registry · Pod Security · Platform Engineering

Meta publication (SEO)

  • Title SEO : Cosign & Sigstore : signer et vérifier vos images (guide FR)
  • Meta description : Cosign Sigstore : signature keyless Fulcio/Rekor, verify CI, lab ECR ca-central-1, policy admission, FAQ et quiz DEH.
  • Focus keyword : cosign sigstore
  • Secondary : signature images Docker, Fulcio Rekor, supply chain conteneur, cosign verify CI
  • Image : assets/web/devopelastichayway/cover-wow-cosign-sigstore-1200x630.webp (à générer)
  • Catégorie : WOW / Supply chain · Niveau : Intermédiaire
  • URL cible : https://devopelastichayway.com/tutoriels/wow-cosign-sigstore/
  • Post live : N/A (nouveau) · slug wow-cosign-sigstore · Publish : GO

← Catalogue Tutoriels

Pour aller plus loin — hubs live

Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.