Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Scanner les images Kubernetes - Grype, Trivy et CVE

14 min de lecture

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.

  • Docker ou containerd installé
  • Accès à des images à scanner
  • Bases en sécurité : notions de CVE, CVSS, EPSS (→ guide 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 :

ScoreSévéritéAction recommandée
9.0 – 10.0CRITICALCorriger immédiatement, bloquer le déploiement
7.0 – 8.9HIGHTraiter en priorité, dans les 48h
4.0 – 6.9MEDIUMPlanifier dans le sprint suivant
0.1 – 3.9LOWBacklog, 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.

Fenêtre de terminal
# Linux (lab / poste de test)
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
grype version
Fenêtre de terminal
# Scanner une image depuis une registry
grype nginx:1.25.3
# Ne montrer que les CVE ayant un fix disponible
grype 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 parsing
grype nginx:1.25.3 -o json > report.json
# Depuis un SBOM Syft
grype sbom:/path/to/sbom.json
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY
libssl3 3.0.11 3.0.13 deb CVE-2024-0727 MEDIUM
openssl 3.0.11 3.0.13 deb CVE-2024-0727 MEDIUM
expat 2.5.0 (none) deb CVE-2023-52425 MEDIUM
zlib1g 1:1.2.13 (none) deb CVE-2023-45853 MEDIUM

La 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.

Fenêtre de terminal
# 1. Générer l'inventaire (SBOM)
syft nginx:1.25.3 -o cyclonedx-json > sbom.json
# 2. Scanner le SBOM pour les CVE
grype 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.

Fenêtre de terminal
# Debian/Ubuntu
sudo apt-get install wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null
echo "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.list
sudo apt-get update && sudo apt-get install trivy
Fenêtre de terminal
# Scanner une image
trivy image nginx:1.25.3
# Ignorer les CVE sans fix disponible
trivy 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 CycloneDX
trivy image --format cyclonedx nginx:1.25.3 > sbom.json
# Scanner le filesystem local (dépendances applicatives)
trivy fs --scanners vuln .
# Scanner un manifest Kubernetes
trivy config deployment.yaml
CritèreGrypeTrivy
Cible principaleImages, file systems, SBOMImages + config/IaC + Kubernetes + SBOM
EPSS / priorisationFort accent : EPSS, KEV, risk score, OpenVEXCouverture plus large, priorisation moins mise en avant
SBOMScan de SBOM existantsGénération et exploitation natifs
Kubernetes natifPas d’operator officiel équivalentTrivy Operator
Position dans ce guideMon choix principal pour la prodConservé pour culture écosystème / préparation

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.

Fenêtre de terminal
# Installation via Helm
helm install trivy-operator aquasecurity/trivy-operator \
--namespace trivy-system \
--create-namespace \
--set trivy.ignoreUnfixed=true
# Voir les rapports de vulnérabilités
kubectl get vulnerabilityreports -A
# Détail d'un rapport
kubectl describe vulnerabilityreport <name> -n <namespace>
.github/workflows/scan.yml
name: scan-image
on: [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 critical
.gitlab-ci.yml
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 critical
SymptômeCause probableSolution
Trop de CVE MEDIUM/LOWPas de filtrageUtiliser --severity HIGH,CRITICAL ou --fail-on high
CVE sans FIXED-INPas de correctif référencéÉvaluer alternatives : MAJ applicative, changement de base, suppression du composant
Faux positifs répétésCVE non applicable à votre contexteCréer .grype.yaml avec ignore: ou formaliser avec OpenVEX
Trivy DB outdatedBase locale expiréetrivy image --download-db-only
Scan lent en CI/CDTéléchargement de la DB à chaque runMettre la DB en cache dans le pipeline
Image distroless / WolfiMoins de paquets OSScanner quand même — bibliothèques applicatives restent visibles
Résultats différents entre deux scannersSources et règles de matching différentesNormal — définissez un scanner de référence et documentez les écarts
CVE non exploitable dans votre contexteFaux positif contextuelFormaliser l’acceptation de risque avec OpenVEX ou .grype.yaml
.grype.yaml
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: low

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
8 min.
70% requis

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

  • 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-IN vide : 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

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.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn