La compilation avec Docker - pour que les différentes personnes qui vont devoir compiler notre code n’aient pas à gérer les dépendances
Rapport sur la sécurité des containers - très complet rapport édité par NCC Group une société de consultants en sécurité, performances et tests de logiciels. Ce rapport semble donc indépendant de Docker Inc.
Whitepaper officiel sur la sécurité
Les namespaces et cgroups :
Voici le fonctionnement de ces deux mécanismes inclus dans n’importe quel noyau Linux récent
Il existes plusieurs fonctionalités aux namespaces comme on peut le voir dans le manuel :
Namespace Constant Isolates
IPC CLONE_NEWIPC System V IPC, POSIX message queues
Network CLONE_NEWNET Network devices, stacks, ports, etc.
Mount CLONE_NEWNS Mount points
PID CLONE_NEWPID Process IDs
User CLONE_NEWUSER User and group IDs
UTS CLONE_NEWUTS Hostname and NIS domain name
D’après la page de manuel (man namespaces) on peut apprendre qu’ils permettent d’isoler des applications au niveau des resources. Un exemple simple d’utilisation des namespace est la commande chroot : une fois exécutée le shell est lancé dans un namespace et de son point de vue le dossier du système de fichier que l’on à chrooté devient la racine.
Illustration chroot
Imaginons maintenant qu’un attaquant parvient à compromettre une application isolée dans un namespace, il lui est impossible de remonter à la machine hôte ou de compromettre d’autres services se trouvants dans d’autre namespaces.
Un autre cas d’utilisation possible des namespaces est de lancer des programmes inconnus sur sa machine tout en l’isolant du reste de la machine.
La gestion des processus se fait aussi très simplement :
Normalement quand un système démare un processus est lancé avec le PID 1 il peut ensuite exécuter différents programmes qui eux mêmes peuvent en exécuter d’autres. Ce qu’il se passe avec les namespace est que du point de vue de l’hote le processus sera bien le fils d’un autre processus (par exemple avec le PID 42) mais du point de vue de l’application son PID est le 1. Ceci évite ainsi que les application isolées puissent savoir quels autres processus sont exécutés sur l’hôte .
Illustration PID namespaces
Cette fonctionalité est disponible depuis la version 2.6.24 du noyau
Si un processus est lancé dans ce namespace il verra un ensemble de cartes réseaux complètements différentes de l’hôte et propre au namespace que l’on crée. Le problème est qu’il va falloir paramètrer à la main des interfaces virtuelles ainsi qu’un système de routage qui vont permettre au processus contenu dans le namespace de communiquer avec l’exterieur ou avec d’autre namespaces.
Normalement Linux possède une structure de donnée contenant tous les points de montages, les disque associés, les paramètres. Il est ainsi possible de cloner cette structure dans un namespace permettant ainsi au processus contenu dedans de modifier les points de montages sans affecter la machine hôte. Ce namespace bien qu’isolant l’application des points de montage permet tout de même de voir les points de montages originaux, il est ainsi possible d’utiliser un premier processus qui va “nettoyer” les points de montages avant de démarer le processus cible.
Guide d’introduction aux cgroup par RedHat
Les Cgroups permettent d’allouer des ressources (mémoire, temps processeur, bande passante) à des processus.
Docker utilise encore différents moyens pour sécuriser les containers.
Docker limite par défaut les fonctionalités disponible aux containers (man capabilities) pour éviter qu’un container compromis ne puisse faire des dégats sur le système hôte
Tableau récapitulatif