我正在考虑建立一个简单的在线服务,人们可以通过提交解决方案解决编程练习,以源代码的形式,到我的服务器,在那里然后解释/编译并执行/测试。
通过使用Java VM,我可以提供对Java,Scala,Clojure,Ruby,Python和Javascript的支持。但是当我仔细考虑它时,恐怕我不知道如何限制脚本的资源和权限。
我的意思是它不应该
如何将每个脚本放在沙盒中?
从我读过的内容来看,SecurityManager似乎无法完成所有这些......
答案 0 :(得分:2)
好吧,您可以使用一些通用安全系统来确保安全的代码执行,例如AppArmor或SELinux。 它不仅适用于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?