当root无权访问源目录时如何创建挂载--bind?

当root无权访问源目录时如何创建挂载--bind?

在尝试使用创建测试环境时,mount --bind我惊讶地发现它有时会因权限错误而失败,因为root无法访问源目录。这似乎只影响 NFS 文件系统。

有没有办法访问无法访问mount --bind的目录root?也许直接通过索引节点号?

例子

我有一个普通vagrant:vagrant用户可以完全访问的 NFS 挂载:

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

...但root:root不能:

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

如果我尝试mount --bind失败:

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

NFS 挂载/tmp/nfs_mount由 提供localhost:/srv,如果我直接进入源文件系统,目录权限不会造成问题:

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

NFS 设置(以防万一):

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)

 环境

  • Ubuntu 16.04 (Xenial64)
  • Linux ubuntu-xenial 4.4.0-116-generic #140-Ubuntu SMP 2 月 12 日星期一 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

答案1

请注意,在 中进行任何挂载/tmp都是危险的,因为某些清理任务可能会突然决定在 中进行工作/tmp而不关心挂载点,从而擦除实际上不属于 的旧文件/tmp。也就是说,我将使用/tmpOP 中的示例。


方法一:

如果您完全控制 NFS 环境,只需将该no_root_squash选项添加到导出选项即可:这将防止 root 用户客户端被映射为服务器上的任何人并失去权限。


方法2:

否则,这是一个相对简单的解决方案,您正在寻找的解决方案,与访问仍在使用的已删除文件相同:使用 /proc

为简单起见,需要两个终端:

用户终端:

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

root 终端:root 可以获得对所需目录的引用,仍然不可读,但可安装:

# 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

就是这样。

相关内容