
Dive pour analyser vos images Docker

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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
docker run --name some-nginx -d nginx-custom 9a28ae0c24ed2d153fa90d05ac29f572ade8ec3c5ff0f5ba9da05496e939137c seboss666 ~ dev dive-test docker container ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a28ae0c24ed nginx-custom "nginx -g 'daemon of…" 7 seconds ago Up 5 seconds 80/tcp some-nginx seboss666 ~ dev dive-test docker exec -ti some-nginx /bin/bash root@9a28ae0c24ed:/# cd /root root@9a28ae0c24ed:~# ls -la total 20 drwx------ 1 root root 4096 Jun 1 19:10 . drwxr-xr-x 1 root root 4096 Jun 1 19:11 .. -rw-r--r-- 1 root root 570 Jan 31 2010 .bashrc -rw-r--r-- 1 root root 148 Aug 17 2015 .profile drwx------ 1 root root 4096 Jun 1 19:10 .ssh root@9a28ae0c24ed:~# cd .ssh/ root@9a28ae0c24ed:~/.ssh# ls -l total 4 -rw------- 1 root root 887 Jun 1 19:07 id_rsa root@9a28ae0c24ed:~/.ssh# cat id_rsa -----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQDTFPvEnX5TVL5NdH7IN17FBwXF3SDZiE+kLbgFxntC3kArzgrX CI40ZYT3bwEcU54dfDTz4whBzVlxf3iJUB1+47rNg6YCo2nuVS0NaJd2Kkh8U7TC AIjKa0/RSntS7lOMd6cIQhyDUP25WOfpkvaFndwKvMqIsgcAfZskI5nTXQIBJQKB gQCrJcU3okrAGzKD/Zc6jcJ2PQuZgtxdWcQIk8Wj0V0FyPXCpw+1RTUH45w+PlPt dDsDJnAfsSlKHB8CFFPk9NmjrWO2t5Qy/bPM46MaJRYJjt41DhBULcJJ7i5Ore4z 3DYeEq4snnxxcDFfW5YOyhbwRSFxJSWR1zKbzztWhU54rQJBAPoCmEDkaZWI6zNB (...) |
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 🙂