有没有办法将一个 linux 进程沙箱化到某个目录,并给这个进程独占的 rw 访问权限到这个目录?例如,创建一个临时工作目录,然后启动 e.g. python 或其他脚本工具,它只能在这个目录中写入,而不会限制它的太多功能。而且只有这个进程可以访问这个目录的读取(当然除了 super 用户)。
我需要这个来沙盒一个基本上允许用户运行任意代码的网络服务。我们目前在软件本身中进行授权,但最终所有进程都以同一个 linux 用户身份运行。我们需要一种方法,用户不能对系统造成任何伤害,但确实有一个临时的私有(private)工作目录来写入和读取文件,该目录不受 Web 服务的其他用户的影响。
文件权限基于所有者/组而不是进程,因此由同一用户运行的多个程序将能够访问拥有的目录。但是,如果您在运行之前为每个进程创建一个临时目录,然后 chroot()这样一来,任何进程都无法离开其 chroot jail 来访问其他目录。
基本概念是,就进程而言,临时目录成为目录树的顶部。该过程不知道,也不能更改为高于它的任何内容。否则,它可以在其沙箱中读取/写入、创建/删除其核心内容。
例如:
/rundir
/rundir/temp1 <-- process 1 chroot jailed here, can't go above
/rundir/temp2 <-- process 2 chroot jailed here, can't go above
另见“man 8 chroot”。