【问题标题】:SecurityManager for a cloud service "sandbox"云服务“沙盒”的 SecurityManager
【发布时间】:2011-01-23 17:07:28
【问题描述】:

全部,

我正在设计一种基于云的服务,该服务将提供执行客户提交的某些“插件”代码的选项。为了完成这项工作,插件不能威胁系统完整性或具有任何访问其他客户端数据的能力是至关重要的。

理想情况下,我希望客户可以提交一个简单的 jar 文件(包含符合某些预定义接口的类),然后该文件将在沙箱中运行。

应该允许客户端代码:

  • 在单个线程上占用尽可能多的 CPU 时间
  • 使用标准 java 类(例如 java.lang.Math、java.util.Random 等)执行任何计算
  • 调用捆绑在 jar 中的任何库(但必须遵守相同的限制)

但我特别需要禁止以下内容:

  • 生成新线程(以便公平管理服务器资源!)
  • 对文件系统/IO/网络的任何访问
  • 任何对本机代码的访问
  • 对 JVM 中数据的任何访问,而不是传递给客户端代码/由客户端代码创建的数据
  • 对除 .jar 沙箱中的类以外的类的反射的任何访问
  • 任何在沙盒外(标准 Java 库除外)对象上调用方法的能力

是否可以通过自定义 ClassLoader / SecurityManager 设置来实现这一点?还是我需要开始寻找更复杂的解决方案(例如启动多个 JVM?)

【问题讨论】:

    标签: java security architecture plugins cloud


    【解决方案1】:

    在java中管理资源和限制资源是不可能的。您可以防止恶意代码访问系统资源(磁盘/网络等)或 JVM 本身,但是: ...

    产生新线程(这样服务器资源就可以得到公平的管理!)

    • 如果我想成为恶意软件,我将在终结器线程中执行所有代码并阻止 VM。同样做protected void finalize(synchronized(Thread.class) {for(;;) LockSupport.park();}} 再见新线程。
    • 吃掉所有的记忆,吃掉所有的直接记忆等等。
    • 访问我自己的 jar 中的 zip 文件,并期望它们被移走,因此 JVM 崩溃(由于 zlib 中的错误)

    如果有人故意拒绝资源,试图抓住黑客不是一项可行的任务。您需要知道要搜索什么并在运行时动态检查/增强类以禁止该行为。

    任何在沙箱之外的对象上调用方法的能力,除了标准的 Java 库

    什么是标准库?你知道他们是否/何时必须以特权方法执行某些代码。


    每个客户 - 具有完全限制的独立 VM、进程关联/优先级、包括最大内存/堆栈等。

    【讨论】:

    • 这几乎是 dalvik 模型
    • 你知道,这是一个很好的问题,我不确定。我会尝试找到它并在这里发表另一条评论。顺便说一句,我的意思是你对单独 VM 实例的建议是 Dalvik 所做的,以防万一不清楚。
    【解决方案2】:

    我认为您想要实现的一切都可以通过自定义SecurityManager 来完成。事实上它非常简单,你只需创建一个扩展SecurityManager 的类,实现两个checkPermission(..) 方法,并在第一次迭代中为所有进来的东西抛出一个SecurityException(并记录你刚刚拒绝的内容)。然后您允许特定操作,直到您发现自己可以创建有用的插件并让您的客户使用它。他们抱怨。然后你必须判断是否允许他们做任何他们要求的事情,或者你是否想坚持你的规则。困难的部分从这里开始......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-29
      • 2020-01-27
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2013-08-30
      • 2014-11-16
      相关资源
      最近更新 更多