8

我有一堆 python 项目,其中包含不受信任的 WSGI 应用程序。我需要模拟和安全地运行它们。所以我需要限制目录访问、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 套接字进行通信。我什至不知道从哪里开始。

你能推荐什么?

4

1 回答 1

3

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

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

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

编辑:要在不使用 VM 沙盒方法的情况下限制内存使用,请参阅此问题。要限制 CPU 使用率,请调整 gunicorn 设置——允许应用程序使用的每个内核启动一个 gevent 样式的工作程序。

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

于 2012-05-14T17:25:43.300 回答