我想知道是否有办法在Linux中的沙箱下运行不受信任的C程序.阻止程序打开文件、网络连接或Forking 、执行等的东西?
这将是一个小程序,一个家庭作业(job),上传到服务器上,并在其上执行单元测试.因此,该计划将是短暂的.
我想知道是否有办法在Linux中的沙箱下运行不受信任的C程序.阻止程序打开文件、网络连接或Forking 、执行等的东西?
这将是一个小程序,一个家庭作业(job),上传到服务器上,并在其上执行单元测试.因此,该计划将是短暂的.
我使用了Systrace个沙箱,以交互方式和自动方式对不受信任的程序进行沙箱处理.它有一个基于ptrace()
的后端,允许在Linux系统上使用它而无需特殊权限,还有一个更快、更强大的后端,需要修补内核.
也可以使用chroot(1)
在类Unix系统上创建沙箱,尽管这并不容易或安全.Linux Containers和FreeBSD jails是chroot的更好 Select .Linux上的另一个替代方案是使用SELinux或AppArmor这样的安全框架,这就是我建议用于生产系统的安全框架.
如果你告诉我们你到底想做什么,我们将能够为你提供更多帮助.
EDIT:
Systrace适用于您的情况,但我认为基于Linux Security Model的东西,比如AppArmor或SELinux,是一种更标准、更受欢迎的替代品,具体取决于您的发行版.
EDIT 2:
而chroot(1)
在大多数(所有?)上都可用类似于Unix的系统,它有很多问题:
它可以被打破.如果你打算在你的系统上编译或运行不可信的C程序,你尤其容易受到这个问题的影响.如果你的学生和我的一样,就会有人试图越狱.
您必须创建一个完整的独立文件系统层次 struct ,包含任务所需的所有内容.您不必在chroot中有编译器,但应该包括运行编译程序所需的任何内容.虽然有一些实用程序可以帮助实现这一点,但它仍然不是微不足道的.
你必须维护chroot.因为它是独立的,所以chroot文件不会随发行版一起更新.您必须定期重新创建chroot,或者在其中包含必要的更新工具,这基本上要求它是一个完整的Linux发行版.您还必须保持系统和用户数据(密码、输入文件e.t.c.)与主机系统同步.
chroot()
只保护文件系统.它不能防止恶意程序打开网络套接字,或防止编写糟糕的程序占用所有可用资源.
资源使用问题在所有备选方案中都很常见.Filesystem quotas将阻止程序填充磁盘.正确的ulimit
(C中的setrlimit()
)设置可以防止内存过度使用和任何Forking 炸弹,以及停止CPU占用.nice(1)
可以降低这些程序的优先级,这样计算机就可以毫无问题地用于任何被认为更重要的任务.