Exécution de unshare -m
donne au processus appelant une copie privée de son espace de noms de montage et annule également le partage des 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 un 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 sous la forme,
tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0
Maintenant, j'ai également effectué les commandes suivantes.
cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls - lFa
La sortie du ls
la commande 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 problème dans tout cela ? Pourquoi devrais-je le faire ?
J'ouvre un autre terminal maintenant (terminal 2 ) et exécutez 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 hello
et helloagain
ne 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.
À partir de la page de manuel de unshare
,
mount namespace Monter et démonter des systèmes de fichiers n'affectera 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-rslaveafter unshare--mount pour s'assurer que les points de montage dans le nouvel espace de noms ne sont vraiment pas partagés de l'espace de noms parental.
La mémoire utilisée pour l'espace de noms est VFS qui provient du noyau. Et - si nous le configurons correctement en premier lieu - nous pouvons créer des environnements virtuels entiers dans lesquels nous sommes l'utilisateur root sans autorisations root.
Références :
L'exemple est encadré en utilisant les détails de ce billet de blog. En outre, 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.
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 !