In esecuzione unshare -m
fornisce al processo chiamante una copia privata del suo spazio dei nomi di montaggio e annulla anche la condivisione degli attributi del file system in modo che non condivida più la sua directory principale, la directory corrente o gli attributi umask con qualsiasi altro processo.
Quindi cosa dice il paragrafo precedente? Cerchiamo di capire usando un semplice esempio.
Terminale 1:
Eseguo i comandi seguenti nel primo terminale.
#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
L'ultimo comando mi dà l'output come,
tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0
Ora, ho eseguito anche i seguenti comandi.
cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls - lFa
L'output di ls
comando è,
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
Allora qual è il grosso problema nel fare tutto questo? Perché dovrei farlo?
Apro un altro terminale ora (terminale 2 ) ed eseguire i seguenti comandi.
cd /tmp/tmp.7KtrAsd9lx
ls - lFa
L'output è il seguente.
ls -lFa
total 8
drwx------ 2 root root 4096 Sep 3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep 3 22:22 ../
I file hello
e helloagain
non sono visibili e ho anche effettuato l'accesso come root per controllare questi file. Quindi il vantaggio è che questa funzione ci consente di creare un filesystem temporaneo privato che nemmeno altri processi di proprietà di root non possono vedere o sfogliare.
Dalla pagina man di unshare
,
mount namespace Il montaggio e lo smontaggio dei filesystem non influenzerà il resto del sistema (flag CLONE_NEWNS), ad eccezione dei filesystem che sono esplicitamente contrassegnati come condivisi (con mount--make-shared; vedi /proc/self/mountinfo per i flag condivisi).
Si consiglia di utilizzare mount --make-rprivate o mount --make-rslaveafter unshare--mount per assicurarsi che i punti di montaggio nel nuovo spazio dei nomi non siano realmente condivisi dallo spazio dei nomi principale.
La memoria utilizzata per lo spazio dei nomi è VFS che proviene dal kernel. E - se lo configuriamo correttamente in primo luogo - possiamo creare interi ambienti virtuali in cui siamo l'utente root senza i permessi di root.
Riferimenti:
L'esempio è incorniciato utilizzando i dettagli di questo post sul blog. Inoltre, le citazioni di questa risposta provengono da questa meravigliosa spiegazione di Mike. Un'altra meravigliosa lettura al riguardo può essere trovata dalla risposta da qui.
Se hai installato il pluriball sul tuo sistema, puoi farlo facilmente in un solo passaggio:
bwrap --dev-bind / / --tmpfs /tmp bash
Nell'esempio precedente, la bash interna avrà la propria vista su /tmp.
Soluzione ispirata alla risposta di @Ramesh - grazie!