我想在 SELinux 沙箱中运行作为学生作业制作的程序(检查输出和行为,作为作业评分的第一部分,而不必非常仔细地检查是否有一些学生首先尝试做任何“有趣”的事情)。
大多数作业应该只读取输入并产生输出。有些可能会读取系统上的文件。然后我只希望它能够读取系统上的世界可读文件。
在某些方面工作得sandbox assignment.py
很好,其中沙箱来自 CentOS 7 中 SElinux 沙箱中的policycoreutils-python。然后,copy.py 无法写入文件,无法访问网络,以及其他一些不好的事情。但它仍然可以读取我的文件。
实际上它可以读取本地文件,但不能读取NFS挂载的文件。我sandbox -t sandbox_min_t
也可以访问 NFS 挂载的文件(这是我想要的),但问题仍然是测试的程序可以访问我的所有文件。我怎样才能告诉它只能访问世界可读的文件,或者只能访问指定用户可读的文件?
(如果在其他沙箱中更容易实现这一点,我愿意使用 CentOS 上的另一个沙箱。)
(我不希望仅仅为了测试程序而创建一个新的用户帐户。我不希望这样做,部分原因是几个教师/助理可能需要这样做,并且我希望帐户是个人的,而不是用户名空间混乱有很多这样的。)
答案1
可以使用以下命令实现一个相对简单的沙箱,允许读取和写入已经打开的文件描述符seccomp
。 python 程序初始化沙箱,然后执行不受信任的脚本。为 libseccomp 2.2.0 (LWN) 添加了 Python 绑定有一个如何从 Python 使用 libseccomp2 API 的通用示例。
SELinux 沙箱可以提供更通用的沙箱来运行任何不受信任的应用程序。sandbox
命令有一些有用的选项,可能足以阻止访问您的文件。使用-M
选项,主目录和临时目录将被 tmpfs 挂载屏蔽,从而防止沙箱访问底层文件。与-i
选项一起,您可以将所需的文件复制到临时目录中。如果您的文件不大,最简单的方法可能是将文件复制到沙箱中。理想情况下,最好为您的用例编写自定义沙箱域。
LXC 容器提供了另一种选择。然而,设置所有内容的工作量有点大,但生成的容器提供了很大的灵活性。容器可以具有只读文件系统,并使用可写应用程序目录的绑定挂载。配置选项可用于防止应用程序获得任何新的权限。