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

时间:2011-12-10 11:13:37

标签: java security

我正在考虑建立一个简单的在线服务,人们可以通过提交解决方案解决编程练习,以源代码的形式,到我的服务器,在那里然后解释/编译并执行/测试。

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

我的意思是它不应该

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

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

从我读过的内容来看,SecurityManager似乎无法完成所有这些......

3 个答案:

答案 0 :(得分:2)

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

#include <tunables/global>

/path/to/executable {
  #include <abstractions/base>

  # 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 </dev/urandom>

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

有一个很好的解释,你可以在这里沙箱JVM: How does google app engine sandbox work?