Exercice 01 : Scanner des images Docker avec Trivy
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Installer Trivy sur votre machine
- ✅ Scanner une image Docker avec
trivy image - ✅ Interpréter les niveaux CRITICAL, HIGH, MEDIUM, LOW
- ✅ Filtrer les vulnérabilités avec
--severityet--ignore-unfixed - ✅ Comparer deux images et choisir la moins vulnérable
Durée estimée : 20 minutes
Difficulté : ⭐☆☆☆☆ (Débutant)
Prérequis : Docker installé
📖 Contexte
Trivy est un scanner de sécurité open-source développé par Aqua Security. Il détecte les vulnérabilités (CVE) dans les packages OS et les dépendances d'applications à l'intérieur des images Docker. Chaque CVE a un score CVSS qui détermine sa sévérité. Intégrer Trivy dans le pipeline CI bloque le déploiement d'images non conformes.
📋 Énoncé
Installez Trivy, scannez des images avec des niveaux de vulnérabilité différents, et identifiez la stratégie de remédiation.
🧭 Déroulement de l'exercice
Tâche 1 : Installer Trivy
Installez Trivy sur votre système via le gestionnaire de paquets ou Docker.
Indice :
`bash# Via script d'installation (Linux/macOS)
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
>
# Ou via Docker (sans installation)
alias trivy="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy"
>
# Ou via apt (Ubuntu/Debian)
sudo apt-get install trivy
`
Vérification : trivy --version affiche la version installée (ex: Version: 0.50.0).
Tâche 2 : Scanner une image ancienne
Scannez l'image ubuntu:20.04 qui contient des vulnérabilités connues :
trivy image ubuntu:20.04Observez la sortie : table de vulnérabilités avec colonnes Library, Vulnerability ID, Severity, Installed Version, Fixed Version.
Indice : La première ligne du résumé indique le total par sévérité. Ex:
Total: 25 (UNKNOWN: 0, LOW: 10, MEDIUM: 8, HIGH: 5, CRITICAL: 2). Les entrées avec "Fixed Version" vide sont des vulnérabilités sans patch disponible.
Vérification : Le scan se termine et affiche un tableau de vulnérabilités. Notez le nombre de CRITICAL et HIGH.
Tâche 3 : Filtrer par sévérité
Réduisez le bruit en filtrant uniquement les vulnérabilités critiques et hautes :
trivy image --severity CRITICAL,HIGH ubuntu:20.04Puis ignorez les vulnérabilités sans correctif disponible :
trivy image --severity CRITICAL,HIGH --ignore-unfixed ubuntu:20.04Indice :
--ignore-unfixedest très utile dans un pipeline CI : il ne bloque que les vulnérabilités pour lesquelles une mise à jour existe, évitant les faux bloquants.
Vérification : La liste est significativement réduite avec --ignore-unfixed. Ce sont les vulnérabilités actionnables.
Tâche 4 : Comparer deux images Python
Comparez python:3.8 (ancienne) vs python:3.12-slim (récente) :
trivy image --severity CRITICAL,HIGH python:3.8
trivy image --severity CRITICAL,HIGH python:3.12-slimIndice :
python:3.8est une image Debian complète avec beaucoup de packages.python:3.12-slimest une version allégée avec moins de packages installés = surface d'attaque réduite. L'image-slima generalement 10 à 20 fois moins de vulnérabilités.
Vérification : python:3.12-slim affiche significativement moins de vulnérabilités. Notez la différence de taille avec docker images python.
Tâche 5 : Scanner avec sortie JSON
Générez un rapport JSON pour l'intégration CI :
trivy image --format json --output rapport-trivy.json python:3.8Puis comptez les vulnérabilités CRITICAL :
cat rapport-trivy.json | jq '[.Results[].Vulnerabilities[]? | select(.Severity == "CRITICAL")] | length'Indice : Le format
--format jsonest utilisé dans les pipelines GitHub Actions/GitLab CI pour parser les résultats et décider si le pipeline doit échouer (exit 1) ou non selon un seuil défini.
Vérification : rapport-trivy.json est créé. La commande jq retourne un nombre entier représentant le total de CRITICAL.
🗂️ Mini-Projet
Créez un script scan-images.sh qui scanne 3 images et retourne un code de sortie non-nul si des vulnérabilités CRITICAL existent :
#!/bin/bash
set -e
IMAGES=("ubuntu:20.04" "python:3.12-slim" "nginx:alpine")
FAILED=0
for IMAGE in "${IMAGES[@]}"; do
echo "==> Scan de $IMAGE"
if ! trivy image --severity CRITICAL --ignore-unfixed --exit-code 1 "$IMAGE"; then
echo "ECHEC : $IMAGE contient des vulnérabilités CRITICAL"
FAILED=1
fi
done
exit $FAILEDCheckpoints :
- Trivy est installé et fonctionne
ubuntu:20.04affiche des vulnérabilités HIGH/CRITICALpython:3.12-slima moins de vulnérabilités quepython:3.8- Le script retourne exit code 1 si une image a des CRITICAL
- Le rapport JSON est généré