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-1Slug :
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
- Images & registry — Docker images · Docker Registry
- Compte lab (
AWS_PROFILE=lab) — Démarrer avec AWS - Notions CI (GitHub Actions) utiles pour la section policy
- Outils :
cosign,dockeroucrane, AWS CLI v2
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 :
- Cosign — CLI (et libs) pour signer / vérifier images OCI, blobs, attestations.
- Fulcio — CA éphémère : certificat court lié à une identité OIDC (GitHub, Google, etc.).
- Rekor — transparency 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
- Vérifier le tag sans digérer — tags bougent.
- Clé privée Cosign dans le repo Git.
- Identity regexp OIDC trop large (
https://github.com/.*/.*). - Signer sans scanner (Trivy) — signature ≠ absence de CVE.
- Admission seule, CI sans verify.
- Oublier le cleanup ECR lab (coûts + surface).
- 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 verifybloquant 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
- Dockerfile multistage, Buildx, Trivy
- Docker Registry
- GitHub Actions OIDC AWS
- Kubernetes Pod Security Admission
- Platform Engineering 2026
- Démarrer avec AWS
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
Pour aller plus loin — hubs live
Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.