Docker namespaces
| Fiche express | |
|---|---|
| Type | Application des Namespaces Linux à l'isolation des conteneurs Docker |
| Isolés par défaut | PID · NET · IPC · MNT · UTS |
| Optionnel | User namespace (remapping UID/GID) |
| Voir aussi | Namespaces · Cgroups · Docker capabilities · Docker containers |
Docker s'appuie sur les namespaces du noyau Linux pour isoler chaque conteneur du reste du système. Le mécanisme noyau lui-même — types de namespaces, construction manuelle d'un couple d'espaces réseau reliés par une paire veth — est détaillé sur la page Namespaces ; cette page-ci se concentre sur la façon dont Docker les utilise et les expose.
Namespaces isolés par un conteneur
Par défaut, un conteneur Docker isole :
- PID — arborescence de processus propre (le premier processus du conteneur est vu comme PID 1).
- NET — interfaces, routes et règles réseau propres (voir Docker network).
- IPC (InterProcess Communication) — files de messages, sémaphores et mémoire partagée propres.
- MNT — points de montage propres.
- UTS (Unix Time Sharing) — hostname et domainname propres.
- User namespace — optionnel, mapping UID/GID propre (voir plus bas).
Ces namespaces sont assemblés par runc au moment de la création du conteneur, en complément des Cgroups qui, eux, limitent la consommation de ressources plutôt que la visibilité (voir la chaîne d'exécution complète dans Docker containers).
Namespaces réseau — équivalent bas niveau
La commande ip netns permet de manipuler directement des namespaces réseau, indépendamment de Docker — c'est en substance ce que fait Docker en interne à chaque création de conteneur (voir la construction complète avec paires veth et pont sur Namespaces) :
ip netns add mynet
ip netns exec mynet ip link set lo up
ip netns exec mynet python3 -m http.server 8080
# ce serveur ne répond pas hors du namespace
curl 127.0.0.1:8080
# ... mais répond depuis l'intérieur du namespace
ip netns exec mynet curl 127.0.0.1:8080
User namespace remapping
Par défaut, l'utilisateur root à l'intérieur d'un conteneur correspond à l'utilisateur root sur l'hôte (seuls les namespaces PID/NET/IPC/MNT/UTS isolent le conteneur, pas l'identité utilisateur). Le user namespace remapping (--userns-remap) permet de faire correspondre le root du conteneur à un utilisateur non privilégié de l'hôte, ce qui réduit fortement l'impact d'une éventuelle évasion de conteneur. La correspondance de plages d'UID/GID est définie dans deux fichiers :
/etc/subuid— plage d'UID subordonnés autorisée./etc/subgid— plage de GID subordonnés autorisée.
Sécurisation
Le user namespace remapping est un complément aux capabilities (qui restreignent les privilèges du processus conteneurisé) pour durcir un conteneur : les deux mécanismes s'adressent à des problèmes différents — l'un à « qui est root vu de l'hôte », l'autre à « quels privilèges ce root a-t-il vraiment ».