Docker namespaces

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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 ».

Voir aussi