Como criar uma montagem --bind quando a raiz não tem permissão para acessar o diretório de origem?

0

Ao tentar criar um ambiente de teste usando mount --bind , fiquei surpreso ao descobrir que às vezes falha com erros de permissão porque root não pode acessar o diretório de origem. Isso só parece afetar os sistemas de arquivos do NFS.

Existe uma maneira de mount --bind de um diretório que root não pode acessar? Talvez pelo número do inode diretamente?

Exemplo

Eu tenho uma montagem NFS que o usuário comum vagrant:vagrant pode acessar totalmente:

vagrant@ubuntu-xenial:/tmp$ find nfs_mount/ -ls
     4375      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/
   257090      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source
   257091      4 drwx------   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path
   257092      4 drwx------   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path/is
   257093      4 drwx------   2 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path/is/here

... mas root:root não pode:

vagrant@ubuntu-xenial:/tmp$ sudo find nfs_mount/ -ls
     4375      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/
   257090      4 drwxr-xr-x   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source
   257091      4 drwx------   3 vagrant  vagrant      4096 Mar 20 21:28 nfs_mount/source/path
find: ‘nfs_mount/source/path’: Permission denied

Se eu tentar mount --bind , ele falhará:

vagrant@ubuntu-xenial:/tmp$ mkdir /tmp/bindtarget

vagrant@ubuntu-xenial:/tmp$ sudo mount --bind /tmp/nfs_mount/source/path/is/here/ /tmp/bindtarget/
mount: mount /tmp/nfs_mount/source/path/is/here/ on /tmp/bindtarget failed: Permission denied

A montagem do NFS em /tmp/nfs_mount é fornecida por localhost:/srv e, se eu for diretamente para o sistema de arquivos de origem, as permissões do diretório não representam um problema:

vagrant@ubuntu-xenial:/tmp$ sudo mount --bind /srv/source/path/is/here/ /tmp/bindtarget/

vagrant@ubuntu-xenial:/tmp$ findmnt /tmp/bindtarget
TARGET          SOURCE                              FSTYPE OPTIONS
/tmp/bindtarget /dev/sda1[/srv/source/path/is/here] ext4   rw,relatime,data=ordered

Configuração do NFS, caso seja importante:

vagrant@ubuntu-xenial:/tmp$ showmount -e localhost
Export list for localhost:
/srv *

vagrant@ubuntu-xenial:/tmp$ cat /etc/exports
/srv/       *(rw,sync,no_subtree_check)

Ambiente

  • Ubuntu 16.04 (Xenial64)
  • Linux ubuntu-xenial 4.4.0-116-genérico # 140-Ubuntu SMP seg 12 de fev 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux
por RobM 20.03.2018 / 22:55

1 resposta

1

Por favor, note que fazer qualquer montagem em /tmp é perigoso, porque alguma tarefa de limpeza pode de repente decidir fazer seu trabalho em /tmp e não se importar com pontos de montagem, apagando arquivos antigos que não pertencem a /tmp . Dito isso, vou usar os exemplos /tmp do OP.

método 1:

Se você estiver no controle total do ambiente NFS, basta adicionar a opção no_root_squash às opções de exportação: isso evitará que o cliente usuário root seja mapeado como ninguém no servidor e perca direitos.

method2:

Senão, aqui está uma solução relativamente simples, a que você está procurando, na mesma linha que acessar um arquivo apagado ainda em uso: usando / proc

Por simplicidade aqui, requer dois terminais:

terminal do usuário:

vagrant@ubuntu-xenial:/tmp$ cd /tmp/nfs_mount/source/path/is/here/
vagrant@ubuntu-xenial:/tmp/nfs_mount/source/path/is/here$ echo $$
12345

terminal raiz: root pode obter uma referência ao diretório desejado, ainda ilegível, mas montável:

# ls -l /proc/12345/cwd
lrwxrwxrwx. 1 vagrant vagrant 0 Mar 21 01:18 /proc/12345/cwd -> /tmp/nfs_mount/source/path/is/here
# ls -l /proc/12345/cwd/
ls: cannot open directory '/proc/12345/cwd/': Permission denied

# mount --bind /proc/12345/cwd /tmp/bindtarget
# ls /tmp/bindtarget
ls: cannot open directory '/tmp/bindtarget': Permission denied

É isso.

    
por 21.03.2018 / 02:21