Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Contrôler une image et ses versions

Après cette leçon: Je peux contrôler ce qu'une image fait tourner, quelles versions elle contient et si certaines sont périmées.

Leçon de 55 min8 commandesLab de durcissement d’un serveur web : corriger une configuration nginx faible et la vérifier avec curl

L'image qui allait bien l'an dernier

Une équipe a construit une image de serveur web il y a un an et l'a fait tourner depuis. Elle marchait, donc personne n'y a touché.

En un an, trois failles ont été trouvées dans des programmes qu'elle contient. L'équipe n'a jamais regardé, et un scanner l'a fait.

Cette leçon contrôle une image comme un défenseur, avant que quelqu'un attaque.

À la fin de cette leçon

Remarque

Je peux contrôler ce qu'une image fait tourner, quelles versions elle contient et si certaines sont périmées.

Mots clés

MotCe que ça veut direExemple
Imageune copie emballée d'un programme et de ce qu'il lui faut, d'où démarrent les conteneurs
Étiquettele mot après les deux-points dans le nom d'une image1.27.5-alpine
Figernommer une version exacte pour qu'elle ne change jamais par surprise
Paquetun programme ou une bibliothèque installé dans l'image
Avisune note qui dit quelle version a corrigé une faille connue
Scancomparer ce qui est installé avec une liste de failles connues

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une étiquette dit quelle version vous faites tourner

Un conteneur démarre depuis une image. Le nom de l'image finit par une étiquette, comme nginx:1.27.5-alpine.

Une étiquette latest veut dire ce qui est le plus récent aujourd'hui. Elle change sous vos pieds. Une étiquette figée nomme une version exacte : vous savez ce que vous faites tourner et vous décidez quand changer.

Quelle image le service web fait-il tourner ?

Commande
docker inspect web --format '{{.Config.Image}}'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Quel nginx contient-elle ?

Commande
docker exec web nginx -v

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Ce qu'ont écrit les deux Run

Le premier a écrit nginx:1.27.5-alpine. L'étiquette est une version : cette image est figée. Le second a écrit nginx version: nginx/1.27.5.

Ces deux réponses doivent s'accorder. Si l'étiquette dit une chose et le programme une autre, quelqu'un a changé l'image.

Qui fait tourner les processus ?

Commande
docker exec web ps -o user,args | head -n 3

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Root et l'ouvrier

Le Run a écrit un titre, puis une ligne root pour le processus maître, puis une ligne nginx pour un ouvrier.

Le maître est root pour pouvoir ouvrir le port 80. Les ouvriers, qui servent les visiteurs, tournent avec le compte simple nginx. Une faille dans un ouvrier donne beaucoup moins à un attaquant. Si tout tournait en root, la même faille donnerait tout le conteneur.

Un inventaire vient avant un scan

Un scanner fait trois choses. Il liste les paquets, il lit une liste de failles et de leurs corrections, et il compare les deux.

Vous pouvez faire la première et la troisième dans le labo. Un vrai scanner prend sa liste de failles sur internet, et le labo n'a pas de sortie : vous allez donc taper deux avis inventés.

Combien de paquets sont installés ?

Commande
docker exec web apk info 2>/dev/null | wc -l

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Voir les versions de deux d'entre eux

Commande
docker exec web apk info -v 2>/dev/null | grep -E '^(zlib|musl)-[0-9]'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

L'inventaire

Sur la machine d'essai, le compte était 68, et les deux lignes étaient musl-1.2.5-r9 et zlib-1.3.1-r2. Chaque ligne est un nom, une version et un numéro de construction.

Voici maintenant un avis inventé : « zlib est corrigé dans la 1.3.2-r0 ». Alpine sait comparer deux versions pour vous, hors ligne.

Le zlib est-il plus ancien que le correctif ?

Commande
docker exec web apk version -t 1.3.1-r2 1.3.2-r0

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Comparer musl à un correctif égal

Commande
docker exec web apk version -t 1.2.5-r9 1.2.5-r9

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Ce que veulent dire les symboles

Le premier Run a écrit <. La version installée est plus ancienne que le correctif : ce paquet demanderait une mise à jour. Le second a écrit = : il est déjà à la version corrigée.

Un symbole > voudrait dire plus récent que le correctif. Voilà tout un scan : un inventaire, un avis et une comparaison.

Exemple : ce que décide un scan

PaquetInstalléCorrigé dansRésultat
zlib1.3.1-r21.3.2-r0Plus ancien : mettre à jour
musl1.2.5-r91.2.5-r9Égal : corrigé
curl8.12.1-r18.12.0-r0Plus récent : corrigé

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Que porte l'image dans son environnement ?

Commande
docker inspect web --format '{{json .Config.Env}}'

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Une erreur fréquente

Attention

Beaucoup de gens scannent une fois, ne voient rien, et ne scannent plus jamais. De nouvelles failles sont trouvées chaque semaine : une image propre le mois dernier ne l'est peut-être plus. Scannez selon un calendrier, et de nouveau à chaque changement de l'image.

Ce que le labo ne peut pas montrer

Un labo ne peut ni télécharger, ni construire, ni scanner d'images : vous avez inspecté le service en marche, pas le fichier de l'image. Sur la machine d'essai, le Run d'environnement n'a écrit que des valeurs que l'image fixe elle-même, comme la version. C'est ce qu'il doit contenir.

Un mot de passe dans cette liste serait une fuite. Quiconque peut inspecter le conteneur peut le lire.

Aller plus loin : après vos corrections

Terminez les corrections du labo, puis lancez docker exec web lab-check. Relancez les trois Run de cette leçon et écrivez une phrase : l'un d'eux a-t-il changé ?

La configuration est ce que vous avez durci. L'image et ses paquets ne le sont pas : corriger la configuration ne met pas un paquet à jour.

À propos de ce labo et de sa source: Lab de durcissement d’un serveur web : corriger une configuration nginx faible et la vérifier avec curl

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.