por processo pontos de montagem do sistema de arquivos privados

24

Eu estava verificando o unsharecomando e, de acordo com a página de manual,

   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 propósito deste espaço para nome de montagem ? Estou tentando entender esse conceito com a ajuda de algum exemplo.

Ramesh
fonte
@ Gilles, obrigado. Vou dar uma olhada. Enquanto isso, avise-me se algo mais precisar ser adicionado à resposta.
Ramesh

Respostas:

29

A execução unshare -mfornece ao processo de chamada uma cópia privada de seu namespace de montagem e também remove o compartilhamento de atributos do sistema de arquivos, para que ele não compartilhe mais seus atributos de diretório raiz, diretório atual ou umask com qualquer outro processo.

Então, o que diz o parágrafo acima? 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, eu fiz os seguintes comandos também.

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

A saída do lscomando é,

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 eu deveria fazer isso?

Abro outro terminal agora ( terminal 2 ) e faço os comandos abaixo.

cd /tmp/tmp.7KtrAsd9lx
ls - lFa

A saída é a seguinte.

ls -lFa
total 8
drwx------   2 root root 4096 Sep  3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../

Os arquivos helloe helloagainnão estão visíveis e eu até fiz login como root para verificar esses arquivos. Portanto, a vantagem é que esse recurso nos permite criar um sistema de arquivos temporário privado que mesmo outros processos de propriedade raiz não podem ver ou navegar.

Na página de manual de unshare,

espaço para nome mount Os sistemas de arquivos de montagem e desmontagem não afetarão o resto do sistema (sinalizador CLONE_NEWNS), exceto os sistemas de arquivos explicitamente marcados como compartilhados (com mount --make-shared; consulte / proc / self / mountinfo para os sinalizadores compartilhados).

É recomendável usar mount --make-rprivate ou mount --make-rslave após o compartilhamento - para garantir que os pontos de montagem no novo espaço para nome não sejam realmente compartilhados no espaço para nome dos pais.

A memória que está sendo utilizada para o namespace é o VFS, que é do kernel. E - se o configurarmos em primeiro lugar - podemos criar ambientes virtuais inteiros nos quais somos o usuário root sem permissões de root.

Referências:

O exemplo é estruturado usando os detalhes desta postagem do blog . Além disso, as citações desta resposta são desta maravilhosa explicação de Mike . Outra leitura maravilhosa sobre isso pode ser encontrada na resposta aqui .

Ramesh
fonte
11
this feature makes it possible for us to create a private temporary filesystem that even other root-owned processes cannot see or browse through.E em comparação com chroot, os chrootarquivos são visíveis para os outros. Isso é incrível, e essa frase provavelmente deve estar no topo da resposta. + 1ed.
Sergiy Kolodyazhnyy 12/09
11
Nada escapa à raiz! Usando nsentervocê pode inserir o espaço para nome e visualizar os arquivos temporários. Supondo que apenas um unshare (a uma possuir a tempdir), em seguida, sudo nsenter -t $(pgrep -P $(ps aux | grep unshare | grep -v grep | awk '{print $2}')) -m -pvai permitir que o conteúdo a ser visualizado
earcam
2

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

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

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

Solução inspirada na resposta da @ Ramesh-s - obrigado por isso!

VasyaNovikov
fonte