Scanner les images conteneurs avant de les déployer est un contrôle indispensable, mais ce n’est qu’un maillon de la supply chain security. Un scanner compare les composants d’une image avec des bases de données de CVE pour identifier les failles connues — mais il ne prouve pas l’intégrité, la provenance ou la conformité de l’image.
Ce guide poursuit deux objectifs : montrer les commandes et concepts autour du scan de vulnérabilités dans l’écosystème Kubernetes, et expliquer pourquoi je privilégie Grype comme scanner principal en production depuis l’incident majeur ayant touché l’écosystème Trivy en mars 2026. Trivy reste néanmoins très présent dans l’écosystème et dans les préparations à l’examen CKS.
Prérequis
Section intitulée « Prérequis »- Docker ou containerd installé
- Accès à des images à scanner
- Bases en sécurité : notions de CVE, CVSS, EPSS (→ guide CVE)
Comprendre une CVE
Section intitulée « Comprendre une CVE »Avant de scanner, il faut savoir lire les résultats. Une CVE (Common Vulnerability and Exposure) est un identifiant unique pour une faille de sécurité connue. Format : CVE-ANNÉE-NUMÉRO.
Les scores de sévérité CVSS v3 :
| Score | Sévérité | Action recommandée |
|---|---|---|
| 9.0 – 10.0 | CRITICAL | Corriger immédiatement, bloquer le déploiement |
| 7.0 – 8.9 | HIGH | Traiter en priorité, dans les 48h |
| 4.0 – 6.9 | MEDIUM | Planifier dans le sprint suivant |
| 0.1 – 3.9 | LOW | Backlog, corriger lors des mises à jour régulières |
Grype — mon choix principal pour le scan de vulnérabilités d’images
Section intitulée « Grype — mon choix principal pour le scan de vulnérabilités d’images »Grype est développé par Anchore. Je le privilégie pour le scan d’images et de SBOM, notamment pour son intégration avec Syft et sa prise en compte d’EPSS, de KEV et d’OpenVEX.
Installation
Section intitulée « Installation »# Linux (lab / poste de test)curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bingrype versionCommandes essentielles
Section intitulée « Commandes essentielles »# Scanner une image depuis une registrygrype nginx:1.25.3
# Ne montrer que les CVE ayant un fix disponiblegrype nginx:1.25.3 --only-fixed
# Faire échouer si CVE CRITICAL détectée (CI/CD)grype nginx:1.25.3 --fail-on critical
# Sortie JSON pour parsinggrype nginx:1.25.3 -o json > report.json
# Depuis un SBOM Syftgrype sbom:/path/to/sbom.jsonExemple de sortie
Section intitulée « Exemple de sortie »NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITYlibssl3 3.0.11 3.0.13 deb CVE-2024-0727 MEDIUMopenssl 3.0.11 3.0.13 deb CVE-2024-0727 MEDIUMexpat 2.5.0 (none) deb CVE-2023-52425 MEDIUMzlib1g 1:1.2.13 (none) deb CVE-2023-45853 MEDIUMLa colonne FIXED-IN est clé : si elle est vide, aucun correctif n’est actuellement référencé pour ce package dans les sources du scanner. Il faut alors évaluer les alternatives : mise à jour applicative, changement d’image de base, suppression du composant, ou acceptation temporaire du risque documentée.
Workflow SBOM + Grype
Section intitulée « Workflow SBOM + Grype »# 1. Générer l'inventaire (SBOM)syft nginx:1.25.3 -o cyclonedx-json > sbom.json
# 2. Scanner le SBOM pour les CVEgrype sbom:sbom.json --fail-on high
# Avantage : le SBOM peut être archivé et re-scanné plus tard# quand de nouvelles CVE sont publiées sans rebuilder l'image→ Voir le guide SBOM complet et le guide Syft.
Trivy — outil très présent dans l’écosystème, que je n’intègre plus comme scanner principal
Section intitulée « Trivy — outil très présent dans l’écosystème, que je n’intègre plus comme scanner principal »Trivy d’Aqua Security est un outil très fréquent dans les préparations CKS et dans la littérature autour de l’examen. Je conserve ses commandes pour la culture générale et pour lire des pipelines existants. En revanche, pour un nouveau pipeline de production, je préfère désormais Grype pour le scan de vulnérabilités d’images.
Installation
Section intitulée « Installation »# Debian/Ubuntusudo apt-get install wget apt-transport-https gnupg lsb-releasewget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/nullecho "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/trivy.listsudo apt-get update && sudo apt-get install trivyCommandes essentielles CKS
Section intitulée « Commandes essentielles CKS »# Scanner une imagetrivy image nginx:1.25.3
# Ignorer les CVE sans fix disponibletrivy image --ignore-unfixed nginx:1.25.3
# Filtrer par sévéritétrivy image --severity CRITICAL,HIGH nginx:1.25.3
# Code de sortie 1 si CVE critique (CI/CD)trivy image --exit-code 1 --severity CRITICAL nginx:1.25.3
# Générer un SBOM CycloneDXtrivy image --format cyclonedx nginx:1.25.3 > sbom.json
# Scanner le filesystem local (dépendances applicatives)trivy fs --scanners vuln .
# Scanner un manifest Kubernetestrivy config deployment.yamlComparer Grype vs Trivy
Section intitulée « Comparer Grype vs Trivy »| Critère | Grype | Trivy |
|---|---|---|
| Cible principale | Images, file systems, SBOM | Images + config/IaC + Kubernetes + SBOM |
| EPSS / priorisation | Fort accent : EPSS, KEV, risk score, OpenVEX | Couverture plus large, priorisation moins mise en avant |
| SBOM | Scan de SBOM existants | Génération et exploitation natifs |
| Kubernetes natif | Pas d’operator officiel équivalent | Trivy Operator |
| Position dans ce guide | Mon choix principal pour la prod | Conservé pour culture écosystème / préparation |
Trivy Operator — Scan continu dans Kubernetes
Section intitulée « Trivy Operator — Scan continu dans Kubernetes »Le Trivy Operator installe un CRD dans le cluster et scanne automatiquement toutes les images à intervalle régulier. Les résultats sont stockés comme ressources Kubernetes.
# Installation via Helmhelm install trivy-operator aquasecurity/trivy-operator \ --namespace trivy-system \ --create-namespace \ --set trivy.ignoreUnfixed=true
# Voir les rapports de vulnérabilitéskubectl get vulnerabilityreports -A
# Détail d'un rapportkubectl describe vulnerabilityreport <name> -n <namespace>Intégration CI/CD
Section intitulée « Intégration CI/CD »GitHub Actions
Section intitulée « GitHub Actions »name: scan-imageon: [push]jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build image run: docker build -t myapp:${{ github.sha }} . - name: Scanner avec Grype run: | curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin grype myapp:${{ github.sha }} --fail-on criticalGitLab CI
Section intitulée « GitLab CI »scan: stage: test image: docker:24 services: - docker:dind script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - | curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin grype $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --fail-on criticalDépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
| Trop de CVE MEDIUM/LOW | Pas de filtrage | Utiliser --severity HIGH,CRITICAL ou --fail-on high |
CVE sans FIXED-IN | Pas de correctif référencé | Évaluer alternatives : MAJ applicative, changement de base, suppression du composant |
| Faux positifs répétés | CVE non applicable à votre contexte | Créer .grype.yaml avec ignore: ou formaliser avec OpenVEX |
| Trivy DB outdated | Base locale expirée | trivy image --download-db-only |
| Scan lent en CI/CD | Téléchargement de la DB à chaque run | Mettre la DB en cache dans le pipeline |
| Image distroless / Wolfi | Moins de paquets OS | Scanner quand même — bibliothèques applicatives restent visibles |
| Résultats différents entre deux scanners | Sources et règles de matching différentes | Normal — définissez un scanner de référence et documentez les écarts |
| CVE non exploitable dans votre contexte | Faux positif contextuel | Formaliser l’acceptation de risque avec OpenVEX ou .grype.yaml |
Ignorer les faux positifs avec Grype
Section intitulée « Ignorer les faux positifs avec Grype »ignore: # CVE ne s'applique pas à notre build (Java non utilisé) - vulnerability: CVE-2023-XXXXX reason: "Not applicable — Java runtime not present" # Toutes les CVE LOW pour ce package - package: name: libcurl fix-state: not-fixed severity: lowLimites du scan de vulnérabilités
Section intitulée « Limites du scan de vulnérabilités »Testez vos Connaissances
Section intitulée « Testez vos Connaissances »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
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »- Grype : mon choix principal pour scanner images et SBOM en production, avec focus sur EPSS, KEV et OpenVEX
- Trivy : outil toujours très connu et fonctionnellement large, que je ne retiens plus comme scanner principal après l’incident de mars 2026
- Un scan d’image ne suffit pas : compléter avec signature, provenance, politiques d’admission et contrôles runtime
- EPSS + CVSS : croiser les deux signaux pour prioriser — l’EPSS seul ne suffit pas
- En CI/CD : évitez de télécharger les scanners à la volée ; préférez des images de job internes et figées
FIXED-INvide : pas de correctif référencé à cet instant — évaluer les alternatives plutôt qu’attendre- SBOM : générer avec Syft, scanner avec Grype = séparation claire des responsabilités