我有大量的python项目,里面有不受信任的WSGI-apps。我需要模拟和安全地运行它们。所以我需要限制目录访问,python模块使用以及CPU和内存的限制。
我考虑两种方法:
从定义的文件中通过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)
修改Python解释器,排除具有潜在风险的模块,在并行进程中运行,通过ZMQ / Unix套接字进行通信。我甚至不知道从哪里开始。
你能推荐什么?
答案 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 +虚拟机方法。