virli/tutorial/4/userns.md

117 lines
3.7 KiB
Markdown
Raw Normal View History

2016-10-19 03:24:05 +00:00
\newpage
2017-11-09 00:30:41 +00:00
Le *namespace* `user` {#user-ns}
2016-10-19 03:24:05 +00:00
=====================
## Introduction
2017-11-09 00:30:41 +00:00
L'espace de noms `user` est plutôt pratique car il permet de virtualiser la
2016-10-20 02:52:47 +00:00
liste et les droits des utilisateurs.
2016-10-19 03:24:05 +00:00
2016-10-20 02:52:47 +00:00
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.
2016-10-19 03:24:05 +00:00
2016-10-20 02:52:47 +00:00
## 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
2019-11-03 17:54:22 +00:00
simple utilisateur ; le projet [Singularity](https://sylabs.io/) repose
entièrement sur cela.
2016-10-20 02:52:47 +00:00
## 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
2017-11-09 00:30:41 +00:00
processus, en les renumérotant au passage si besoin.
2016-10-20 02:52:47 +00:00
2018-11-06 13:44:59 +00:00
### L'utilisateur -2 : *nobody*
2016-10-20 02:52:47 +00:00
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,
2018-11-06 13:44:59 +00:00
renvoyés par le noyau sont à -2 ; valeur qui correspond par convention à
2016-10-20 02:52:47 +00:00
l'utilisateur *nobody* et au groupe *nogroup*.
2018-11-06 13:44:59 +00:00
-1 étant réservé pour indiqué une erreur dans le retour d'une commande, ou la
non-modification d'un paramètres passé en argument d'une fonction.
2016-10-20 02:52:47 +00:00
### `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
2017-11-09 00:30:41 +00:00
écrits une fois.
2016-10-20 02:52:47 +00:00
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.
2018-11-06 13:44:59 +00:00
- La taille de la plage.
2016-10-20 02:52:47 +00:00
2017-11-09 00:30:41 +00:00
Par exemple, le *namespace* `user` initial défini la correspondance suivante :
2016-10-20 02:52:47 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2016-10-20 02:52:47 +00:00
```
42sh$ cat /proc/self/uid_map
0 0 4294967295
2016-10-20 02:52:47 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-20 02:52:47 +00:00
2017-11-09 00:30:41 +00:00
Cela signifie que les utilisateurs dont l'identifiant court de 0 à `MAX_INT -
2` inclu, dans cet espace de noms, correspondent aux utilisateurs allant de 0 à
`MAX_INT - 1` inclu, pour le processus affichant ce fichier.
2016-10-20 02:52:47 +00:00
Lorsque l'on crée un *namespace* `user`, généralement, la correspondance vaut :
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2016-10-20 02:52:47 +00:00
```
42sh$ cat /proc/self/uid_map
0 1000 1
2016-10-20 02:52:47 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-20 02:52:47 +00:00
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
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
42sh$ unshare --mount --pid --mount-proc --fork --net --user --map-root-user /bin/bash
2016-10-20 02:52:47 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-10-20 02:52:47 +00:00
2017-11-09 00:30:41 +00:00
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 niveaux de validation qui entrent en
2016-10-20 02:52:47 +00:00
jeu. L'idée étant que l'on a été désigné root dans son conteneur, on devrait
2017-11-09 00:30:41 +00:00
pouvoir y faire ce que l'on veut, tant que l'on n'agit pas en dehors.
2016-10-19 03:24:05 +00:00
## Aller plus loin {-}
2016-10-20 02:52:47 +00:00
2017-11-09 00:30:41 +00:00
N'hésitez pas à jeter un œil à la page du manuel consacré à ce *namespace* :
2016-10-20 02:52:47 +00:00
`user_namespaces(7)`.