22

我想制作一个在本地运行其他人代码的 Web 服务。自然,我想限制他们的代码访问某个“沙盒”目录,这样他们就无法连接到我服务器的其他部分(数据库、主网络服务器等)

最好的方法是什么?

运行 VMware/Virtualbox:

  • + 我想它是最安全的。即使有人设法“破解”,他们也只会破解来宾机器

  • + 可以限制进程使用的 CPU 和内存

  • + 易于设置 - 只需创建虚拟机

  • - 更难将沙盒目录从主机“连接”到来宾

  • - 浪费额外的内存和 CPU 来管理 VM

运行特权用户:

  • + 不浪费额外资源

  • + 沙盒目录只是一个普通目录

  • ? 不能限制CPU和内存?

  • ? 不知道够不够安全

还有什么办法吗?

运行 Fedora Core 8 的服务器,用 Java 和 C++ 编写的“其他”代码

4

9 回答 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 时间。

您可以将您的服务器进程放入组中(以便整个系统及其所有用户都在限制范围内)或让服务器将每个新会话放入一个新组中。

于 2009-05-10T18:40:37.523 回答
9

chroot, jail , container , VServer / OpenVZ /etc.,通常比以非特权用户身份运行更安全,但比完整的操作系统虚拟化更轻量级。

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

但正如 Checkers 的回答所说,过去几乎所有“沙盒”都被证明有可能造成恶意破坏,我预计未来会不断发现(并希望修复)更多漏洞。你真的想运行不受信任的代码吗?

于 2009-04-27T14:48:17.080 回答
9

阅读 codepad.org/about 页面可能会给你一些很酷的想法。

http://codepad.org/about

于 2009-04-28T03:19:07.850 回答
1

查看ulimit和朋友们了解限制弱势用户对机器执行 DOS 能力的方法。

于 2009-04-27T09:25:43.797 回答
1
  1. 在非特权用户下运行仍然允许本地攻击者利用漏洞来提升特权
  2. 允许在 VM 中执行代码也可能是不安全的;正如最近的VMWare 漏洞报告所示,攻击者可以访问主机系统。

在我看来,从安全的角度来看,首先允许在您的系统上运行本机代码并不是一个好主意。也许你应该重新考虑让他们运行原生代码,这肯定会降低风险。

于 2009-04-27T09:43:03.317 回答
1

尝试学习一些关于为 SELinux 设置策略的知识。如果您正在运行 Red Hat 机器,那么您就可以使用了,因为他们将它打包到了默认发行版中。

如果您知道代码不应访问的内容,这将很有用。或者你可以做相反的事情,只授予对某些事情的访问权限。

但是,这些政策很复杂,并且可能需要比您希望提出的更多的时间投资。

于 2009-05-10T19:17:37.900 回答
1

使用Ideone API - 最简单的方法。

于 2010-08-11T10:34:17.263 回答
1

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

于 2011-01-15T06:45:14.790 回答
0

不确定你想在这件事上付出多少努力,但你能像 VPS 网络主机那样运行 Xen 吗?

http://www.xen.org/

这将允许对他们的一小部分服务器进行完全的 root 访问,而不会损害其他用户或基本系统。

于 2009-05-10T18:51:24.337 回答