我想知道是否存在在Linux下的沙箱下运行不受信任的C程序的方法.什么会阻止程序打开文件,网络连接,分叉,执行等?
它将是一个小程序,一个家庭作业,它被上传到服务器并在其上执行单元测试.所以该计划将是短暂的.
我想创建一个Web应用程序,允许用户上传一些C代码,并查看其执行结果(代码将在服务器上编译).用户不受信任,这显然具有一些巨大的安全隐患.
所以我需要为应用程序创建一些沙盒.在最基本的层面上,我想限制对某些指定目录的文件系统访问.我无法直接使用chroot jails,因为Web应用程序不是以特权用户身份运行.我想一个suid可执行文件设置jail将是一个选项.
上传的程序相当小,因此它们应该快速执行(最多几秒钟).因此,我可以在预设超时后终止进程,但是如何确保它不会产生新进程?或者,如果我不能,那么杀死整个pgid是一种可靠的方法吗?
除了"根本不做"之外,最好的方法是什么?:)我错过了哪些其他明显的安全问题?
FWIW,Web应用程序将用Python编写.
我正在考虑沙盒化Linux进程的几个选项.使用clone()具有CLONE_NEWNET(等)的选择之一.CLONE_NEWNET确保沙盒进程无法建立或接受真正的网络连接.但我想完全禁用该进程的套接字,甚至bind()是任何端口0.0.0.0,并绑定到Unix doman套接字(甚至匿名).我想这样做是为了防止进程通过绑定到数千个端口来使用过多的内核资源.我怎么做?
一般来说,我对许多沙盒方法感兴趣(即Linux内核提供的方法和强制执行的方法ptrace()),但在这个问题中,我只对沙盒方法的套接字创建方面感兴趣(所以如果你建议使用沙盒)方法,请解释如何防止使用它创建套接字),我对需要内核修补或涉及加载内核模块的方法不感兴趣,内核模块不是Ubuntu Lucid默认二进制内核包的一部分,或者会影响系统上的每个进程.
我有一个Web服务,用户上传在服务器上运行的python脚本.这些脚本处理在服务器上的文件,我希望他们能够看到仅在服务器的文件系统中某一层级(最好:关于这一点我复制我要处理的文件和脚本的临时文件夹).
服务器最终将是基于Linux的服务器,但如果在Windows上也可以使用解决方案,那么知道如何解决这个问题会很好.
我的目的是创建一个限制访问FS文件夹的用户 - 最终只包含脚本和文件的文件夹 - 并使用该用户启动python解释器.
有人可以给我一个更好的选择吗?因为只依靠这个让我觉得不安全,我想要一个真正的沙盒或虚拟FS功能,我可以安全地运行不受信任的代码.