Non, les conteneurs Docker ne sont pas plus sécurisés qu'une VM.
Citant Daniel Shapira:
Rien qu'en 2017, 434 exploits du noyau Linux ont été trouvés, et comme vous l'avez vu dans cet article, les exploits du noyau peuvent être dévastateurs pour les environnements conteneurisés. En effet, les conteneurs partagent le même noyau que l’hôte, donc faire confiance aux mécanismes de protection intégrés à eux seuls n’est pas suffisant.
1. Exploits du noyau à partir d'un conteneur
Si quelqu'un exploite un bogue du noyau à l'intérieur d'un conteneur, il l'exploite sur le système d'exploitation hôte. Si cet exploit permet l'exécution de code, il sera exécuté sur le système d'exploitation hôte, pas à l'intérieur du conteneur.
Si cet exploit permet un accès arbitraire à la mémoire, l'attaquant peut modifier ou lire toutes les données de tout autre conteneur .
Sur une VM, le processus est plus long: l'attaquant devrait exploiter à la fois le noyau de la VM, l'hyperviseur et le noyau de l'hôte (et cela peut ne pas être le même que le noyau de la VM).
2. Manque de ressources
Comme tous les conteneurs partagent le même noyau et les mêmes ressources, si l'accès à certaines ressources n'est pas limité, un conteneur peut tout utiliser et affamer le système d'exploitation hôte et le d'autres conteneurs.
Sur une VM, les ressources sont définies par l'hyperviseur, donc aucune VM ne peut refuser le système d'exploitation hôte de n'importe quelle ressource, car l'hyperviseur lui-même peut être configuré pour faire une utilisation restreinte des ressources.
3. Décomposition du conteneur
Si un utilisateur à l'intérieur d'un conteneur est capable d'échapper au conteneur en utilisant un exploit ou une mauvaise configuration, il aura accès à tous les conteneurs en cours d'exécution sur l'hôte. Cela se produit parce que le même utilisateur exécutant le moteur Docker est l'utilisateur exécutant les conteneurs. Si un exploit exécute du code sur l'hôte, il s'exécutera sous les privilèges du moteur docker, afin qu'il puisse accéder à n'importe quel conteneur.
4. Séparation des données
Sur un conteneur Docker, certaines ressources ne sont pas espacées de noms:
- SELinux
- Cgroups
- systèmes de fichiers sous
/ sys
, / proc / sys
, -
/ proc / sysrq-trigger
, / proc / irq
, /proc/bus
-
/ dev / mem
, / dev / sd *
système de fichiers - Modules du noyau
Si un attaquant peut exploiter l'un de ces éléments , ils seront propriétaires du système d'exploitation hôte.
Un système d'exploitation VM n'aura pas d'accès direct à aucun de ces éléments. Il parlera à l'hyperviseur et l'hyperviseur effectuera les appels système appropriés au système d'exploitation hôte. Il filtrera les appels non valides, ajoutant une couche de sécurité.
5. Sockets Raw
Le socket Docker Unix par défaut ( /var/run/docker.sock
) peut être monté par n'importe quel conteneur s'il n'est pas correctement sécurisé. Si un conteneur monte ce socket, il peut arrêter, démarrer ou créer de nouvelles images.
S'il est correctement configuré et sécurisé, vous pouvez atteindre un haut niveau de sécurité avec un conteneur docker, mais il le sera être inférieur à une VM correctement configurée. Quelle que soit la quantité d'outils de renforcement utilisés, une VM sera toujours plus sécurisée. L'isolation métallique nue est encore plus sécurisée qu'une VM. Certaines implémentations bare metal (IBM PR / SM par exemple) peuvent garantir que les partitions sont aussi séparées que si elles se trouvaient sur du matériel séparé. Pour autant que je sache, il n'y a aucun moyen d'échapper à une virtualisation PR / SM.