我希望一个进程(及其所有潜在的子进程)能够根据我的用户配置文件读取文件系统,但我想将该进程的写入权限限制为仅一组预先选择的文件夹(可能只有一个)。
chroot
似乎行动过于宽泛。将进程限制在文件系统的特定部分,这使得安装/bin
文件夹等的需要变得更加简单。我的进程应该能够像我启动的任何正常进程一样读取文件系统的内容。
我可以使用 docker 容器并安装一个卷,但这似乎有点过分:需要安装 docker、创建图像、启动其中的容器等...
有没有办法做类似的事情?:
restricted-exec --read-all --write-to /a/particular/path --write-to /another/particular/path my-executable -- --option-to-the-executable
某一些unveil
但由调用进程控制并且仅用于写访问。
答案1
您也许可以使用systemd
.它有许多控制文件系统访问的设置,例如ReadOnlyPaths
和ReadWritePaths
。
systemd-run
以下是使用仅具有写入权限的命令运行命令的快速示例/var/lib
。示例中touch
用于在多个目录中创建文件,但只有可写路径才能成功。
root@ubuntu:~# systemd-run --wait -p ProtectSystem=strict -p ProtectHome=read-only -p ReadWritePaths=/var/lib bash -c
'touch /etc/myfile /var/lib/myfile /var/cache/myfile /root/myfile /home/ubuntu/myfile'
Running as unit: run-u1008.service
Finished with result: exit-code
Main processes terminated with: code=exited/status=1
Service runtime: 44ms
root@ubuntu:~# ls -l {/etc/,/var/lib/,/var/cache/,/root/,/home/ubuntu/}myfile
ls: cannot access '/etc/myfile': No such file or directory
ls: cannot access '/var/cache/myfile': No such file or directory
ls: cannot access '/root/myfile': No such file or directory
ls: cannot access '/home/ubuntu/myfile': No such file or directory
-rw-r--r-- 1 root root 0 Mar 3 23:17 /var/lib/myfile
编辑
您可以使用选项以用户身份运行该命令-p User
。不幸的是,您需要 root 访问权限才能使用我的建议,因为您可以不是使用文件系统保护--user
(基于为什么不systemd-run --user
实施诸如此类的限制ProtectSystem
?)。
这是另一个简单的例子。这次该命令以ubuntu
用户身份运行。
root@ubuntu:~# install -o ubuntu -g ubuntu -d /tmp/{test,test2}
root@ubuntu:~# systemd-run --wait -p User=ubuntu -p ProtectSystem=strict -p ProtectHome=read-only -p ReadWritePaths=/tmp/test bash -c 'touch /tmp/test/myfile /tmp/test2/myfile /home/ubuntu/myfile'
Running as unit: run-u1043.service
Finished with result: exit-code
Main processes terminated with: code=exited/status=1
Service runtime: 55ms
root@ubuntu:~# ls -l /tmp/{test,test2}/myfile /home/ubuntu/myfile
ls: cannot access '/tmp/test2/myfile': No such file or directory
ls: cannot access '/home/ubuntu/myfile': No such file or directory
-rw-r--r-- 1 ubuntu ubuntu 0 Mar 5 17:37 /tmp/test/myfile
如果您对保护感兴趣/tmp
,那么您还可以考虑PrivateTmp
systemd 的功能。这只是可用于沙箱进程的更多 systemd 设置之一。
答案2
firejail
做的工作:
mkdir -p ~/test && firejail --read-only=/tmp --read-only=~/ --read-write=~/test/ touch ~/test/OK ~/KO /tmp/KO