A execução de unshare -m
fornece ao processo de chamada uma cópia particular de seu namespace de montagem e também desclassifica atributos do sistema de arquivos para que não compartilhe mais seu diretório raiz, diretório atual ou atributos umask com qualquer outro processo.
Então, o que o parágrafo acima diz? Vamos tentar entender usando um exemplo simples.
Terminal 1:
Eu faço os comandos abaixo no primeiro 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
O último comando me dá a saída como
tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0
Agora, também fiz os seguintes comandos.
cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls - lFa
A saída do comando ls
é
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
Então, qual é o grande problema em fazer tudo isso? Por que devo fazer isso?
Eu abro outro terminal agora ( terminal 2 ) e faço os comandos abaixo.
cd /tmp/tmp.7KtrAsd9lx
ls - lFa
A saída é como abaixo.
ls -lFa
total 8
drwx------ 2 root root 4096 Sep 3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep 3 22:22 ../
Os arquivos hello
e helloagain
não estão visíveis e eu até me loguei como root para verificar esses arquivos. Portanto, a vantagem é que esse recurso possibilita a criação de um sistema de arquivos privado e temporário que nem mesmo outros processos de propriedade da raiz podem ver ou navegar.
Na página do manual de unshare
,
mount namespace Mounting and unmounting filesystems will not affect the rest of the system (CLONE_NEWNS flag), except for filesystems which are explicitly marked as shared (with mount --make-shared; see /proc/self/mountinfo for the shared flags).
It's recommended to use mount --make-rprivate or mount --make-rslave after unshare --mount to make sure that mountpoints in the new namespace are really unshared from the parental namespace.
A memória utilizada para o namespace é VFS, que é do kernel. E - se configurá-lo logo no início - podemos criar ambientes virtuais inteiros nos quais somos o usuário root sem permissões de root.
Referências:
O exemplo é enquadrado usando os detalhes de este post do blog . Além disso, as citações desta resposta são de esta maravilhosa explicação de Mike . Outra leitura maravilhosa sobre isso pode ser encontrada na resposta de aqui .