Pour celleux qui s’intéressent à la conteneurisation, le sujet de la sécurité est un point important lorsqu’on utilise Docker.Une configuration ou information intéressante, c’est qu’il est possible de l’utiliser en mode “rootless” (sans être administrateur de la machine). Voici quelques notes à propose de l’outil de configuration de ce mode.
La doc officielle, pour utiliser un tel usage n’est pas très bavarde concernant les rouages de docker en mode rootless. Voici quelques informations glanées sur internet, mais aussi en lisant le script que Docker Inc recommande d’utiliser.
Mappage d’utilisateurices
Le script pour activer Docker en mode rootless va, dans un premier temps
vérifier la présence de newuidmap/newgidmap, ainsi que la capacité
du noyau à créer des namespaces.
Le script vérifie également que l’utilisateur dispose d’une plage d’UID
et de GID supplémentaires dans
/etc/subuid et
/etc/subgid.
Par exemple :
alice:100000:65536
Ce mappage est ensuite utilisé par Docker pour réaliser le mapping entre les utilisateurs dans les conteneurs et celles de l’hôte.
XDG_RUNTIME_DIR et socket
Docker en mode Rootless utilise XDG_RUNTIME_DIR pour placer son socket
($XDG_RUNTIME_DIR/docker.sock).
En mode systemd, le script attend que ce répertoire soit correctement fourni par la session utilisateur.
Le daemon Docker en mode rootless ne communique pas avec le socket
Docker qu’on retrouve classiquement (/var/run/docker.sock),mais avec
un socket spécifique à l’utilisateurice.
Configurer systemd en mode utilisateur
Lorsque systemd --user est disponible, le script crée une unité
spécifique à l’utilisateurice : ~/.config/systemd/user/docker.service
Cette unité lance dockerd-rootless.sh pour initier le daemon de
l’utilisateurice (et non directement dockerd).
C’est ce qui va permettre, entre autre de mettre en place les namespaces nécessaires au fonctionnement en mode rootless.
L’unité est également définie avec la paramètre Delegate=yes. Cette
option permet à Docker de gérer les ressources et cgroups de ses propres
processus.
Et finalement, pour permettre à notre service de s’exécuter, même
lorsque utilisateurice est déconnecté, le script de configuration va
activer le mode
lingering :
sudo loginctl enable-linger alice
Cette config permet à systemd --user de fonctionner indépendamment
d’une session interactive.
Client Docker
Enfin, le script crée un contexte Docker appelé rootless qui pointe vers
la socket de l’utilisatueirce : unix://$XDG_RUNTIME_DIR/docker.sock,
et l’active.
Ainsi, la commande docker communique par défaut avec le daemon de
l’utilisateurice, et ce sans sudo ou sans qu’iel appartienne à un
groupe spécifique (exemple: docker).