Gérer ses permissions avec Docker
1 septembre 2020
Table des matières
Vocabulaire
Tout d'abord soyons d'accord sur les mots :
- L'hôte est le système d'exploitation de la machine, celui qui fait tourner Docker lui-même
- Nous utiliserons conteneur pour se référer à ce qui est exécuté dans l'univers de Docker
- Les user namespaces, que j'appellerai subuids, sont une fonctionnalité native Unix pour faire correspondre les ids d'utilisateurs système vers une page d'utilisateurs donnée.
L'article décrit comment utiliser les user namespaces (subuids) dans un environnement Unix pour réserver une plage d'utilisateurs au daemon Docker. Il est probable que Docker for Mac supporte cette fonctionnalité.
Motivation
Sur l'hôte, sans configuration donnée, les fichiers manipulés par Docker appartiennent au même utilisateur que celui du conteneur. Ce n'est pas rassurant dans le sens où le daemon Docker tourne en root
par défaut et que les conteneurs ne sont pas tenus de s'exécuter en tant que l'utilisateur qui leur a été donné en configuration.
Exemple : les images postgres
et mysql
écrivent d'elles-mêmes une partie de leurs fichiers avec les les utilisateurs de PostgreSQL et MySQL.
Pour éviter ce problème, nous allons indiquer au daemon Docker à quels utilisateurs hôte correspondent tous les utilisateurs des conteneurs.
Mise en place
Configuration hôte impactée :
/etc/subuid
- configuration des mappings utilisateur hôte <-> conteneur/etc/subgid
- configuration des mappings groupe hôte <-> conteneur/etc/docker/daemon.json
- configuration du daemon Docker
Selon moi, c'est avantageux de configurer différemment ces mappings sur les machines des développeurs et en CI/production. En effet : autant tirer profit de cette flexibilité pour développer confortablement tout en gardant la production sous contrôle.
Mappings de dev
En mappant le root
des conteneurs vers ton utilisateur hôte, tu peux simplement profiter d'une transparence de permissions par défaut. Plus de problèmes avec les volumes générés en root
hôte puis crashant l'exécution à cause de la mauvaise permission !
Pour ma part, je map simplement root
vers mon user hôte puis tous les autres uids 1+ vers 100001+ sur l'hôte.
La seule chose à confirmer : l'id de ton utilisateur hôte. C'est souvent 1000 et c'est vérifiable en exécutant id -u
.
/etc/subuid
dockremap:1000:1
dockremap:100001:65536
Explication
Un mapping nommé dockremap
est créé :
- 1e ligne : assigne 1 utilisateur (de conteneur pour nous) vers l'uid 1000. Ce 1e utilisateur est l'utilisateur 0, donc
root
. - 2e ligne : assigne les 65536 prochains utilisateurs vers la plage commençant par 100001, donc vers 100001-165536. Par exemple, l'utilisateur conteneur 66 sera manipulé sur l'hôte comme étant l'utilisateur 100066.
Je pense qu'appliquer le même principe pour les groupes est tout aussi profitable : la transparence est totale. On peut vérifier son gid
avec id -g
.
/etc/subgid
dockremap:1000:1
dockremap:100001:65536
/etc/docker/daemon.json
{
"userns-remap": "dockremap"
}
N'oublie pas de redémarrer le daemon docker pour que cela prenne effet 😉
sudo service docker restart
Mappings de CI/production
En production, la configuration dépend davantage des permissions que tu veux donner à tes conteneurs. On est davantage sur des problématiques de sécurité que de praticité.
Il est possible d'appliquer le même type de configuration que précédemment à condition de bien connaître les conséquences du mapping, en particulier pour l'utilisateur 0.
Problèmes et trucs à savoir
Il est possible de mapper plusieurs utilisateurs spécifiques conteneur vers des utilisateurs spécifiques hôte. Par exemple :
dockremap:1000:1
dockremap:100001:65
dockremap:666:1
dockremap:100067:65469
Ce qui peut se lire : map 0 conteneur vers 1000 hôte, map les 65 utilisateurs suivants sur la plage hôte commençant par 100001, map le suivant (66) vers 666 sur l'hôte, map le reste sur la plage hôte commençant par 100067.
J'espère que cet article t'aura éclairé sur l'utilisation des user namespaces pour gérer ses permissions Docker. Il s'agit d'un retour d'expérience personnelle et de mes avis sur le sujet. N'hésite pas à explorer par toi-même, faire ta propre configuration et me la partager 🙂