在服务器上执行外部Java源代码 – 限制安全性和资源?

我正在考虑构建一个简单的在线服务,人们可以通过以源代码的forms将解决方案提交 到我的服务器 来解决编程练习,然后对其进行解释/编译和执行/测试。

通过使用Java VM,我可以提供对Java,Scala,Clojure,Ruby,Python和Javascript的支持。 但是当我仔细考虑它时,恐怕我不知道如何限制脚本的资源和权限。

我的意思是它不应该

  • 写入磁盘
  • 创建超过X个线程
  • 运行超过X秒
  • 使用超过X MB的内存
  • 执行外部应用程序
  • 等等

如何将每个脚本放在沙箱中?

根据我的阅读,SecurityManager似乎无法完成所有这些……

好吧,您可以使用一些通用安全系统来确保安全的代码执行,如AppArmor或SELinux 。 它不仅适用于java,python等应用程序,也适用于bash脚本,二进制可执行文件等。 还没有使用SELinux,但这是AppArmor安全配置文件的一个简单示例,除了“运行超过X秒”之外,它会执行您提到的所有内容 – 这可以通过超时机制完成(我是一个新用户,所以cannon在这里张贴第二个链接O_o ..)

#include  /path/to/executable { #include  # http://linux.die.net/man/2/setrlimit # limit memory (address space) set rlimit as <= 150M, # limit core dump file http://linux.die.net/man/5/core set rlimit core <= 2M, # allow to create files only this size at max set rlimit fsize <= 1M, # limits number of threads (fork bomb won't go! :)) set rlimit nproc <= 10, # program will have access to stuff defined in abstractions/base and # to the file defined below. Nothing else. /path/to/file.txt rw, } 

如何将每个脚本放在沙箱中 - 您可以为script1,script2等创建几个相同的配置文件。如果您希望人们在您的网站上解决不同的练习,也可以使用不同的权限。

这是使用超时的一个例子:

 $sudo apt-get install timeout $timeout 3 ./binary #limits execution of ./binary to 3 seconds 

我还建议你限制已编译的编程语言的编译时间(如果有的话)。 例如,在C ++中,有人可以编写一个棘手的模板或

 #include  

这将在编译时导致cpu密集型工作。

您可以使用java脚本API。 许多语言也可以用作脚本,Java。 此外,使用脚本API包装语言也不需要太多编程。 http://worldwizards.blogspot.com/2009/08/java-scripting-api-sandbox.html表示如何提供沙盒。

您已经描述了一个类似于谷歌应用引擎启用的白名单类的JVM端口。

关于如何在这里沙盒化JVM有一个很好的解释: 谷歌应用引擎沙盒是如何工作的?