Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Linux中的沙箱_Python_C_Linux_Security_Sandbox - Fatal编程技术网

Python Linux中的沙箱

Python Linux中的沙箱,python,c,linux,security,sandbox,Python,C,Linux,Security,Sandbox,我想创建一个Web应用程序,允许用户上传一些C代码,并查看其执行结果(代码将在服务器上编译)。用户是不可信的,这显然有一些巨大的安全隐患 所以我需要为这些应用程序创建一些沙盒。在最基本的层面上,我想将对文件系统的访问限制在一些指定的目录中。我不能直接使用chroot jails,因为web应用程序不是以特权用户身份运行的。我想一个设置监狱的suid可执行文件是一个选择 上传的程序会很小,所以它们应该执行得很快(最多几秒钟)。因此,我可以在预设超时后终止进程,但如何确保它不会产生新进程?或者如果我

我想创建一个Web应用程序,允许用户上传一些C代码,并查看其执行结果(代码将在服务器上编译)。用户是不可信的,这显然有一些巨大的安全隐患

所以我需要为这些应用程序创建一些沙盒。在最基本的层面上,我想将对文件系统的访问限制在一些指定的目录中。我不能直接使用chroot jails,因为web应用程序不是以特权用户身份运行的。我想一个设置监狱的suid可执行文件是一个选择

上传的程序会很小,所以它们应该执行得很快(最多几秒钟)。因此,我可以在预设超时后终止进程,但如何确保它不会产生新进程?或者如果我不能,杀死整个pgid是可靠的方法吗

除了“根本不做”之外,最好的方法是什么我还遗漏了哪些其他突出的安全问题


FWIW,这个web应用程序将用Python编写。

有一个名为的工具,它监视给定进程进行的系统调用。你只需要注意那些暗示“非法”函数访问的特定调用。顺便说一句,这是编程比赛中使用的沙箱选手程序的方法。

我认为这在很多层面上都是非常危险的。您实际上是在向系统上可以发现的任何漏洞开放自己(而您通常仅限于人们可以远程利用的漏洞)。如果你能避免的话,我会说不要这样做


如果您确实想这样做,您可能希望使用某种虚拟机来运行用户的代码。使用类似的方法,可以使用相同的基本映像设置多个虚拟机(您甚至可以在已启动状态下存储快照,尽管我不确定它将如何处理克隆)。然后,您可以根据需要创建虚拟机,运行用户代码,返回结果,然后关闭虚拟机。如果让虚拟机彼此隔离并与网络隔离,用户可以随意破坏,而不会伤害物理服务器。在这种情况下,您将自己暴露在的唯一危险是允许他们从VM中逃脱的某种攻击。。。这些情况极为罕见,而且随着硬件虚拟化的改进,这种情况将更加罕见。

关于您唯一的机会是运行虚拟机,而这些可能存在漏洞。如果你想让你的机器在短期内被黑客攻击,只需使用权限,让一个特殊的用户可以访问一个目录。如果您想将黑客攻击推迟到将来某个时候,那么在虚拟机中运行一个Web服务器并将其向前移植。你需要保留一个备份,因为你可能会在一个小时内被黑客入侵,并希望每隔几个小时重新启动一个新副本。您还需要保留整个机器的图像,以便每周左右对整个机器重新成像一次,以克服每周的黑客攻击。不要让那台机器与网络上的任何其他机器通信。到处都是黑名单。我说的是虚拟机和物理机的IP地址。定期对网络上其他机器上的任何其他机器进行安全审核。请重命名计算机IHaveBeenHacked1和IHaveBeenHacked2,并阻止访问主机列表和防火墙中的计算机


通过这种方式,您可能会在一段时间内避免您的黑客攻击水平。

尽管它仍在开发中,尚未被认为是安全的,但您可以查看背后的技术。它的设计目的是允许不受信任的本机代码在web浏览器中运行,但可能适合在web服务器上使用。您可以在其他技术(如虚拟机)的基础上使用类似的技术,以提高安全性。

在这方面,有一种方法似乎可以完全满足您的需要(除了限制生成新进程;链接的博客文章没有提到这一点)


当然,总是有内核错误的风险;即使使用SELinux,内核的某些部分仍然暴露于所有进程。

您提供的一些细节意味着您对服务器本身具有管理控制权,因此我的建议是这样假设的

我将把它作为一个批处理系统来处理。web服务器接受源文件的上载,进程轮询提交目录,处理文件,然后将结果提交到web应用程序轮询的另一个目录,直到找到结果并显示为止

有趣的部分是如何安全地处理执行

我选择的操作系统是FreeBSD,所以我设置了一个预配置的监狱(不要与普通的chroot监狱混淆),它将编译、运行和保存输出。然后,对于每个提交的源文件,为每次执行启动一个原始的监狱副本,其中包含一个源文件副本

如果监狱的/dev被删减到几乎为零,系统资源限制被安全地设置,并且流量不能路由出监狱(绑定到无法溢出的地址或简单地防火墙),我个人会很乐意在我管理的服务器上运行它

由于您使用Linux,我将研究用户模式Linux或Linux VServer,它们在概念上与FreeBSD监狱非常相似(我本人从未使用过它们,但已经阅读过它们)。列出了其他几种此类系统

这种方法比普通的chroot安全得多,而且比使用qemu/kvm或VMware等完全虚拟化要轻得多


我不是程序员,所以我不知道你可以用什么样的AJAX-y来投票结果,但我相信这是可以做到的。作为一名管理员,我会发现这是一个有趣的项目。玩得开心。:)

连同其他建议,你可能会发现这很有用

这是关于佩奇的

见。正如你所看到的,有很多方法,但没有一种是有效的