Depuis son apparition, la plateforme docker a été la cible de trois sources d’attaques. Nous les présentons ici, ainsi que de bonnes pratiques à suivre pour s’en protéger.
1. Attaques par le conteneur docker
La principale source d’attaque sur Docker se fait par le conteneur. Une attaque par le conteneur est causée par l’application présente dans l’image. En effet, de nombreuses images récupérées à partir des recueils d’images (par ex: DockerHub) sont malveillantes. De plus, certaines images ne sont pas supprimées ou mise à jour, se qui peut entraîner des vulnérabilités.
Les conteneurs Linux n’ont pas de mécanisme de sécurité permettant d’isoler les conteneurs non fiable, même si certains mécanismes permettent l’isolation des conteneurs (cf cet article sur les namespaces et les cgroups).
2. Attaques sur la machine hôte
Les conteneurs partage le noyau de l’hôte, ils sont donc vulnérables aux failles de ce noyau. Une faille donnant des privilèges root à un conteneur peut permettre une attaque sur la machine hôte.
Docker est basé sur la librairie libcontainer. Cette dernière possède plusieurs failles d’isolation par exemple l’accès au système de fichier de l’hôte.
Depuis que les processus des conteneurs sont souvent utilisés avec le PID 0, ils ont la possibilité de lire et d’écrire sur le système de fichier. Même ils ont l’autorisation d’écraser les binaires de l’hôte et de les remplacer par celui de l’attaquant .
3. Attaques sur le réseau
La connexion entre les conteneurs et la machine hôte est fournie via un pont Ethernet virtuel.
Des attaques entre conteneurs qui sont sur la même machine hôte sont donc possible par exemple l’ARP spoofing qui est utilisé pour attaquer tout réseau de protocole d’adresse ARP: elle permet notamment à l’attaquant de détourner des flux de communications.
Voici une Figure qui illustre les différentes attaques Docker, c’est une image prise du site Wikipédia
Les bonnes pratiques
Docker nous permet de faire beaucoup de choses, si on ne fait pas attention lors de son utilisation, on peut avoir des problèmes de sécurité. Le niveau de risque dépend de la manière dont l’utilisateur interagit avec docker. Il y a des bonnes pratiques d’utilisation de Docker à suivre pour éviter tout risque, dont certaines sont présentées ici :
Ne pas utiliser n’importe quel registry
Plusieurs images sont téléchargeables depuis le registry Docker hub. Assurez vous que les images que vous télécharger sont officielles et validées par la société Docker.
Si ce n’est pas le cas, assurez vous que l’image à suffisamment été téléchargée et testée par d’autres utilisateurs.
Vous pouvez aussi vérifier le Dockerfile sur le GitHub pour être sûre que l’image correspond à ce qu’elle est censé d’être.
Et si jamais l’image est téléchargé à partir d’un autre registry que Docker Hub, il faut vérifier la réputation de ce registry.
Docker bloque la commande pull si la communication établit avec le nouveau registry ne se fait pas de manière sécurisé.
Interdire la communication entre les conteneurs
La communication entre les conteneurs est possible sans ceux qui sont connectés par la fonction Link, Une mauvaise image pourrait sniffer et voir tout ce qui se passe sur le sous-réseau Docker de votre système hôte comme vu dans les attaques sur réseau.
Pour éviter ce risque, il faut interdire la communication entre ces conteneurs saufs ceux qui sont liés par la fonction Link.
Cette solution est disponible nativement avec Docker. Il suffit de passer le paramètre –icc=false au deamon Docker.
Sous debian et ubuntu, cette opération se fait dans le fichier /etc/default/docker en modifiant la variable DOCKER_OPTS
Ne pas utiliser privileged pour n’importe quel image
En lançant un container avec le mot clé privileged, Docker va lui donner tous les droits, y compris celui de lancer de nouveaux container sur la machine hôte.
Si une image demande à être privileged, il faut se demander pour quoi elle a besoin de ce droit?
Si l’utilisation de privileged est justifiée, il n’est pas nécessaire pour autant d’accorder la totalité des droits.
Rester informer des évolutions de docker
Docker contient des composants clés qui assurent la sécurité, avec chaque nouvelle version de docker qui sort il y a des fonctionnalités en plus qui permet d’assurer la sécurité et des patchs de sécurité à appliquer.
Créer une partition séparée pour Docker
Il est recommandéde créer une partition physique séparée pour le répertoire /var/lib/docker dès l’installation de votre système hôte.
En effet, l’inconvénient de ce répertoire est qu’il se trouve sous le répertoire racine et que si Docker remplit ce répertoire, votre répertoire racine sera également plein, ce qui va rendre votre système hôte inutilisable. Une image mal intentionnée pourrait volontairement se mettre à occuper tout l’espace disponible pour votre système hôte.M
La meilleure protection des systèmes en termes d’isolation est celui qui ne partage aucune ressource physique avec les autres.
Peut on faire confiance au contenu du docker ?
Pour limiter les risques d’attaques, il est possible d’utiliser le contenu de confiance de Docker Hub. Docker propose d’utiliser des images certifiées, c’est-à-dire des images fiables et donc le contenu est uniquement ce qui est présenté. Pour être certifié, une image doit passer une série de tests sur l’API de docker grâce à l’outil inspectDockerImage fournit par docker.
Docker propose une option afin d’utiliser seulement les images de confiances :
SELinux
Sécurity-Enhanced Linux est un module de sécurité pour Linux, permet de définir une politique de contrôle d’accès obligatoire (qui est une méthode de gestion des droits d’utilisateurs pour l’usage de système d’information).
Docker utilise des politiques de fortification de SELinux :
Le type de renforcement permet de protéger le moteur Docker et la machine hôte des conteneurs, qui peuvent venir d’une sources non fiable.
La méthode d’accès de contrôle permet de protéger un conteneur des autres conteneurs ayant le même types de renforcement.
AppArmor
Application Armor, est un module qui protège le système d’exploitation et ses applications contre les risques de sécurité: un administrateur système associe à chaque programme un profil de sécurité qui restreint ses accès au système d’exploitation.
Le profil de sécurité autorise l’accès ou non à des fonctionnalitées telle que l’autorisation de lecture ou écriture de fichier.
Cgroups
Les cgroups permettent de limiter les ressources utilisées par les conteneurs, et donc d’offrir la possibilité de limiter les attaques par déni de service.
Les cgroups sont une fonctionnalité clé qui permet de limité pour chaque conteneur le nombre de ressources utilisés, par exemple l’utilisation CPU et de la mémoire, en s’assurant que chaque conteneur obtient une part équitable de ressources
On pourra retenir que l’isolation des conteneurs, permet d’éviter des problèmes de sécurité et pour mieux comprendre l’isolation je vous propose de voir cet article.
Soufiane Baghor, Kahina Boufala, Victor Fontaine,