virli/tutorial/4/userns.md

3.4 KiB

\newpage

Le namespace user

Introduction

Le namespace user est plutôt pratiquxe car il permet de virtualiser la liste et les droits des utilisateurs.

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.

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 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).