Dive pour analyser vos images Docker

closeCet article a été publié il y a 4 ans 10 mois 21 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Djerfy m’a fait récemment découvrir un outil écrit en Go particulièrement pratique quand vous manipulez fréquemment des images Docker, et que vous souhaitez vous assurer qu’elles n’ont rien de suspect avant de les déployer sur vos infrastructures. C’est d’ailleurs à l’occasion d’une découverte fâcheuse qu’il m’a partagé l’outil, et je me suis dit que vous faire une petite démonstration ne serait pas inutile.

Installation

Commençons déjà par disposer de l’outil sur notre machine. ArchLinux et Manjaro disposent d’un PKGBUILD sur AUR, sinon sur le dépôt GitHub le développeur met à disposition fichier DEB et RPM pour l’installation sur Debian/Ubuntu et RedHat/CentOS/Fedora.

Sinon, vous pouvez tenter la méthode manuelle après avoir installé Go. Il est même installable sous Mac et Windows. Bref, vous n’avez aucune excuse pour ne pas l’installer et en abuser.

Le fonctionnement par l’exemple

Dive vous permet d’inspecter chaque couche de votre image docker et de mettre en évidence les différences de chaque commande ayant généré une couche. Vous pouvez visionner la taille totale de l’image (pour rappel, Docker mutualise autant que possible les couches, très pratique si vous construisez plusieurs images à partir de la même base), visualiser les commandes associées aux différentes couches… et sur la droite, vous avez une arborescence complète qui s’adapte en fonction de la couche sélectionnée. Vous pouvez également filtrer l’affichage de cette arborescence, et les différences sont mises en lumière avec des couleurs.

Pour illustrer son fonctionnement, j’ai construit une petite image custom à partir de celle d’Nginx à laquelle j’ai ajouté un petit élément. Je n’ai pas choisi cet élément au hasard, ça fait partie des problèmes que Djerfy a détecté dans l’image qu’il avait analysé. J’ai ensuite fait analyser cette image par dive, et pour gagner un peu de temps, j’ai déjà filtré l’affichage afin de limiter les informations présentes :

En haut à gauche, on a les différentes couches avec les commandes associées. Comme Docker travaille avec des empreintes, ce sont les empreintes qui sont indiquées au lieu des noms des images. Idem pour les noms des dossiers/fichiers qu’on ajouterait, aussi bien que les URLs. Ceci dit, on a bien les chemins de destination, et c’est bien suffisant pour déterminer ce qui n’irait pas dans cette image. Ici, on découvre donc que quelque chose a été ajouté dans le dossier /root/.ssh/. Et la couche d’après indique que c’est un fichier id_rsa. L’arborescence de droite filtrée nous le confirme en vert (le jaune indique une modification, le vert une création).

J’ai ensuite vérifié si les soupçons sont avérés :

Double bingo, on a bien ajouté une clé privée directement sur le compte root, et sans mot de passe en plus. Ouais c’est dégueu. Et c’est grosso modo ce qu’on a découvert dans l’image en question, pire, on sait exactement à quoi la clé détectée permet d’accéder.

D’autres fonctionnalités intéressantes

Un des signes qui montrent que l’on est face à un développeur consciencieux est la taille de l’image docker qui est prête à être déployée en production. Dive ambitionne de savoir détecter les gaspillages d’espace dans les images Docker, cependant le développeur lui-même indique la fonctionnalité est encore en cours de développement. Ça reste une fonctionnalité intéressante, à surveiller de près donc. Et vous avez un nouvel outil à rajouter dans votre besace pour Docker 🙂