por pontos de montagem do sistema de arquivos privados do processo

24

Eu estava verificando o comando unshare e de acordo com a página de manual dele,

   unshare - run program with some namespaces unshared from parent

Também vejo que há um tipo de namespace listado como

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

Qual é exatamente o objetivo deste espaço de nomes de montagem ? Estou tentando entender esse conceito com a ajuda de algum exemplo.

    
por Ramesh 04.09.2014 / 05:39

2 respostas

26

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 .

    
por 04.09.2014 / 05:39
2

Se você tiver bubblewrap instalado em seu sistema, poderá fazê-lo facilmente em uma única etapa:

bwrap --dev-bind / / --tmpfs /tmp bash

No exemplo acima, o bash interno terá sua própria visão em / tmp.

Solução inspirada pela resposta do @Ramesh-s - obrigado por isso!

    
por 24.09.2018 / 15:00