
I. Présentation
Dans ce tutoriel, nous allons découvrir comment utiliser Lynis, un outil d’audit open source, pour évaluer la sécurité d’un Dockerfile.
Beaucoup d’entre vous connaissent déjà Lynis, principalement utilisé pour effectuer des vérifications élémentaires sur les configurations de sécurité des systèmes Linux. Mais, saviez-vous qu’il peut également servir à auditer la sécurité d’un Dockerfile ? Regardons cela de plus près.
II. Rappel : Docker, Dockerfile et docker-compose
Docker est une plateforme de conteneurisation qui permet de créer, tester et déployer des applications dans des environnements légers et isolés, appelés conteneurs. Ces conteneurs sont générés à partir d’images Docker, ce qui permet de répliquer un même environnement facilement sur différentes machines.
Le Dockerfile : les instructions pour construire une image
Un Dockerfile est un fichier texte contenant une série d’instructions permettant de construire une image Docker (commande docker build). Voici un exemple typique :
# Utilise l’image officielle Python 3.12 comme base
FROM python:3.12
# Définit le répertoire de travail dans le conteneur
WORKDIR /usr/local/app
# Copie le fichier des dépendances depuis l’hôte
COPY requirements.txt ./
# Installe les dépendances Python
RUN pip install –no-cache-dir -r requirements.txt
# Crée un utilisateur dédié pour l’application
RUN useradd app
# Définit l’utilisateur par défaut pour exécuter le conteneur
USER app
# Commande exécutée au démarrage du conteneur
CMD [“uvicorn”, “app.main:app”, “–host”, “0.0.0.0”, “–port”, “8080”]
Une fois l’image construite à partir de ce Dockerfile, tous les conteneurs créés à partir de cette image auront la même configuration, les mêmes services installés, le même utilisateur, etc. C’est en quelque sorte la “recette de cuisine” d’une image Docker.
Ainsi, même si vous êtes un utilisateur fréquent de Docker, vous n’avez peut-être jamais eu affaire aux Dockerfiles. Cela parce que depuis des plateformes comme le Docker Hub, nous téléchargeons en général directement l’image pré-construite.
docker-compose.yml : pour le déploiement complexe/multi-conteneurs
Attention à ne pas confondre un Dockerfile avec un fichier docker-compose.yml. Ce dernier est un outil de configuration et d’orchestration qui permet de :
Déployer plusieurs conteneurs en interaction.
Définir des réseaux, volumes et dépendances entre conteneurs.
Simplifier la gestion de déploiements complexes (bases de données, services backend, frontend, etc.).
Il s’agit d’une extension pratique de la commande docker run, idéale pour les environnements multi-conteneurs. Son utilisation intervient donc bien après la conception des images à utiliser, plus précisément lors de leur déploiement en tant que conteneurs.
Après ce bref rappel, voyons comment utiliser Lynis pour analyser la sécurité d’un Dockerfile.
III. Pourquoi auditer un Dockerfile avec Lynis ?
L’intérêt de vérifier la sécurité d’un Dockerfile est de s’assurer que l’image que nous allons construire respecte quelques règles de sécurité élémentaires. Cela permet d’éviter de créer une image vulnérable, qui pourrait ensuite être déployée sous forme de conteneur.
Le risque de l’utilisation d’une image vulnérable est donc le déploiement à grande échelle de conteneurs, eux aussi, vulnérables. On parle, par exemple, de faiblesses permettant l’exécution de commandes en tant que root, l’exposition de ports inutiles, l’utilisation d’images ou de paquets obsolètes ou de debug, etc.
Pour mieux comprendre les principaux risques liés à Docker, je vous oriente vers notre article dédié à ce sujet :
Pour effectuer ces vérifications, Lynis s’appuie sur des standards reconnus, tels que le CIS Docker Benchmark.
Attention toutefois, il ne contient pas 100% des points de contrôle et des bonnes pratiques connues. Il s’agit d’une vérification des principaux points. C’est pour cela que je parle de contrôles “élémentaires”.
IV. Audit du Dockerfile avec Lynis : les étapes à suivre
A. Installation de Lynis
Avant de commencer, nous devons nous assurer que Lynis est en place et opérationnel. Sur la plupart des OS Linux, Lynis peut être installé via les commandes de gestion des paquets habituelles :
# CentOS, Fedora, Red Hat Enterprise Linux (RHEL) & dérivés
$ yum install lynis
# Debian, Linux Mint, Ubuntu & dérivés
$ apt-get install lynis
# openSUSE
$ zypper install lynis
Si Lynis n’est pas présent dans vos dépôts, je vous oriente vers la procédure d’installation officielle de l’outil, qui aura l’avantage d’être toujours à jour : Get Started with Lynis
Également, Docker doit être installé sur votre système (si vous êtes arrivés ici, j’imagine que c’est déjà le cas) et vous devez disposer d’un fichier Dockerfile à analyser. Si vous n’en avez pas sous la main, en voici un vulnérable qui fera l’affaire pour des tests : github.com/ianmiell/bad-dockerfile
Attention, ce dépôt est conçu pour illustrer des mauvaises pratiques, et non pour être utilisé en production.
J’ai également trouvé ce dépôt qui contient un tas de Dockerfiles (pas forcément tous vulnérables) : github.com/jessfraz/dockerfiles
B. Analyse d’un Dockerfile
Maintenant que nous avons tout ce qu’il faut, nous pouvons utiliser Lynis pour auditer nos Dockerfiles. Il faut pour cela utiliser l’option audit dockerfile et spécifier le chemin local vers le fichier Dockerfile à analyser :
# Audit d’un Dockerfile avec Lynis
./lynis audit dockerfile /workspace/dockerfiles/Dockerfile
Par défaut, Lynis vous affiche une synthèse de son analyse dans le terminal, mais le fichier /var/log/lynis.log contient des informations plus précises.
C. Exemple de résultats et liste des vérifications
Voici un exemple de résultat d’analyse de Lynis sur le fichier provenant du dépôt GitHub ianmiell/bad-dockerfile. Le rapport de Lynis peut être découpé en 4 parties :
État des lieux : rappelle les conditions de l’analyse et les options de lancement.
Synthèse des observations :
Synthèse du scan Lynis.
Synthèse des vulnérabilités :
Synthèse des vunérabilités d’une analyse Lynis sur un Dockerfile.
Dans mon cas, l’analyse me remonte :
L’absence de directive ENTRYPOINT, qui permet de définir la commande à exécuter au démarrage ;
L’absence de déclaration d’un nouvel utilisateur, ce qui revient à exécuter le service du conteneur en tant que root ;
L’installation d’outils de développement/compilation qui peuvent être réutilisés par un attaquant (pour compiler des exploits, par exemple).
En complément, vous trouverez l’ensemble des paramètres relevés par Lynis (pour preuve d’audit et de vérification) dans le fichier /var/log/lynis-report.dat :
Configurations relevées par Lynis.
Et, enfin, l’ensemble des journaux de l’analyse, incluant les éléments identifiés comme corrects dans le fichier de log /var/log/lynis.log :
Journaux de l’analyse Lynis.
Nous avons, par exemple, ici, la liste des tests et des vérifications effectuées ainsi que le résultat obtenu. Ces différentes informations techniques permettent de mieux comprendre ce qui a été analysé, mais aussi de retrouver les détails techniques qui ont permis d’identifier une vulnérabilité ou une non-conformité.
À noter que ces deux chemins peuvent varier en fonction de votre configuration de Lynis.
IV. Conclusion
Lynis est un petit outil simple d’utilisation et rapide à prendre en main pour effectuer des checks de sécurité élémentaires. S’il remonte quelque chose, c’est qu’il y a vraisemblablement une absence de prise en compte de la sécurité lors de la conception du conteneur. Il s’agit d’un test à ne pas oublier lorsque l’on est amené à développer ou à utiliser des Dockerfiles.
Il faut cependant se rappeler qu’il ne s’agit pas d’un audit complet et que la sécurité d’un conteneur Docker ou d’une image ne peut être évaluée avec certitude qu’avec ce qu’il se trouve dans son Dockerfile (je vous oriente à nouveau vers le Top 5 des risques Docker).
Pour aller plus loin avec la sécurité Docker ou sur l’utilisation de Lynis pour auditer des systèmes Linux, je vous oriente vers nos différents articles :
Co-fondateur d’IT-Connect.fr.
Auditeur/Pentester chez Orange Cyberdéfense.