User Namespace
Informations de base
Un espace utilisateur est une fonctionnalité du noyau Linux qui fournit une isolation des mappings d'identifiants d'utilisateur et de groupe, permettant à chaque espace utilisateur d'avoir son propre ensemble d'identifiants d'utilisateur et de groupe. Cette isolation permet aux processus s'exécutant dans des espaces utilisateurs différents d'avoir des privilèges et une propriété différents, même s'ils partagent les mêmes identifiants d'utilisateur et de groupe numériquement.
Les espaces utilisateurs sont particulièrement utiles dans la conteneurisation, où chaque conteneur devrait avoir son propre ensemble indépendant d'identifiants d'utilisateur et de groupe, permettant une meilleure sécurité et isolation entre les conteneurs et le système hôte.
Comment cela fonctionne :
Lorsqu'un nouvel espace utilisateur est créé, il commence avec un ensemble vide de mappings d'identifiants d'utilisateur et de groupe. Cela signifie que tout processus s'exécutant dans le nouvel espace utilisateur n'aura initialement aucun privilège en dehors de l'espace.
Les mappings d'identifiants peuvent être établis entre les identifiants d'utilisateur et de groupe dans le nouvel espace et ceux dans l'espace parent (ou hôte). Cela permet aux processus dans le nouvel espace d'avoir des privilèges et une propriété correspondant aux identifiants d'utilisateur et de groupe dans l'espace parent. Cependant, les mappings d'identifiants peuvent être restreints à des plages spécifiques et des sous-ensembles d'identifiants, permettant un contrôle précis sur les privilèges accordés aux processus dans le nouvel espace.
À l'intérieur d'un espace utilisateur, les processus peuvent avoir des privilèges root complets (UID 0) pour les opérations à l'intérieur de l'espace, tout en ayant toujours des privilèges limités à l'extérieur de l'espace. Cela permet aux conteneurs de s'exécuter avec des capacités similaires à root dans leur propre espace sans avoir des privilèges root complets sur le système hôte.
Les processus peuvent se déplacer entre les espaces en utilisant l'appel système
setns()
ou créer de nouveaux espaces en utilisant les appels systèmeunshare()
ouclone()
avec le drapeauCLONE_NEWUSER
. Lorsqu'un processus se déplace vers un nouvel espace ou en crée un, il commencera à utiliser les mappings d'identifiants d'utilisateur et de groupe associés à cet espace.
Laboratoire :
Créer différents espaces
CLI
En montant une nouvelle instance du système de fichiers /proc
en utilisant le paramètre --mount-proc
, vous vous assurez que le nouveau namespace de montage a une vue précise et isolée des informations de processus spécifiques à ce namespace.
Docker
Pour utiliser l'espace de noms utilisateur, le démon Docker doit être démarré avec --userns-remap=default
(Dans Ubuntu 14.04, cela peut être fait en modifiant /etc/default/docker
puis en exécutant sudo service docker restart
)
Vérifiez dans quel espace de noms se trouve votre processus
Il est possible de vérifier la carte des utilisateurs du conteneur Docker avec :
Ou depuis l'hôte avec :
Trouver tous les espaces de noms utilisateur
Entrer dans un espace de noms utilisateur
Aussi, vous ne pouvez entrer dans un autre espace de processus que si vous êtes root. Et vous ne pouvez pas entrer dans un autre espace de noms sans un descripteur pointant vers celui-ci (comme /proc/self/ns/user
).
Créer un nouveau User namespace (avec des mappages)
Récupération des capacités
Dans le cas des espaces de noms utilisateur, lorsqu'un nouvel espace de noms utilisateur est créé, le processus qui entre dans l'espace de noms se voit accorder un ensemble complet de capacités au sein de cet espace de noms. Ces capacités permettent au processus d'effectuer des opérations privilégiées telles que le montage de systèmes de fichiers, la création de périphériques ou le changement de propriétaire de fichiers, mais uniquement dans le contexte de son espace de noms utilisateur.
Par exemple, lorsque vous avez la capacité CAP_SYS_ADMIN
dans un espace de noms utilisateur, vous pouvez effectuer des opérations qui nécessitent généralement cette capacité, comme le montage de systèmes de fichiers, mais uniquement dans le contexte de votre espace de noms utilisateur. Toutes les opérations que vous effectuez avec cette capacité n'affecteront pas le système hôte ou les autres espaces de noms.
Par conséquent, même si l'obtention d'un nouveau processus à l'intérieur d'un nouvel espace de noms utilisateur vous redonnera toutes les capacités (CapEff: 000001ffffffffff), vous ne pouvez en réalité utiliser que celles liées à l'espace de noms (comme le montage) mais pas toutes. Ainsi, cela seul n'est pas suffisant pour s'échapper d'un conteneur Docker.
```bash # There are the syscalls that are filtered after changing User namespace with: unshare -UmCpf bash
Probando: 0x067 . . . Error Probando: 0x070 . . . Error Probando: 0x074 . . . Error Probando: 0x09b . . . Error Probando: 0x0a3 . . . Error Probando: 0x0a4 . . . Error Probando: 0x0a7 . . . Error Probando: 0x0a8 . . . Error Probando: 0x0aa . . . Error Probando: 0x0ab . . . Error Probando: 0x0af . . . Error Probando: 0x0b0 . . . Error Probando: 0x0f6 . . . Error Probando: 0x12c . . . Error Probando: 0x130 . . . Error Probando: 0x139 . . . Error Probando: 0x140 . . . Error Probando: 0x141 . . . Error Probando: 0x143 . . . Error
Last updated