假设我正在运行一个托管服务,它希望允许第三方客户端编写的插件。
也许是提供基础设施但允许客户开发自己的游戏裁判的游戏服务提供商。或者,一个编码竞赛网站,允许编码人员提交代码以作为他们对某些编码问题的解决方案来运行。
您将如何加固/锁定/沙箱此用户代码以免对打算运行它的服务器造成潜在损害?
您将如何监控和限制资源使用(主要是 CPU、内存)?
这对 Python 来说是一个好的开始,但我想知道这里是否有人有更具体的经验可以分享,无论使用哪种语言(Python、Lua、Ruby 等)。
假设我正在运行一个托管服务,它希望允许第三方客户端编写的插件。
也许是提供基础设施但允许客户开发自己的游戏裁判的游戏服务提供商。或者,一个编码竞赛网站,允许编码人员提交代码以作为他们对某些编码问题的解决方案来运行。
您将如何加固/锁定/沙箱此用户代码以免对打算运行它的服务器造成潜在损害?
您将如何监控和限制资源使用(主要是 CPU、内存)?
这对 Python 来说是一个好的开始,但我想知道这里是否有人有更具体的经验可以分享,无论使用哪种语言(Python、Lua、Ruby 等)。
RestrictedPython(显示在您提供的链接中)看起来很有希望。但是,我不能说我实际上已经尝试过这样做。
另一个可行的选择是构建一个极小的 Linux 发行版,然后在虚拟化环境中为每个用户复制它。使用虚拟机的监控机制通过在资源达到特定级别时暂停 VM 来限制 CPU 和内存使用。如果您将发行版构建得足够小,那么 VM 本身对资源的影响就会很小,但我想您仍然需要相当大量的 RAM 来实现这样的解决方案(只是为了安全起见)。
只是我的2美分。不过,我不是 Python 专家。
100% 安全可能是不可能的,但是 chroot'ing 是一个好的开始。我在我的服务器上使用了几个脚本,这些脚本在 chroot 的监狱中运行。一个脚本是攻击的受害者(我忽略了一个相当聪明的漏洞 - 哎呀!)虽然渗透者破坏了脚本,但监狱阻止了他们进行任何进一步的破坏。
如果您要使用最小的 python 选项,请查看Minimal Python。
您可能想要执行以下操作:
编译传入的代码以挑选出所有import
语句并限制可以导入的内容。
还要检查_import_
和reload
功能的使用。
为这些模块定义一个 API,允许它们作为单独的进程运行,封装在您提供的轻量级 WSGI 服务器中。将它们分叉为子进程并通过您的服务器 API 进行交互。如果它们崩溃或挂起,您将通过超时检测到这一点。
Lua 拥有迄今为止我见过的最好的沙盒和看门狗。我的宿主语言是 Python。因此,我决定使用Lunatic Python。
FWIW,Apache/mod_wsgi 3.0 版能够在 chroot 环境中运行其守护进程模式进程。
如果只对尝试保护主要操作系统感兴趣,那么这是能够做到这一点的一个可能组件。
如果您还想阻止用户干扰其他用户的代码,并且可以有任意数量的用户可以动态更改,那么这会更难,因为 Apache/mod_wsgi 还没有动态守护进程组的功能,而是依赖于静态配置。