安全运行用户代码

mar*_*all 6 linux security

我必须标记 C 代码,其中一部分涉及运行和计时他们的提交。问题是他们的代码然后像我一样运行,原则上他们可以使用我的权限设置做任何他们喜欢的事情。例如,他们可以复制我的 ssh 私钥。

我可以设置一个虚拟机并在其中运行他们的代码(尽管我也不完全确定锁定它的最佳方法)。这样做的一个问题是速度性能现在不现实。我可以为所有用户提供相同的虚拟机来预先测试他们的代码,所以至少他们有相同的设置来测试。

有没有一种好的方法来建立一个环境,让你可以运行其他人编写的代码,但限制它可能造成的损害?

Bob*_*Bob 10

实际上有多种类型的虚拟机,在其他答案中有点遗漏了。你可以拥有所谓的容器虚拟化——比如 Linux vServer 或 OpenVZ。它们共享主机内核,运行所谓的“容器”(使用它们自己的环境)而不是虚拟化任何硬件,并且几乎与裸机一样快。(OpenVZ 在更便宜的 VPS 服务中更常见,但最多只支持自定义内核 2.6.x,而 vServer 则支持最新的稳定版本)。

除此之外,现代机器上完全虚拟化的开销并没有你想象的那么糟糕!使用中高端 CPU 上的硬件虚拟化,大多数用户甚至不会注意到任何性能损失,除非存在资源争用(例如主机或另一个 VM 正在使用大量资源)。它会慢一点,因为来宾操作系统使用了一些资源,但是虚拟化本身的成本几乎可以忽略不计 - 特别是 CPU 使用率,因为它可以传递给原始硬件而(几乎)没有转换,如果它是硬件加速。你可以尝试一下,你可能会感到惊讶。


请注意,每个都带有不同级别的隔离。容器虚拟化使得利用内核和其他错误来“突破”容器变得更加容易——LXC 根本不安全,尽管 OpenVZ 被认为非常成熟和安全(并且通常用于您销售的 VPS 服务中)容器给不受信任的人)。vServer 介于两者之间。全虚拟化具有更好的隔离性,但仍有一些攻击需要爆发。

这取决于您期望恶意学生走多远。以不同的用户身份运行可能就足够了。您可能需要一个容器以提高安全性。在这种情况下,一个容器可能足以容纳您将遇到的任何事情。


小智 8

创建一个权限有限的单个用户帐户(这意味着只能访问一组有限的库例程,甚至可能是精简的 shell 访问权限)。

ssh 作为系统中的用户,并运行他们的程序。

您甚至可以编写一个小的bashshell 脚本(或任何其他 shell 脚本)来实现这一点。