安全运行用户代码

安全运行用户代码

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

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

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

答案1

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

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


请注意,每种虚拟化方式的隔离级别也不同。容器虚拟化使得利用内核和其他漏洞“突破”容器变得更加容易 - LXC 根本不安全,尽管 OpenVZ 被认为相当成熟和安全(并且通常用于 VPS 服务,您可以在其中向不受信任的人出售容器)。vServer 介于两者之间。完全虚拟化具有更好的隔离性,但仍存在一些攻击可以突破。

这取决于你预计恶意学生会走多远。可能只需以其他用户身份运行就足够了。你可能需要一个容器来提高安全性。在这种情况下,容器可能足以应对你遇到的任何事情。

答案2

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

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

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

答案3

  1. 以 身份运行代码nobody,这应该会给你最低权限。根据配置的危险程度,这可能不安全
  2. 在 jail中运行chroot。根据代码的不同,这可能会改变行为,并且 jail 通常可以被打破。他们是不是安全功能。
  3. 在虚拟机中运行。我思考已知的能够突破这些限制的实例非常少,但我不确定。例如,您可以使用 Vagrant 设置非常简单的虚拟化。示例配置命令

答案4

I have to mark C code

然后,您就有了对源代码的完全访问权,仔细查看它 - 他们不太可能在您不注意的情况下在代码中传递任何恶意内容。

如果你不确定,可以通过虚拟机运行它,但在大多数情况下,你会知道正在运行什么

相关内容