2017-11-09 00:30:41 +00:00
|
|
|
|
Le *namespace* `user` {#user-ns}
|
2021-10-31 19:51:17 +00:00
|
|
|
|
---------------------
|
2016-10-19 03:24:05 +00:00
|
|
|
|
|
2021-10-31 19:51:17 +00:00
|
|
|
|
### Introduction
|
2016-10-19 03:24:05 +00:00
|
|
|
|
|
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
|
|
|
|
|
2021-10-31 19:51:17 +00:00
|
|
|
|
### Comportement vis-à-vis des autres *namespaces*
|
2016-10-20 02:52:47 +00:00
|
|
|
|
|
|
|
|
|
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*
|
2021-10-31 19:51:17 +00:00
|
|
|
|
utilisateur, on obtient les privilèges requis pour créer tous les autres types
|
2016-10-20 02:52:47 +00:00
|
|
|
|
de *namespaces*.
|
|
|
|
|
|
|
|
|
|
Grâce à cette technique, il est possible de lancer des conteneurs en tant que
|
2022-11-11 09:14:16 +00:00
|
|
|
|
simple utilisateur ; les projets [`podman`](https://podman.io/) et
|
|
|
|
|
[Singularity](https://sylabs.io/), ... reposent en grande partie sur cela.
|
2016-10-20 02:52:47 +00:00
|
|
|
|
|
|
|
|
|
|
2021-10-31 19:51:17 +00:00
|
|
|
|
### Correspondance des utilisateurs et des groupes
|
2016-10-20 02:52:47 +00:00
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
2022-11-11 09:14:16 +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,
|
2022-02-24 19:43:43 +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*.
|
|
|
|
|
|
2021-10-31 19:51:17 +00:00
|
|
|
|
-1 étant réservé pour indiquer une erreur dans le retour d'une commande, ou la
|
|
|
|
|
non-modification d'un paramètre passé en argument d'une fonction.
|
2018-11-06 13:44:59 +00:00
|
|
|
|
|
2016-10-20 02:52:47 +00:00
|
|
|
|
|
2022-11-11 09:14:16 +00:00
|
|
|
|
#### `uid_map` et `gid_map`\
|
2016-10-20 02:52:47 +00:00
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
2022-11-11 09:14:16 +00:00
|
|
|
|
##### `uid_map` {-}
|
|
|
|
|
\
|
2021-10-31 19:51:17 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Sur chaque ligne, on doit indiquer :
|
2016-10-20 02:52:47 +00:00
|
|
|
|
|
|
|
|
|
- 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
|
|
|
|
|
|
|
|
|
|
2022-02-24 19:43:43 +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
|
|
|
|
```
|
2018-11-16 01:38:41 +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 -
|
2021-10-31 19:51:17 +00:00
|
|
|
|
2` inclus, dans cet espace de noms, correspondent aux utilisateurs allant de 0 à
|
|
|
|
|
`MAX_INT - 1` inclus, pour le processus affichant ce fichier.
|
2016-10-20 02:52:47 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
Lorsque l'on crée un *namespace* `user`, généralement, la correspondance vaut :
|
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
|
|
|
|
```
|
2018-11-16 01:38:41 +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.
|
|
|
|
|
|
|
|
|
|
|
2022-11-11 09:14:16 +00:00
|
|
|
|
##### `gid_map` {-}
|
|
|
|
|
\
|
2016-10-20 02:52:47 +00:00
|
|
|
|
|
|
|
|
|
Le principe est identique pour ce fichier, mais agit sur les correspondances
|
|
|
|
|
des groupes au lieu des utilisateurs.
|
|
|
|
|
|
2022-11-11 09:14:16 +00:00
|
|
|
|
Il y a cependant un subtilité car il faut écrire la chaîne `deny` dans le
|
|
|
|
|
fichier `setgroups` avant de modifier `gid_map`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Utilisation basique de l'espace de noms
|
2016-10-20 02:52:47 +00:00
|
|
|
|
|
2022-11-11 09:14:16 +00:00
|
|
|
|
Avec `unshare(1)`, voici comment, en tant que simple utilisateur, se dissocier
|
|
|
|
|
de plusieurs *namespace*s en gardant un environnement cohérent, dans lequel on
|
|
|
|
|
devient le super-utilisateur :
|
2016-10-20 02:52:47 +00:00
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
|
<div lang="en-US">
|
2018-11-16 01:38:41 +00:00
|
|
|
|
```bash
|
2022-05-04 09:18:16 +00:00
|
|
|
|
42sh$ unshare --mount --pid --mount-proc --fork --net --user \
|
|
|
|
|
--map-root-user 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
|
2022-02-24 19:43:43 +00:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
2021-10-31 19:51:17 +00:00
|
|
|
|
### Aller plus loin {-}
|
2016-10-20 02:52:47 +00:00
|
|
|
|
|
2022-02-24 19:43:43 +00:00
|
|
|
|
N'hésitez pas à jeter un œil à la page du manuel consacrée à ce *namespace* :
|
2016-10-20 02:52:47 +00:00
|
|
|
|
`user_namespaces(7)`.
|