Le labo de Nico

🔭 đŸŽ¶ đŸ•ș

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.

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 🙂