veilletech.fr
9 nov. Feed du jour
#03 DOCKER Article

nspawn 3.0 : l'API Docker pour systemd-nspawn

La socket Docker devant, les conteneurs systemd en dessous.

nspawn 3.0 sert l'API Docker Engine sur l'hôte, via la socket /run/nspawn/api.sock : en pointant DOCKER_HOST dessus, la commande docker et des outils comme l'exécuteur docker de GitLab Runner pilotent des conteneurs systemd-nspawn sans modification. Un utilisateur doté de org.nspawn.manage est root sur l'hôte, comme le groupe docker ; un service en lecture seule doit monter la socket :ro. docker build n'est pas pris en charge contre la socket.

2 min de lectureintermédiairevidéo 1:23
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Comment ça marche
  3. Le point de sécurité à ne pas manquer
  4. Limites
  5. À retenir

Ce qui se passe

nspawn est un outil qui gère des conteneurs systemd-nspawn — plus légers qu'un conteneur Docker, et intégrés au système. Sa version 3.0.0 sert désormais l'API Docker Engine directement sur l'hôte. Jusqu'ici (2.0.0), seules les machines qui montaient la socket Docker en voyaient une copie en lecture seule ; maintenant, l'API est exposée sur l'hôte lui-même.

Comment ça marche

La socket de l'hôte est /run/nspawn/api.sock, ouverte par l'unité nspawn-api.socket. Les paquets la livrent désactivée ; on l'active, et nspawn-api.service démarre à la première connexion :

Terminal
sudo systemctl enable --now nspawn-api.socket
export DOCKER_HOST=unix:///run/nspawn/api.sock
docker run -d --name web -p 8080:80 nginx
docker exec -it web sh
docker cp web:/etc/nginx/nginx.conf .
docker rm -f web

L'API répond dans les formes de la version 1.51, et des versions jusqu'à 1.24 que les clients réclament. Elle couvre les conteneurs (create, start, stop, exec, attach, archive pour docker cp…), les images (pull, remove, prune), les volumes et les réseaux. L'intérêt principal est la compatibilité : un outil qui pilote des conteneurs par l'API Docker tourne sur nspawn sans y toucher. L'exécuteur docker de GitLab Runner en est l'exemple direct :

TOML
[[runners]]
  executor = "docker"
  [runners.docker]
    host = "unix:///run/nspawn/api.sock"
    image = "alpine:latest"

Pour les clients qui ne regardent que /run/docker.sock, un drop-in ajoute le lien symbolique.

Le point de sécurité à ne pas manquer

L'API applique les mêmes actions polkit que la ligne de commande : lire et attendre demandent org.nspawn.inspect, les journaux et les changements demandent org.nspawn.manage. Et c'est là le piège : un utilisateur qui détient org.nspawn.manage est root sur l'hôte, exactement comme un membre du groupe docker — une machine lance des commandes en root et peut monter n'importe quel chemin de l'hôte.

Conséquence pratique : un proxy ou un tableau de bord qui ne fait que lire doit monter la socket en lecture seule (:ro). Dans ce mode, elle lit, suit les journaux et tue, mais refuse tout le reste avec un 403.

Limites

Source : blog nspawn, en anglais.