Vous buildez des images, mais savez-vous vraiment ce qu’elles contiennent ? Une image peut embarquer des centaines de dépendances, dont certaines avec des vulnérabilités connues. Ce guide vous donne les bases DevSecOps pour sécuriser votre supply chain d’images : SBOM, scan de vulnérabilités, signatures et politiques. Une introduction pragmatique pour savoir par où commencer.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- SBOM : la liste d’ingrédients de votre image (et pourquoi c’est obligatoire dans certains contextes)
- Scan de vulnérabilités : détecter les CVE dans vos images
- Signature d’images : prouver l’origine et l’intégrité
- Policies : appliquer des règles automatiques (pas d’image root, pas de CVE critique)
- Où placer ces contrôles dans la CI/CD
Carte mentale : qui fait quoi ?
Section intitulée « Carte mentale : qui fait quoi ? »Avant de plonger dans les détails, voici ce que chaque contrôle apporte :
| Contrôle | Question à laquelle il répond | Exemple |
|---|---|---|
| SBOM | ”Qu’y a-t-il dans mon image ?” | Liste des 234 packages avec versions |
| Scan | ”Y a-t-il des vulnérabilités connues ?” | CVE critique dans OpenSSL |
| Signature | ”Qui a produit cette image ? A-t-elle été modifiée ?” | Certificat lié à ci@monorg.com |
| Policy | ”Cette image respecte-t-elle nos règles ?” | Bloque si non signé ou CVE critique |
Vocabulaire minimal
Section intitulée « Vocabulaire minimal »Ces termes reviennent dans tout le guide :
| Terme | Définition simple |
|---|---|
| Tag | Alias mutable (nginx:1.25). Peut pointer vers une image différente demain. |
| Digest | Hash immuable (sha256:abc123...). Garantit exactement la même image. |
| Attestation | Artefact OCI attaché à l’image (signature, SBOM, provenance). |
| Keyless | Signature sans clé privée à gérer : votre identité OIDC (GitHub, Google) + certificat éphémère. |
| VEX | Document indiquant si une CVE est réellement exploitable dans votre contexte. |
Le problème : la supply chain logicielle
Section intitulée « Le problème : la supply chain logicielle »Quand vous faites FROM python:3.11, vous héritez de :
- L’image de base Debian (ou Alpine)
- Des centaines de packages système
- Python et ses dépendances C
- Tout ce que les mainteneurs ont mis dedans
Puis votre pip install ajoute :
- Vos dépendances Python
- Les dépendances de vos dépendances (dépendances transitives)
- Potentiellement des packages compromis (typosquatting, mainteneur malveillant)
Résultat : votre image de 200 Mo contient peut-être des milliers de composants dont vous ignorez l’existence — et certains peuvent avoir des vulnérabilités connues (CVE).
SBOM : la liste d’ingrédients
Section intitulée « SBOM : la liste d’ingrédients »Un SBOM (Software Bill of Materials) est un inventaire exhaustif de tous les composants d’un logiciel : packages système, bibliothèques, versions, licences.
L’analogie de l’étiquette alimentaire
Section intitulée « L’analogie de l’étiquette alimentaire »C’est comme la liste d’ingrédients sur un emballage alimentaire. Si vous êtes allergique aux arachides, vous vérifiez l’étiquette. Si une CVE touche log4j, vous vérifiez le SBOM.
Formats de SBOM
Section intitulée « Formats de SBOM »| Format | Standard | Utilisateurs typiques |
|---|---|---|
| SPDX | Linux Foundation | Compliance, licences |
| CycloneDX | OWASP | Sécurité, vulnérabilités |
| Syft JSON | Anchore | Usage interne |
Générer un SBOM avec Syft
Section intitulée « Générer un SBOM avec Syft »# SBOM au format SPDX (ISO standard)syft nginx:1.25 -o spdx-json > sbom.json
# SBOM au format CycloneDX (orienté sécurité)syft nginx:1.25 -o cyclonedx-json > sbom.json
# Voir le contenucat sbom.json | jq '.packages | length'# 234 packages trouvésScan de vulnérabilités : détecter les CVE
Section intitulée « Scan de vulnérabilités : détecter les CVE »Un scanner de vulnérabilités compare les composants de votre image à des bases de données de CVE (Common Vulnerabilities and Exposures).
Les outils principaux
Section intitulée « Les outils principaux »| Outil | Type | Quand l’utiliser |
|---|---|---|
| Trivy | CLI open source | Choix par défaut : rapide, gratuit, SBOM + VEX + IaC |
| Grype | CLI open source | Alternative légère, intégration native avec Syft |
| Docker Scout | Docker | Si vous utilisez Docker Desktop (intégré) |
Scanner avec Trivy
Section intitulée « Scanner avec Trivy »# Scan basiquetrivy image nginx:1.25
# Seulement les CVE critiques et hautestrivy image --severity CRITICAL,HIGH nginx:1.25
# Échouer si CVE critique (utile en CI)trivy image --exit-code 1 --severity CRITICAL nginx:1.25
# Ignorer certaines CVE (avec fichier .trivyignore)echo "CVE-2023-12345" > .trivyignoretrivy image --ignorefile .trivyignore nginx:1.25Exemple de sortie
Section intitulée « Exemple de sortie »nginx:1.25 (debian 12.1)=========================Total: 42 (UNKNOWN: 0, LOW: 20, MEDIUM: 18, HIGH: 3, CRITICAL: 1)
┌──────────────────┬────────────────┬──────────┬─────────────────────┐│ Library │ Vulnerability │ Severity │ Fixed Version │├──────────────────┼────────────────┼──────────┼─────────────────────┤│ openssl │ CVE-XXXX-YYYY │ CRITICAL │ 3.0.12-1 ││ curl │ CVE-XXXX-ZZZZ │ HIGH │ 7.88.1-10+deb12u1 │└──────────────────┴────────────────┴──────────┴─────────────────────┘VEX : réduire le bruit des faux positifs
Section intitulée « VEX : réduire le bruit des faux positifs »VEX (Vulnerability Exploitability eXchange) indique si une CVE est réellement exploitable dans votre contexte. Exemple : une CVE dans OpenSSL peut ne pas vous concerner si vous n’utilisez pas la fonction vulnérable.
# Trivy supporte OpenVEX pour filtrer les faux positifstrivy image --vex ./vex.json myimage:latestLe format OpenVEX (OpenSSF) est le standard recommandé. Il peut être attaché comme attestation OCI à côté du SBOM. Pour la génération de fichiers VEX, consultez la documentation Trivy sur VEX.
Signature d’images : prouver l’origine
Section intitulée « Signature d’images : prouver l’origine »Scanner détecte les vulnérabilités connues, mais pas les images compromises (backdoor, modification malveillante). La signature résout ce problème.
Ce que la signature garantit
Section intitulée « Ce que la signature garantit »| Sans signature | Avec signature |
|---|---|
N’importe qui peut push myapp:1.0 | Seul le détenteur de la clé peut signer |
| Pas de preuve d’origine | Vérification cryptographique de l’éditeur |
| Modification silencieuse possible | Toute modification invalide la signature |
Signer avec Cosign
Section intitulée « Signer avec Cosign »Cosign (projet Sigstore) est l’outil standard pour signer des images OCI.
# Mode clé : générer une paire de cléscosign generate-key-paircosign sign --key cosign.key ghcr.io/mon-org/mon-app:1.0.0cosign verify --key cosign.pub ghcr.io/mon-org/mon-app:1.0.0
# Mode keyless (recommandé en CI/CD) : identité OIDC + certificat éphémèrecosign sign ghcr.io/mon-org/mon-app:1.0.0cosign verify \ --certificate-identity=ci@monorg.com \ --certificate-oidc-issuer=https://token.actions.githubusercontent.com \ ghcr.io/mon-org/mon-app:1.0.0Policies : appliquer des règles automatiques
Section intitulée « Policies : appliquer des règles automatiques »Les policies (ou admission policies) bloquent le déploiement d’images non conformes. Elles peuvent vérifier :
- L’image est signée
- Aucune CVE critique
- L’image vient d’un registry autorisé
- L’image n’utilise pas root
- Un SBOM est attaché
Outils de policy
Section intitulée « Outils de policy »| Outil | Niveau | Cas d’usage |
|---|---|---|
| OPA/Gatekeeper | Kubernetes | Admission controller |
| Kyverno | Kubernetes | Policies déclaratives |
| Connaisseur | Registry/K8s | Vérification signatures |
| Conftest | CI | Validation locale |
Exemple : bloquer les images non signées
Section intitulée « Exemple : bloquer les images non signées »# Kyverno policyapiVersion: kyverno.io/v1kind: ClusterPolicymetadata: name: verify-image-signaturespec: validationFailureAction: Enforce rules: - name: check-signature match: resources: kinds: - Pod verifyImages: - imageReferences: - "ghcr.io/mon-org/*" attestors: - entries: - keys: publicKeys: |- -----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----Bonnes pratiques supply chain
Section intitulée « Bonnes pratiques supply chain »Déployer par digest, pas par tag
Section intitulée « Déployer par digest, pas par tag »Les tags sont mutables : nginx:1.25 peut pointer vers une image différente demain (mise à jour du mainteneur, compromission). Le digest est immuable : sha256:abc123... garantit exactement la même image.
# ❓ Risqué : le tag peut changerimage: nginx:1.25
# ✅ Sûr : le digest est immuableimage: nginx@sha256:6af79ae5de407283dcea8b00d5c37ace95441fd58a8b1d2aa1ed93f5511bb18cUtiliser des images de base approuvées
Section intitulée « Utiliser des images de base approuvées »- Docker Official Images : images maintenues par Docker, auditées régulièrement.
- Images durcies : Chainguard, Wolfi, distroless (moins de packages = moins de surface d’attaque).
- Registry interne : miroir des images approuvées, avec scan automatique.
Provenance et attestations (SLSA)
Section intitulée « Provenance et attestations (SLSA) »La signature prouve l’origine, mais pas comment l’image a été construite. Les attestations de provenance (SLSA) décrivent le pipeline de build : quel code source, quel Dockerfile, quel runner CI.
# Générer une attestation de provenance (build GitHub Actions)cosign attest --predicate provenance.json ghcr.io/mon-org/mon-app:1.0.0
# Vérifier l'attestationcosign verify-attestation --type slsaprovenance ghcr.io/mon-org/mon-app:1.0.0Où placer ces contrôles dans la CI/CD
Section intitulée « Où placer ces contrôles dans la CI/CD »| Étape | Outil | Action si échec |
|---|---|---|
| Build | Syft | Générer SBOM (jamais d’échec) |
| Scan | Trivy | Bloquer si CVE CRITICAL |
| Sign | Cosign | Signer l’image validée |
| Deploy | Kyverno | Bloquer si non signé |
Testez vos connaissances
Section intitulée « Testez vos connaissances »Vérifions que vous avez compris les bases de la sécurisation supply chain : SBOM, scan, signature et policies.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
📋 Récapitulatif de vos réponses
Vérifiez vos réponses avant de soumettre. Cliquez sur une question pour la modifier.
Détail des réponses
À retenir
Section intitulée « À retenir »- Générer un SBOM à chaque build — inventaire exhaustif, exigé par certaines réglementations.
- Scanner avant de push — détecte les CVE connues (Trivy recommandé).
- Filtrer avec VEX — réduit le bruit en indiquant l’exploitabilité réelle.
- Signer l’image validée — prouve l’origine et l’intégrité (Cosign/Sigstore).
- Vérifier au déploiement — policy Kyverno/OPA bloque les images non conformes.
- Déployer par digest — le tag est mutable, le digest est immuable.
- Utiliser des base images approuvées — Official Images ou images durcies.
- Pipeline : Build → SBOM → Scan → Sign → Policy → Deploy.
- Progressivité : alerter d’abord, bloquer ensuite.
Pour aller plus loin
Section intitulée « Pour aller plus loin »Prochaine étape
Section intitulée « Prochaine étape »Vous avez maintenant une vue d’ensemble de la supply chain des images. Pour approfondir, explorez les outils individuels ou passez à l’orchestration avec Docker Compose ou Kubernetes.