Ejecutando unshare -m
proporciona al proceso de llamada una copia privada de su espacio de nombres de montaje y también deja de compartir los atributos del sistema de archivos para que ya no comparta su directorio raíz, directorio actual o atributos umask con ningún otro proceso.
Entonces, ¿qué dice el párrafo anterior? Tratemos de entender usando un ejemplo simple.
Hago los siguientes comandos en la primera 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
El último comando me da la salida como,
tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0
Ahora, también hice los siguientes comandos.
cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls - lFa
La salida del ls
el comando es,
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
Entonces, ¿cuál es el problema de hacer todo esto? ¿Por qué debería hacerlo?
Abro otra terminal ahora (terminal 2 ) y haz los siguientes comandos.
cd /tmp/tmp.7KtrAsd9lx
ls - lFa
La salida es la siguiente.
ls -lFa
total 8
drwx------ 2 root root 4096 Sep 3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep 3 22:22 ../
Los archivos hello
y helloagain
no están visibles e incluso inicié sesión como root para verificar estos archivos. Entonces, la ventaja es que esta función nos permite crear un sistema de archivos temporal privado que incluso otros procesos de propiedad raíz no pueden ver o explorar.
Desde la página man de unshare
,
montar espacio de nombres Montar y desmontar sistemas de archivos no afectará al resto del sistema (indicador CLONE_NEWNS), a excepción de los sistemas de archivos que están explícitamente marcados como compartidos (con mount--make-shared; consulte /proc/self/mountinfo para conocer los indicadores compartidos).
Se recomienda usar mount --make-rprivate o mount --make-rslaveafter unshare--mount para asegurarse de que los puntos de montaje en el nuevo espacio de nombres realmente no se compartan con el espacio de nombres principal.
La memoria que se utiliza para el espacio de nombres es VFS, que es del núcleo. Y, si lo configuramos correctamente en primer lugar, podemos crear entornos virtuales completos en los que somos el usuario raíz sin permisos de raíz.
Referencias:
El ejemplo se enmarca con los detalles de esta publicación de blog. Además, las citas de esta respuesta son de esta maravillosa explicación de Mike. Otra lectura maravillosa sobre esto se puede encontrar en la respuesta de aquí.
Si tiene Bubblewrap instalado en su sistema, puede hacerlo fácilmente en un solo paso:
bwrap --dev-bind / / --tmpfs /tmp bash
En el ejemplo anterior, bash interno tendrá su propia vista en /tmp.
Solución inspirada en la respuesta de @Ramesh-s - ¡gracias por ella!