por proceso puntos de montaje del sistema de archivos privado

24

Estaba revisando el unsharecomando y de acuerdo con su página de manual,

   unshare - run program with some namespaces unshared from parent

También veo que hay un tipo de espacio de nombres listado como,

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

¿Cuál es exactamente el propósito de este espacio de nombres de montaje ? Estoy tratando de entender este concepto con la ayuda de algún ejemplo.

Ramesh
fuente
@Gilles, gracias. Yo lo comprobaré. Mientras tanto, avíseme si es necesario agregar algo más en la respuesta.
Ramesh

Respuestas:

29

La ejecución unshare -mle da al proceso de llamada una copia privada de su espacio de nombres de montaje, y también comparte los atributos del sistema de archivos para que ya no comparta su directorio raíz, el directorio actual o los atributos de umask con ningún otro proceso.

Entonces, ¿qué dice el párrafo anterior? Probemos y comprendamos con un ejemplo simple.

Terminal 1:

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, hice los siguientes comandos también.

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

La salida del lscomando 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 gran problema al hacer todo esto? ¿Por qué debería hacerlo?

Abro otra terminal ahora ( terminal 2 ) y hago los siguientes comandos.

cd /tmp/tmp.7KtrAsd9lx
ls - lFa

El resultado es el 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 helloy helloagainno son visibles e incluso inicié sesión como root para verificar estos archivos. Entonces, la ventaja es que esta característica nos permite crear un sistema de archivos temporal privado que incluso otros procesos propiedad de root no pueden ver ni navegar.

Desde la página de manual de unshare,

montar el espacio de nombres El montaje y desmontaje de los sistemas de archivos no afectará al resto del sistema (indicador CLONE_NEWNS), excepto para los sistemas de archivos que están explícitamente marcados como compartidos (con mount --make-shared; consulte / proc / self / mountinfo para los indicadores compartidos).

Se recomienda usar mount --make-rprivate o mount --make-rslave después de unshare --mount para asegurarse de que los puntos de montaje en el nuevo espacio de nombres realmente no se compartan desde el espacio de nombres parental.

La memoria que se utiliza para el espacio de nombres es VFS, que proviene del núcleo. Y, si lo configuramos en primer lugar, podemos crear entornos virtuales completos en los que somos el usuario root sin permisos de root.

Referencias

El ejemplo se enmarca utilizando 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í .

Ramesh
fuente
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.Y en comparación con chroot, los chrootarchivos son visibles para otros. Esto es sorprendente, y esa oración probablemente debería estar en la parte superior de la respuesta. + 1ed.
Sergiy Kolodyazhnyy
1
¡Nada escapa a la raíz! Utilizando nsenterpuede ingresar el espacio de nombres y ver los archivos temporales. Suponiendo que solo una no compartida (la que posee el tempdir), entonces sudo nsenter -t $(pgrep -P $(ps aux | grep unshare | grep -v grep | awk '{print $2}')) -m -ppermitirá que se vea el contenido
earcam
2

Si tiene instalado bubblewrap 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 ello!

VasyaNovikov
fuente