一个理想的最低特权进程应该能够对文件系统上的数据进行只读访问,文件系统本身是只读的。因此,这就是情况
root@linux# ###(1) filesystem is untrusted + readonly
root@linux# grep untrusted_ro_fs /proc/mounts
/dev/sdb1 /mnt/untrusted_ro_fs ext4 ro 0 0
root@linux# ###(2) no read permissions for (o)thers for /mnt/untrusted_ro_fs/root
root@linux# ls -ld /mnt/untrusted_ro_fs/root
drwxr-x--- 1 root root 1138 Jul 3 21:13 /mnt/untrusted_ro_fs/root
root@linux# ###(3a) unpriviledge process ls (run with uid=9999 and gid=9999) no read access
root@linux# setpriv --reuid=9999 --regid=9999 --clear-groups ls /mnt/untrusted_ro_fs/root
ls: cannot open directory '/root': Permission denied
root@linux# ###(3b) unpriviledge process cat (run with uid=9999 and gid=9999) no read access
root@linux# setpriv --reuid=9999 --regid=9999 --clear-groups cat /mnt/untrusted_ro_fs/root/file
cat: /mtn/untrusted_ro_fs/root/file: Permission denied
root@linux# ###(4) file permission change fails on ro filesystem
root@linux# chmod a+rx /mnt/untrusted_ro_fs/root/
chmod: changing permissions of '/mnt/untrusted_ro_fs/root/': Read-only file system
我寻求如何完成上述读取访问(3a + 3b)的答案。这是我想出的途径。理想的答案是 a) 提供替代解决方案或 b) 详细说明所提供的解决方案:
a) “守护进程式特权下降”:以 root 身份打开文件描述符,然后
setuid
在进程内部打开文件描述符。b) “使用 FIFO”,这似乎仅有助于 (3b)
root@linux# mkfifo /access_to_root_file.fifo
root@linux# chown root:9999 /access_to_root_file.fifo
root@linux# chmod 0640 /access_to_root_file.fifo
root@linux# cat /mnt/untrusted_ro_fs/root/file > /access_to_root_file.fifo &
root@linux# setpriv --reuid=9999 --regid=9999 --clear-groups cat /access_to_root_file.fifo
c)“覆盖”
root@linux# mkdir /mnt/upper /mnt/work /mnt/merged
root@linux# mount -t overlay overlay -o lowerdir=/mnt/untrusted_ro_fs,upperdir=/mnt/upper,workdir=/mnt/work /mnt/merged
root@linux# chmod a+rx /mnt/merged/root
root@linux# setpriv --reuid=9999 --regid=9999 --clear-groups ls /mnt/merged/root &>/dev/null && echo SUCCESS-ls
SUCCESS
root@linux# chmod a+rx /mnt/merged/root/file
root@linux# setpriv --reuid=9999 --regid=9999 --clear-groups cat /mnt/merged/root/file &>/dev/null && echo SUCCESS-cat
SUCCESS
d) “虚拟化”(即 kvv + qemu),其中为虚拟机设置对不受信任文件系统的块设备的只读访问。
答案1
对我来说最自然的方法是创建具有不同访问规则的文件系统的另一个视图,如下所示挂载具有特定用户读/写访问权限的设备。和绑定文件系统:
mkdir -m 700 /mnt/permissive_view
chown 9999:9999 /mnt/permissive_view
bindfs -r -M 9999 /mnt/untrusted_ro_fs /mnt/permissive_view
然后在 下有 9999 个访问文件/mnt/permissive_view
。
该选项-M 9999
使用户 9999 将自己视为所有文件的所有者。根据您的具体用例,您可能需要不同的映射,例如-u 9999
(使所有用户将 9999 视为所有者)或--map=0/9999
(使 9999 仅成为 root 拥有的文件的表面所有者)。