Python代码jailing

时间:2012-05-14 17:07:26

标签: python virtualization pysandbox

我有大量的python项目,里面有不受信任的WSGI-apps。我需要模拟和安全地运行它们。所以我需要限制目录访问,python模块使用以及CPU和内存的限制。

我考虑两种方法:

  1. 从定义的文件中通过imp-module WSGI-object导入,并使用pysandbox运行它。在做的时候我有SandboxError: Read only object

    self.config  = SandboxConfig('stdout')
    self.sandbox = Sandbox(self.config)
    self.s = imp.get_suffixes()
    wsgi_obj = imp.load_module("run", open(path+"/run.py", "r"), path, self.s[2]).app
    …
    return self.sandbox.call(wsgi_obj, environ, start_response)
    
  2. 修改Python解释器,排除具有潜在风险的模块,在并行进程中运行,通过ZMQ / Unix套接字进行通信。我甚至不知道从哪里开始。

  3. 你能推荐什么?

1 个答案:

答案 0 :(得分:3)

我会用gunicorn运行你的应用程序,每个应用程序都有一个单独的进程和配置,以及用户级权限(不同用户的每个不受信任的应用程序)。每个gunicorn实例都将在用户范围端口上的localhost上提供服务,nginx或其他网络服务器可以连接到它们以路由并将它们提供给Web。

Heroku更进一步,并在虚拟机中对每个gunicorn实例(或独角兽或apache或任意其他服务器)进行沙箱化。这可能是最安全的可行方式,绝对是可靠地限制CPU和内存使用的最佳选择,但根据您的要求,您可能不需要那么远。

这种方法的一个优点是,如果合适,每个应用程序都可以在不同版本的Python上运行;使用虚拟机沙箱,它们甚至可以完全在不同的操作系统上运行。

编辑:要在不使用VM沙箱方法的情况下限制内存使用量,请参阅this question。要限制CPU使用率,请调整gunicorn设置 - 允许应用程序允许每个核心使用一个gevent风格的worker。

再次编辑:一种完全不同的方法是使用PyPy's sandboxing mechanism,它应该比CPython和沙盒模块更安全。但是,我更喜欢guincorn或gunicorn +虚拟机方法。