Lab 10.2 : Analyser et corriger une image¶
| Durée | 75 min |
| Niveau | Semi-guidé |
| Prérequis | Lab 10.1 : Durcir un conteneur (image secure:1.0 et dossier tp-secure), Lab 9.2 : Réduire et comparer des images, section 6 du cours |
| Acquis visés | AA7 |
Objectifs
- Analyser les vulnérabilités d'une image avec un scanner exécuté dans un conteneur
- Lire un rapport : CVE, paquet, version installée, version corrigée, sévérité
- Comparer la situation de plusieurs images de base
- Corriger une image, reconstruire et réanalyser pour mesurer le résultat
- Définir un critère d'acceptation qui renvoie un code de sortie exploitable par un automate
Contexte et schéma¶
Vous analysez l'image de votre application avec Trivy, un scanner de vulnérabilités. Trivy est lui-même fourni sous forme d'image Docker : vous n'installez rien sur votre machine. Pour ne pas lui donner accès au moteur Docker, vous exportez d'abord l'image dans une archive que Trivy analyse. Dans ce lab, seules les commandes clés vous sont données : à vous de les adapter et de déduire le reste à l'aide du cours.
flowchart LR
I["Image<br/>secure:1.0"] -- "docker save" --> A["Archive<br/>app.tar"]
A -- "montée dans un conteneur" --> T["Trivy"]
DB[("Base de failles<br/>téléchargée, en cache")] --> T
T --> R["Rapport<br/>CVE, paquet, sévérité"]
R --> C["Correction,<br/>reconstruction"]
C --> I
Selon votre option
- Sous PowerShell, utilisez
${PWD}à la place de$(pwd), écrivez les commandes sur une seule ligne, et lisez le code de sortie avec$LASTEXITCODEau lieu de$?. - Le premier lancement télécharge la base de failles : il exige un accès à Internet et prend un moment.
Étapes¶
Étape 1 : Choisir et vérifier la version de Trivy¶
- Objectif : utiliser une version précise du scanner, comme pour toute image (chapitre 3).
- Indices :
- Consultez la page de l'image
aquasec/trivysur Docker Hub, choisissez un tag de version précis (paslatest) et notez-le : vous l'utiliserez dans toutes les commandes du lab, écrit ci-dessous<version>. - Téléchargez l'image et affichez sa version :
docker run --rm aquasec/trivy:<version> --version. - Créez un volume nommé
trivy-cache(chapitre 5) pour conserver la base de failles d'un lancement à l'autre.
- Consultez la page de l'image
Point de contrôle
-
--versionaffiche la version choisie -
docker volume lsaffichetrivy-cache
Étape 2 : Analyser l'image de l'application¶
- Objectif : obtenir un premier rapport.
- Indices :
- Exportez l'image du Lab 10.1 :
docker save -o app.tar secure:1.0. - Lancez Trivy dans un conteneur éphémère (
--rm) qui monte le dossier courant sur/worket le volumetrivy-cachesur/root/.cache/, avec la commandeimage --input /work/app.tar:
- Exportez l'image du Lab 10.1 :
docker run --rm -v "$(pwd):/work" -v trivy-cache:/root/.cache/ aquasec/trivy:<version> image --input /work/app.tar
- Lisez le résumé : nombre de failles par sévérité, et distinction entre les paquets du **système** et ceux de **Python** (les dépendances installées par `pip`).
Point de contrôle
- Le rapport s'affiche (la base a été téléchargée au premier lancement)
- Vous avez relevé le nombre de failles par sévérité (
CRITICAL,HIGH,MEDIUM,LOW) - Vous avez distingué ce qui vient du système et ce qui vient des dépendances Python
Étape 3 : Lire un rapport et filtrer¶
- Objectif : se concentrer sur ce qui est important et réparable.
- Indices :
- Relancez l'analyse avec l'option
--severity HIGH,CRITICAL: combien de failles restent ? - Ajoutez l'option
--ignore-unfixed: combien de failles restent maintenant, et pourquoi le nombre diminue-t-il ? - Choisissez une faille de sévérité
HIGHouCRITICALet relevez : l'identifiant CVE, le paquet concerné, la version installée et la version corrigée (si elle existe).
- Relancez l'analyse avec l'option
Point de contrôle
- Vous avez trois chiffres : toutes failles,
HIGHetCRITICAL, puis avec--ignore-unfixed - Vous avez décrit une faille précise : CVE, paquet, version installée, version corrigée
- Vous savez expliquer l'effet de
--ignore-unfixed
Étape 4 : Comparer des images de base¶
- Objectif : relier le choix de l'image de base au nombre de failles (chapitre 9).
- Indices :
- Téléchargez
python:3.12,python:3.12-slimetpython:3.12-alpine(docker pull), exportez chacune avecdocker savedans un fichier distinct, puis analysez chaque archive avec les mêmes options (--severity HIGH,CRITICAL). - Remplissez le tableau avec vos mesures :
- Téléchargez
| Image de base | Nombre de failles HIGH + CRITICAL |
Dont avec correctif disponible | Taille de l'image |
|---|---|---|---|
python:3.12 |
|||
python:3.12-slim |
|||
python:3.12-alpine |
Point de contrôle
- Le tableau est complété avec vos mesures
- Vous avez comparé le nombre de failles et la taille des trois images
- Vous pouvez formuler une conclusion, à partir de vos résultats uniquement, sur le lien entre taille et failles
Étape 5 : Corriger, reconstruire et réanalyser¶
- Objectif : réduire les failles corrigeables de l'image de l'application.
- Indices :
- Reconstruisez l'image en récupérant les dernières mises à jour de l'image de base :
docker build --pull --no-cache -t secure:1.1 .(danstp-secure, avec le Dockerfile du Lab 10.1). - Si le rapport de l'étape 2 signalait une faille dans une dépendance Python (par exemple Flask) avec une version corrigée, modifiez
requirements.txtpour utiliser la version corrigée indiquée par le rapport, puis reconstruisez. Ne choisissez pas une version au hasard : prenez celle du rapport. - Si votre image de départ repose sur une image complète, changez-la pour une variante allégée (chapitre 9), puis reconstruisez.
- Exportez la nouvelle image, analysez-la avec les mêmes options qu'à l'étape 3, puis comparez avant et après.
- Vérifiez que l'application fonctionne toujours avec la nouvelle image (
curl).
- Reconstruisez l'image en récupérant les dernières mises à jour de l'image de base :
Point de contrôle
- Vous avez noté, pour chaque modification, ce que vous avez changé et pourquoi
- Le nombre de failles
HIGHetCRITICALcorrigeables a diminué (ou vous expliquez pourquoi il n'a pas diminué) - L'application répond toujours avec
secure:1.1
Étape 6 : Définir un critère d'acceptation¶
- Objectif : obtenir un résultat exploitable par un automate : le code de sortie.
- Indices :
- Ajoutez à la commande d'analyse les options
--severity CRITICAL --ignore-unfixed --exit-code 1, puis relevez le code de sortie (echo $?, ou$LASTEXITCODEsous PowerShell) poursecure:1.0et poursecure:1.1. - Rédigez en une phrase la règle que vous appliqueriez avant de publier une image (par exemple : quelle sévérité bloque la publication ?).
- Ajoutez à la commande d'analyse les options
Point de contrôle
- Vous avez relevé le code de sortie pour chaque image
- Vous savez expliquer comment un pipeline utiliserait ce code (voir le chapitre 13)
- Votre règle de publication est écrite
Étape 7 (facultative) : Auditer les images de la pile¶
- Objectif : analyser les images officielles utilisées depuis le début du cours.
- Indices : analysez
nginx:1.27-alpineetpostgres:16-alpineavec les mêmes options, comparez leurs résultats à ceux de votre image et décidez, pour chacune, d'une action (mettre à jour, surveiller, accepter) avec une justification.
Point de contrôle
- Les deux images sont analysées
- Chacune a une décision justifiée
Étape 8 : Rédiger la fiche d'analyse¶
- Objectif : garder une trace des décisions.
- Indices : pour trois failles de votre rapport (au moins une avec correctif et une sans), remplissez :
| CVE | Paquet et version | Sévérité | Correctif ? | Décision (corriger, surveiller, accepter) | Justification |
|---|---|---|---|---|---|
Point de contrôle
- Trois lignes sont complétées, avec une justification pour chaque décision
Questions de réflexion¶
Pourquoi exporte-t-on l'image avec docker save plutôt que de donner à Trivy l'accès au moteur Docker ?
Donner l'accès au socket du moteur revient à donner un accès administrateur à la machine (chapitre 10, section 1). L'archive suffit à l'analyse et limite les droits du conteneur du scanner.
Pourquoi le nombre de failles diminue-t-il avec --ignore-unfixed ?
Cette option masque les failles pour lesquelles aucune version corrigée n'existe. Elles ne sont pas résolues : on ne peut simplement rien y faire pour l'instant, et on les surveille. Le chiffre restant correspond à ce que l'on peut corriger.
Pourquoi réanalyser après une correction, et pourquoi vérifier que l'application fonctionne ?
Pour mesurer le résultat réel de la modification et s'assurer qu'elle n'a pas introduit de nouvelle faille. Une mise à jour peut aussi casser l'application : une image plus sûre qui ne fonctionne pas n'a aucune valeur.
Un rapport sans faille CRITICAL suffit-il pour publier une image ?
Non : il dépend de la base de failles à la date de l'analyse, et ne dit rien des erreurs de configuration, des secrets ou des droits du conteneur. L'analyse est un contrôle parmi d'autres (Lab 10.1) et doit être répétée.
Dépannage¶
| Symptôme | Pistes |
|---|---|
failed to download vulnerability DB ou erreur réseau |
Pas d'accès Internet depuis le conteneur, ou serveur de la base indisponible : vérifiez la connexion, réessayez plus tard |
Erreur du type TOOMANYREQUESTS |
Limite de requêtes du serveur de la base : patientez et relancez ; une fois la base téléchargée dans trivy-cache, elle est réutilisée |
unable to open /work/app.tar |
Le dossier courant n'est pas monté sur /work, ou l'archive n'est pas dans ce dossier |
| Chemin invalide sous PowerShell | Utilisez ${PWD} et écrivez la commande sur une seule ligne |
| Le rapport est très long | Ajoutez --severity HIGH,CRITICAL pour le restreindre |
invalid reference format pour l'image Trivy |
<version> n'a pas été remplacé par un tag réel |
docker save produit un fichier très gros |
Normal : l'archive contient toutes les couches de l'image |
| La reconstruction ne change rien | Utilisez --pull --no-cache pour récupérer la dernière image de base et ne pas réutiliser le cache |
Nettoyage et reprise¶
Supprimez les archives .tar, qui sont volumineuses. Conservez secure:1.0, le dossier tp-secure et votre fiche d'analyse : ils servent au Mini-projet 3.
Retour au chapitre¶
Chapitre 10 : Sécurité des conteneurs · Quiz : Quiz du chapitre 10