From 330199cf247c87ad3b536cff7ecdbad232e4bc4a Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Thu, 20 Oct 2016 04:52:47 +0200 Subject: [PATCH] Userns done --- tutorial/4/userns.md | 96 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 93 insertions(+), 3 deletions(-) diff --git a/tutorial/4/userns.md b/tutorial/4/userns.md index f3c269e..4626029 100644 --- a/tutorial/4/userns.md +++ b/tutorial/4/userns.md @@ -5,11 +5,101 @@ Le *namespace* `user` ## Introduction -## mapping inside/outside users/groups +Le *namespace* `user` est plutôt pratiquxe car il permet de virtualiser la +liste et les droits des utilisateurs. -## l'utilisateur -1 : nobody +Par exemple, on va pouvoir entrer dans un conteneur en tant que +super-utilisateur à partir d'un compte d'un simple utilisateur. Il nous sera +alors possible d'effectuer toutes les actions privilégiées dont nous pourrions +avoir besoin à l'intérieur de cet espace de noms, sans que cela ne réduise la +sécurité des composants à l'extérieur de cet espace. -## blabla sur le comportement vis-à-vis des autres namespaces + +## Comportement vis-à-vis des autres *namespaces* + +Alors qu'il est normalement nécessaire d'avoir des privilèges pour créer de +nouveaux espaces de noms, en commençant par demander un *namespace* +utilisateurs, on obtient les privilèges requis pour créer tous les autres types +de *namespaces*. + +Grâce à cette technique, il est possible de lancer des conteneurs en tant que +simple utilisateur ; le projet [Singularity](http://singularity.lbl.gov/) +repose entièrement sur cela. + + +## Correspondance des utilisateurs et des groupes + +Comme pour les autres espaces de noms, le *namespace* `user` permet de ne +garder dans le nouvel espace, que les utilisateurs et les groupes utiles au +processus, en les renumérotant si besoin au passage. + + +### l'utilisateur -1 : *nobody* + +Lorsque l'on arrive dans un nouvel espace, aucun utilisateur ni groupe n'est +défini. Dans cette situation, tous les identifiants d'utilisateur et de groupe, +renvoyés par le noyau est -1 ; valeur qui correspond en toute circonstance à +l'utilisateur *nobody* et au groupe *nogroup*. + + +### `uid_map` et `gid_map` + +#### `uid_map` + +Pour établir la correspondance, une fois que l'on a créé le nouveau +*namespace*, ces deux fichiers, accessibles dans `/proc/self/`, peuvent être +écrit une fois. + +Sur chaque ligne, on doit indiquer : + +- L'identifiant marquant le début de la plage d'utilisateurs, pour le processus + en question. +- L'identifiant marquant le début de la plage d'utilisateurs, pour le processus + affichant le fichier. +- La taille de la page. + + +Par exemple, le *namespace* `user` initial défini le correspondance suivante : + +``` + 0 0 4294967295 +``` + +Cela signifie que les utilisateurs dont l'identifiant court de 0 à -2 inclu, +dans cet espace de noms, correspond aux utilisateurs allant de 0 à -1 inclu, +pour le processus affichant ce fichier. + +Lorsque l'on crée un *namespace* `user`, généralement, la correspondance vaut : + +``` + 0 1000 1 +``` + +Dans cette situation, on comprend que notre processus considère que +l'utilisateur root, dans le conteneur équivaut à l'utilisateur 1000 hors de +l'espace de noms. + + +#### `gid_map` + +Le principe est identique pour ce fichier, mais agit sur les correspondances +des groupes au lieu des utilisateurs. + + +## Utilisation de l'espace de noms + +```shell +42sh$ unshare --mount --pid --mount-proc --fork --net --user --map-root-user /bin/bash +``` + +Un `capsh --print` nous montre que l'on est bien root et que l'on possède +toutes les capabilities. Cependant, cela ne signifie pas que l'on a tous les +droits sur le système ; il y a plusieurs niveau de validation qui entrent en +jeu. L'idée étant que l'on a été désigné root dans son conteneur, on devrait +pouvoir y faire ce que l'on veut, tant que l'on agit pas en dehors. ## Aller plus loin + +N'hésitez pas à jeter un œil à la page de manuel consacré à ce *namespace* : +`user_namespaces(7)`.