在我的服务器上运行他人代码的安全方式(沙盒)是什么?

22
我想创建一个能够在本地运行其他人代码的Web服务。自然而然,我希望限制这些代码只能访问某个“沙盒”目录,以防止它们连接我的服务器的其他部分(如DB、主Web服务器等)。
最好的方法是什么?
运行VMware/Virtualbox: - 我认为这是最安全的方式。即使有人试图“黑客入侵”,他们也只能黑客入侵到虚拟机 - 可以限制进程使用的CPU和内存 - 容易设置 - 只需创建虚拟机 - 从主机到虚拟机连接“沙盒”目录更困难 - 管理虚拟机会浪费额外的内存和CPU
作为普通用户运行: - 不会浪费额外的资源 - “沙盒”目录只是一个普通的目录 - 不能限制CPU和内存? - 我不确定这是否足够安全
还有其他的方法吗?
服务器运行Fedora Core 8,其他代码写在Java和C++中。

更多相关主题请参见:http://security.stackexchange.com/questions/32375/how-to-run-clients-code-on-server-securely - Ciro Santilli OurBigBook.com
这个回答解决了你的问题吗?如何在node.js沙盒中安全地运行用户提交的脚本? - Ciro Santilli OurBigBook.com
9个回答

15

为了限制CPU和内存,您需要为一组进程设置限制(POSIX资源限制仅适用于单个进程)。可以使用cgroups来实现此功能。

例如,要限制内存,请先挂载内存cgroups文件系统:

# mount cgroup -t cgroup -o memory /cgroups/memory

然后,为每个组创建一个新的子目录,例如:

# mkdir /cgroups/memory/my-users

将您想要限制的进程(此处为PID“1234”的进程)放入此组中:

# cd /cgroups/memory/my-users
# echo 1234 >> tasks

设置组的总内存限制:

# echo 1000000 > memory.limit_in_bytes

如果组中的进程派生子进程,它们也将在该组中。

上述组设置了驻留内存限制(即受限进程将开始交换而不是使用更多内存)。其他cgroup允许您限制其他内容,例如CPU时间。

您可以将服务器进程放入组中(以使整个系统及其所有用户都受到限制),或者让服务器将每个新会话放入新组中。


9

chrootjailcontainerVServer/OpenVZ/等通常比以非特权用户身份运行更安全,但比完整的操作系统虚拟化更轻量。

此外,在Java中,您可以信任JVM内置的沙箱功能;对于编译C++代码,NaCl声称能够隔离x86代码。

但正如Checkers的回答所述,过去已经证明几乎任何“沙箱”都可能导致恶意损害,并且我预计将来会不断发现(并希望修复)更多漏洞。您真的想要运行不受信任的代码吗?


9

1

尝试使用lxc作为您的Apache服务器容器


1

2
Ideone API每月限制请求次数为1000次。这是我想创建自己的在线评测系统的原因之一。 - shashankg77
2
@SinnerShanky 如果你需要一个在线评测服务,那么有很多现成的服务可供选择。例如 DOMjudge 是一个你可以在自己的服务器上安装的服务。你也可以使用 SPOJ,它允许设置可定制的比赛(并且使用与 ideone 相同的引擎)。 顺便说一句:Ideone 在付费选项中允许更多的提交。 - kuszi

1

看看 ulimit 和它的类似函数,以限制非特权用户对机器进行拒绝服务攻击的能力。


1
  1. 即使在非特权用户下运行,本地攻击者仍然可以利用漏洞提升权限
  2. 允许在虚拟机中执行代码也可能不安全;正如最近的VMWare漏洞报告所显示的那样,攻击者可以获得对主机系统的访问权限。

我认为,从安全角度考虑,允许在您的系统上运行本地代码并不是一个好主意。也许您应该重新考虑允许他们运行本地代码,这肯定会降低风险。


4
当然,从安全角度来看这不是一个好主意,但是我必须这样做,所以我不得不妥协。我知道如果我让其他人运行代码就不可能100%安全(任何地方都不存在100%安全性)——这不像银行网站那样有巨大的动机去“黑客攻击”……我只是想尽可能地获得“成本效益”。 - amitkaz
1
使用某种形式的沙盒技术,但考虑禁止运行原生代码。这可行吗? - Alex B
24
我们可以将这个论点扩展到“Web服务器存在漏洞,因此你不应该运行网站。”事实上,“Web浏览器存在漏洞,因此你不应该浏览互联网!” - BlueRaja - Danny Pflughoeft
@BlueRaja,并不是说你完全不能允许用户运行代码(例如Google App Engine确实允许您运行Java字节码),但本地代码在将本地root漏洞转化为远程root漏洞方面的记录很糟糕。 - Alex B
在2014年,利用漏洞提升权限仍然相关吗? - Hello World
@HelloWorld,现在是2k15并且它仍然很重要,除非你将所有权限都设置为相等。是的,人们编写更好、更安全的代码,但总会有攻击向量可以被攻击。虚拟化可能是最好的选择,但根据你的用例,你可以选择像硬化gentoo(LXC jail,selinux,...)这样的东西。这种方法给你更多的选择,但正确地实现可能是具有挑战性的。只需确保将曝光于固有不安全事物(X服务器、视频驱动程序)的风险最小化即可。这种设置预期的性能损失应该在5%左右。 - Tomas Pruzina

1

尝试学习一些有关为SELinux设置策略的知识。如果你正在运行Red Hat系统,那么你已经可以使用默认发行版了。

如果你知道代码不应该访问哪些内容,这将非常有用。或者你也可以相反地,只授予对某些内容的访问权限。

然而,这些策略很复杂,可能需要比你愿意付出的更多时间的投入。


0

不确定您想要投入多少精力在这件事上,但您能像那些VPS Web主机一样运行Xen吗?

http://www.xen.org/

这将允许他们在服务器上的小部分拥有完全的根访问权限,而不会危及其他用户或基本系统。


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