TP : Scanner une image vulnérable
Prérequis
Environnement technique
- Docker installé et fonctionnel.
- Accès à un terminal.
- Accès au registre Docker Hub.
- jq installé pour lire et filtrer les rapports JSON.
- Optionnel : Trivy installé localement pour les environnements où le montage du socket Docker n’est pas disponible.
Installer jq
Sur Debian / Ubuntu :
sudo apt updatesudo apt install -y jqSur macOS avec Homebrew :
brew install jqImage utilisée
python:3.4-alpineCette image est volontairement obsolète. Python 3.4 est en fin de vie et ne doit pas être utilisé en production.
Objectifs
À la fin de ce TP, l’apprenant doit être capable de :
- Scanner une image de conteneur avec Trivy.
- Identifier les vulnérabilités détectées dans une image.
- Filtrer les vulnérabilités selon leur criticité.
- Générer un rapport de scan au format JSON.
- Lire les informations essentielles d’un rapport JSON.
- Comprendre l’intérêt d’un scan d’image dans une démarche DevSecOps.
- Rendre un scan bloquant en cas de vulnérabilités critiques.
- Interpréter le code de retour d’une commande dans un contexte CI/CD.
Commandes
1. Vérifier que Docker est disponible
docker --version2. Télécharger l’image vulnérable
docker pull python:3.4-alpine3. Créer un répertoire de cache local pour Trivy
mkdir -p .trivy-cache4. Scanner l’image avec Trivy via Docker
docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "$PWD/.trivy-cache:/root/.cache/" \ aquasec/trivy:0.71.0 \ image python:3.4-alpine5. Scanner uniquement les vulnérabilités HIGH et CRITICAL
docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "$PWD/.trivy-cache:/root/.cache/" \ aquasec/trivy:0.71.0 \ image --severity HIGH,CRITICAL python:3.4-alpine6. Générer un rapport JSON
docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "$PWD/.trivy-cache:/root/.cache/" \ -v "$PWD:/workdir" \ aquasec/trivy:0.71.0 \ image --format json --output /workdir/trivy-report.json python:3.4-alpine7. Vérifier que le rapport JSON a bien été généré
ls -lh trivy-report.json8. Lire le début du rapport JSON de manière lisible
jq . trivy-report.json | head -1009. Extraire les vulnérabilités principales avec jq
jq '.Results[]?.Vulnerabilities[]? | {VulnerabilityID, Severity, PkgName, InstalledVersion, FixedVersion, Title}' trivy-report.json | head -4010. Rendre le scan bloquant en cas de vulnérabilité HIGH ou CRITICAL
docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "$PWD/.trivy-cache:/root/.cache/" \ aquasec/trivy:0.71.0 \ image --severity HIGH,CRITICAL --exit-code 1 python:3.4-alpineecho "Code de retour : $?"Variante avec Trivy installé localement
La version installée localement peut différer de 0.71.0 selon le gestionnaire de paquets utilisé. Le comportement des commandes ci-dessous reste identique pour les usages du TP.
1. Installer Trivy sur macOS ou Linux avec Homebrew
brew install trivy2. Vérifier la version de Trivy
trivy --version3. Scanner l’image localement
trivy image python:3.4-alpine4. Scanner uniquement les vulnérabilités HIGH et CRITICAL
trivy image --severity HIGH,CRITICAL python:3.4-alpine5. Générer un rapport JSON
trivy image --format json --output trivy-report.json python:3.4-alpine6. Lire le début du rapport JSON de manière lisible
jq . trivy-report.json | head -1007. Extraire les vulnérabilités principales avec jq
jq '.Results[]?.Vulnerabilities[]? | {VulnerabilityID, Severity, PkgName, InstalledVersion, FixedVersion, Title}' trivy-report.json | head -408. Rendre le scan bloquant en cas de vulnérabilité HIGH ou CRITICAL
trivy image --severity HIGH,CRITICAL --exit-code 1 python:3.4-alpineecho "Code de retour : $?"Résultat attendu
| Contrôle | Résultat attendu |
|---|---|
| Scan de vulnérabilités | Les vulnérabilités de l’image python:3.4-alpine sont affichées dans le terminal |
| Rapport JSON | trivy-report.json est généré dans le répertoire courant |
Gate --exit-code 1 | Code de retour différent de 0 si au moins une vulnérabilité de la sévérité demandée est détectée |