大家好,
我正在设计一个基于云的服务,该服务将提供执行客户端提交的“插件”代码的选项。为了使其正常工作,必须确保插件无法威胁系统完整性或访问其他客户端的数据。
理想情况下,我希望客户能够提交一个简单的jar文件(包含符合某些预定义接口的类),然后在沙箱内运行它。
客户端代码应该被允许:
- 在单个线程上使用尽可能多的CPU时间
- 使用标准java类(例如java.lang.Math、java.util.Random等)执行任何计算
- 调用在jar中捆绑的任何库(但必须受到相同限制)
但我需要明确禁止以下内容:
- 生成新线程(以便服务器资源可以公平管理!)
- 访问文件系统/IO/网络
- 访问本地代码
- 访问JVM中除传递给/由客户端代码创建的数据之外的数据
- 访问除.jar沙箱中的类之外的其他类的反射
- 除了标准Java库之外,任何调用沙箱外对象的方法的能力
使用自定义ClassLoader / SecurityManager设置是否能够实现这一点?还是我需要开始寻找更复杂的解决方案(例如启动多个JVM)?