如何在托管服务中监控、管理和运行不受信任的第三方代码?

3
假设我正在运行一个托管服务,希望允许第三方客户编写插件。也许是游戏服务提供商,提供基础设施,但允许客户开发自己的游戏裁判。或者是编码竞赛网站,允许编码人员提交代码作为他们解决某些编码问题的解决方案。
你将如何加强/锁定/沙箱化这个用户代码,以防止它对打算运行它的服务器造成潜在危害?
你将如何监控和限制资源使用(主要是CPU、内存)?
这是Python的很好的起点,但我想知道这里是否有任何更具体的经验可以分享(无论使用哪种语言,如Python、Lua、Ruby等)。

我问了一个类似于这个问题的问题 - http://stackoverflow.com/questions/234590/solving-the-shared-server-security-problem-for-python - rampion
5个回答

2

RestrictedPython(在您提供的链接中显示)看起来很有前途。不过,我不能说我实际上尝试过这样做。

另一个可能可行的选择是构建一个极其简化的Linux发行版,然后在虚拟化环境中为每个用户复制它。使用虚拟机的监控机制通过在资源达到一定水平时暂停虚拟机来限制CPU和内存使用。如果您将发行版构建得足够小,则虚拟机本身对资源的影响非常小,但我想您仍然需要相当大量的RAM才能实现这样的解决方案(只是为了安全起见)。

这是我的两分钱。不过,我不是Python专家。


1

可能不可能达到百分之百的安全, 但使用 chroot 是个好的开始。我在服务器上运行多个在 chroot 狱中的脚本。其中一个脚本曾经受到攻击(我忽略了一个相当巧妙的漏洞 - 糟糕!),虽然入侵者破坏了脚本,但狱停止了他们进一步造成的任何损害。

如果你想采用极简 Python,请看看极简 Python


chrooting总是一个不错的开始。感谢提供最小化Python链接。 - z8000

0
你可能想要做下列事情:
  1. 编译传入的代码,挑选所有的import语句,并限制可以导入的内容。

  2. 检查_import_reload函数的使用情况。

  3. 为这些模块定义一个API,使它们可以作为单独的进程运行,在你提供的轻量级WSGI服务器中进行封装。将它们作为子进程进行分叉,并通过你的服务器API进行交互。如果它们崩溃或挂起,你将通过超时检测到这一点。


0
Lua是我迄今为止见过的最好的沙盒和看门狗。我的宿主语言是Python。因此,我决定选择Lunatic Python

0

顺便提一下,Apache/mod_wsgi 3.0 版本 具备在 chroot 环境中运行守护进程的能力。

如果只是想尝试保护主操作系统,那么这是其中一个可能的组件。

如果您还想防止用户干扰其他用户的代码,并且可以动态更改用户数量,则更难实现,因为 Apache/mod_wsgi 还没有动态守护进程组的功能,而是依赖于静态配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接