Linux 用于沙箱编译和执行不可信源代码的体系结构

Linux 用于沙箱编译和执行不可信源代码的体系结构,linux,compilation,sandbox,virtualization,Linux,Compilation,Sandbox,Virtualization,是一个列出编程难题的网站,然后允许用户编写代码来解决这些难题,并将其源代码上传到服务器。然后,服务器编译源代码(如果是解释语言,则对其进行解释),对代码运行一组单元测试,并验证它是否正确解决了问题 实现这种功能的最佳方法是什么?如何对用户输入进行沙箱处理,使其不会影响服务器?您应该使用SELinux、chroot还是虚拟化?这三个加上我没想到的其他东西 应用程序如何在监狱外可靠地传递结果,同时确保结果不被泄露?例如,如何防止应用程序将大量无意义数据写入磁盘或其他恶意活动 我真的很好奇,因为这似乎

是一个列出编程难题的网站,然后允许用户编写代码来解决这些难题,并将其源代码上传到服务器。然后,服务器编译源代码(如果是解释语言,则对其进行解释),对代码运行一组单元测试,并验证它是否正确解决了问题

实现这种功能的最佳方法是什么?如何对用户输入进行沙箱处理,使其不会影响服务器?您应该使用SELinux、chroot还是虚拟化?这三个加上我没想到的其他东西

应用程序如何在监狱外可靠地传递结果,同时确保结果不被泄露?例如,如何防止应用程序将大量无意义数据写入磁盘或其他恶意活动


我真的很好奇,因为这似乎是一种非常危险的应用程序运行方式。

从有限的用户帐户执行chroot-jail听起来是最好的起点(即不是root用户或运行Web服务器的同一用户)

为了防止大量无意义的数据被写入磁盘,您可以使用磁盘配额或不介意填充的单独卷(假设您不是在同一个用户下并行测试,否则您将最终处理恼人的竞争条件)


如果您想做一些更具可扩展性和安全性的事情,您可以将动态虚拟化主机与您自己的服务器/客户机解决方案一起用于通信—您有一个“代理”池,接收从X存储库或共享中复制和编译的指令,然后执行一系列测试,并通过相同的服务器/客户端协议记录输出。您的主机进程可以监视磁盘过度使用情况,并在需要时报告警告,代理可能会也可能不会在chroot-jail下执行代码,如果您非常偏执,则会在每次运行后销毁代理,并在下一个示例准备好进行测试时启动新的VM。如果您在云中进行如此大规模的操作(例如,在EC2上运行100多个代理),您只有足够的速度来满足需求,从而降低成本。同样,如果你打算扩大规模,你可以使用类似AmazonSQS的东西来缓冲请求,或者如果你正在做一个实验性的样本项目,那么你可以做一些更简单的事情(想想分布式并行处理系统,例如。seti@home)

“从而降低成本”-考虑到成本降低,为什么不使用?它是现成的,免费用于小型非商业项目。@ukasz Kuszner,我指的是商业部署的持续成本。一旦您的成本以每cpu小时美元为单位进行预算,开发成本就可以忽略不计;)