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

ami*_*kaz 20 linux security virtualization sandbox

我想创建一个在本地运行其他人代码的Web服务...当然,我想限制他们对某些"sandbox"目录的代码访问,并且他们将无法连接到我的服务器的其他部分(DB,main网络服务器等)

什么是最好的方法呢?

运行VMware/Virtualbox:

(+)我猜它就像它得到的那样安全......即使有人设法"破解"......他们只会破解客人机器

(+)可以限制进程使用的cpu和内存

(+)易于设置..只需创建VM

( - )更难将沙箱目录从主机"连接"到guest虚拟机

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

运行弱势用户:

(+)不会浪费额外的资源

(+)sandbox目录只是一个普通目录

(?)不能限制CPU和内存?

(?)不知道它是否足够安全......

还有其他方法吗?

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

Tho*_*ard 14

要限制CPU和内存,您需要为进程组设置限制(POSIX资源限制仅适用于单个进程).您可以使用cgroups执行此操作.

例如,通过挂载内存cgroups文件系统来限制内存启动:

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

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

# mkdir /cgroups/memory/my-users
Run Code Online (Sandbox Code Playgroud)

将您想要约束的进程(此处使用PID"1234"处理)放入此组:

# cd /cgroups/memory/my-users
# echo 1234 >> tasks
Run Code Online (Sandbox Code Playgroud)

设置组的总内存限制:

# echo 1000000 > memory.limit_in_bytes

如果组fork子进程中的进程,它们也将在组中.

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

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


Ali*_*xel 8

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

http://codepad.org/about


eph*_*ent 7

chroot,jail,容器,VServer/OpenVZ等,通常比作为非特权用户运行更安全,但比完整的OS虚拟化更轻.

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

但正如Checkers的答案所述,事实证明,过去几乎任何"沙箱"都可能造成恶意破坏,而且我预计未来会不断发现(并希望修复)更多漏洞.你真的想要运行不受信任的代码吗?


Ale*_*x B 1

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

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

  • 我们可以将这个论点扩展到*“网络服务器中存在漏洞,因此您不应该运行网站。”*事实上,*“网络浏览器中存在漏洞,因此您不应该浏览互联网!”* (24认同)
  • 嗯..当然从安全角度来看这不是一个好主意,但我需要这样做,所以我必须妥协。我知道,如果我让其他人运行代码,就不存在 100% 的安全性(任何地方都不存在 100% 的安全性)——这不是人们有巨大动机去“破解”的银行网站..,我只是想获得尽可能多的“成本” -尽我所能地受益”。 (4认同)