GĂ©rer ses permissions avec Docker
1 septembre 2020
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.
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 đ