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
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Image | une copie emballée d'un programme et de ce qu'il lui faut, d'où démarrent les conteneurs | |
| Étiquette | le mot après les deux-points dans le nom d'une image | 1.27.5-alpine |
| Figer | nommer une version exacte pour qu'elle ne change jamais par surprise | |
| Paquet | un programme ou une bibliothèque installé dans l'image | |
| Avis | une note qui dit quelle version a corrigé une faille connue | |
| Scan | comparer 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 ?
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 ?
docker exec web nginx -vAffiché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 ?
docker exec web ps -o user,args | head -n 3Affiché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 ?
docker exec web apk info 2>/dev/null | wc -lAffiché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
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 ?
docker exec web apk version -t 1.3.1-r2 1.3.2-r0Affiché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
docker exec web apk version -t 1.2.5-r9 1.2.5-r9Affiché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
| Paquet | Installé | Corrigé dans | Résultat |
|---|---|---|---|
| zlib | 1.3.1-r2 | 1.3.2-r0 | Plus ancien : mettre à jour |
| musl | 1.2.5-r9 | 1.2.5-r9 | Égal : corrigé |
| curl | 8.12.1-r1 | 8.12.0-r0 | Plus récent : corrigé |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Que porte l'image dans son environnement ?
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.