par processus points de montage de système de fichiers privés

24

Je vérifiais la unsharecommande et selon sa page de manuel,

   unshare - run program with some namespaces unshared from parent

Je vois également un type d'espace de noms répertorié comme,

 mount namespace
              mounting and unmounting filesystems will not affect rest of the system.

Quel est exactement le but de cet espace de noms de montage ? J'essaie de comprendre ce concept à l'aide d'un exemple.

Ramesh
la source
1
Voir aussi kernel: Namespaces support et les articles de Michael Kerrisk sur les namespaces sur LWN .
Gilles 'SO- arrête d'être méchant'
@ Gilles, merci. Je vais vérifier cela. En attendant, faites-moi savoir si quelque chose d'autre doit être ajouté dans la réponse.
Ramesh

Réponses:

29

L'exécution unshare -mdonne au processus appelant une copie privée de son espace de noms de montage et dissocie également les attributs du système de fichiers afin qu'il ne partage plus son répertoire racine, son répertoire actuel ou ses attributs umask avec aucun autre processus.

Alors, que dit le paragraphe ci-dessus? Essayons de comprendre à l'aide d'un exemple simple.

Terminal 1:

Je fais les commandes ci-dessous dans le premier terminal.

#Creating a new process
unshare -m /bin/bash
#creating a new mount point
secret_dir=`mktemp -d --tmpdir=/tmp`
#creating a new mount point for the above created directory. 
mount -n -o size=1m -t tmpfs tmpfs $secret_dir
#checking the available mount points. 
grep /tmp /proc/mounts 

La dernière commande me donne la sortie comme,

tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0

Maintenant, j'ai également fait les commandes suivantes.

cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls - lFa

La sortie de la lscommande est,

ls -lFa
total 4
drwxrwxrwt   2 root root   80 Sep  3 22:23 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../
-rw-r--r--   1 root root    0 Sep  3 22:23 hello
-rw-r--r--   1 root root    0 Sep  3 22:23 helloagain

Alors, quel est le gros problème en faisant tout cela? Pourquoi devrais-je le faire?

J'ouvre maintenant un autre terminal ( terminal 2 ) et exécute les commandes ci-dessous.

cd /tmp/tmp.7KtrAsd9lx
ls - lFa

La sortie est comme ci-dessous.

ls -lFa
total 8
drwx------   2 root root 4096 Sep  3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../

Les fichiers helloet helloagainne sont pas visibles et je me suis même connecté en tant que root pour vérifier ces fichiers. L'avantage est donc que cette fonctionnalité nous permet de créer un système de fichiers temporaire privé que même les autres processus appartenant à la racine ne peuvent pas voir ou parcourir.

Depuis la page de manuel de unshare,

mount namespace Le montage et le démontage de systèmes de fichiers n'affecteront pas le reste du système (indicateur CLONE_NEWNS), à l'exception des systèmes de fichiers qui sont explicitement marqués comme partagés (avec mount --make-shared; voir / proc / self / mountinfo pour les indicateurs partagés).

Il est recommandé d'utiliser mount --make-rprivate ou mount --make-rslave après unshare --mount pour vous assurer que les points de montage dans le nouvel espace de noms ne sont pas vraiment partagés de l'espace de noms parent.

La mémoire utilisée pour l'espace de noms est VFS qui provient du noyau. Et - si nous le configurons en premier lieu - nous pouvons créer des environnements virtuels entiers dans lesquels nous sommes l'utilisateur root sans autorisations root.

Les références:

L'exemple est encadré à l'aide des détails de ce billet de blog . De plus, les citations de cette réponse proviennent de cette merveilleuse explication de Mike . Une autre lecture merveilleuse à ce sujet peut être trouvée dans la réponse d' ici .

Ramesh
la source
1
this feature makes it possible for us to create a private temporary filesystem that even other root-owned processes cannot see or browse through.Et par rapport à chroot, les chrootfichiers sont visibles par les autres. C'est incroyable, et cette phrase devrait probablement être comme en haut de la réponse. + 1ed.
Sergiy Kolodyazhnyy
1
Rien n'échappe à la racine! À l'aide de, nsentervous pouvez entrer l'espace de noms et afficher les fichiers temporaires. En supposant qu'un seul non-partage (celui qui possède le tempdir), alors sudo nsenter -t $(pgrep -P $(ps aux | grep unshare | grep -v grep | awk '{print $2}')) -m -ppermettra au contenu d'être visualisé
earcam
2

Si vous avez installé bubblewrap sur votre système, vous pouvez le faire facilement en une seule étape:

bwrap --dev-bind / / --tmpfs /tmp bash

Dans l'exemple ci-dessus, bash interne aura sa propre vue sur / tmp.

Solution inspirée de la réponse de @ Ramesh - merci pour cela!

VasyaNovikov
la source