【问题标题】:Creating a sandboxed plugin-extensible application in Java在 Java 中创建沙盒插件可扩展应用程序
【发布时间】:2012-06-22 21:01:34
【问题描述】:

这个问题和this one很相似,但是我需要专注于不同的问题。

假设我有一个带有大型数据库(即电影数据库)的应用程序。应用程序的用户应该能够添加自己的插件并能够运行它们。

场景可能如下所示:

  • 启动主应用程序
  • 将 stats-plugin.jar 放在 /app/plugins 目录中
  • 告诉主应用加载新插件
  • 告诉应用列出插件
  • 选择一个插件(例如刚刚安装的那个)并运行它
  • stats-plugin.jar 查询电影数据库并统计恐怖电影,返回计数
  • 主应用显示结果


每个插件都可以有几个标准方法(一个常见的Plugin 接口)可以被调用,例如onInitializeonRun

主应用需要保证的是,如果插件崩溃(例如除以 0),主应用将保持稳定(例如会显示错误对话框,但不会自行崩溃)。还应该可以限制执行时间并检查插件正在执行的操作。

这一切都归结为一个沙盒插件环境。最重要的事情是:插件式的可扩展性和沙箱插件 - 只允许安全操作(例如读取数据库,但不更新它)。

插件不必用 Java 编写。它需要以某种方式可执行......它甚至可以是一个 JavaScript 文件......如果可能的话。

你会如何处理这样的任务?

【问题讨论】:

    标签: java security plugins


    【解决方案1】:

    我不认为 java 是运行不受信任插件的合适平台。一旦插件运行,它将能够执行宿主程序可以执行的所有操作。

    您需要创建自己的抽象层和“安全”操作沙箱 作为主程序的一部分执行。该插件可以提供您解释的数据 作为一个程序。你不能让插件运行。

    【讨论】:

      【解决方案2】:

      您应该考虑使用Security Manager,并可能定义一些您自己的权限。在定义策略时,已经有一组常用的权限可供您使用。

      请注意,对 RDBMS 的只读访问不太可能在您的 Java 环境范围内。相反,这通常使用具有特定权限的单独 RDBMS 用户来处理。您的框架需要使用该用户名连接到数据库。

      【讨论】:

      • RW 操作只是一个例子。假设应用程序有公共方法readwrite(等等),一旦插件被调用,它就可以与主应用程序通信(例如请求记录)。另一方面,非捆绑(非原创)插件不允许调用write。如何做到这一点?反射?
      • 您的框架应该在需要的地方调用checkPermission(例如在您的read/write 方法中),以处理您的自定义权限。可以根据位置(代码库)将策略限制为某些类:您必须确保您的类加载器在加载插件时正确设置它。总体而言,这可能是一个相当复杂的系统。 This question 应该很有趣。
      • 好吧,你的建议可能是一个不错的建议,但经过短暂的研究后,我根本不允许使用 java 插件 ;)
      【解决方案3】:

      使用您自己的安全策略文件和您自己的安全管理器可以执行类似的操作。基本上,授予您自己的 jar AllPermission 和插件 jar 较少的权限。但是,这样一来,您将无法限制不受信任的小程序可用的操作,因此仍然可以编写创建无限循环或分配 100GB RAM 的线程。

      为了允许数据库访问但只允许特定操作,您必须提供自己的 API(位于您信任的 Jar 之一中),该 API 将仅提供受信任的操作(例如首先验证 SELECT 语句)并随后调用 AccessController.doPrivileged如果信任它来执行操作。由于不受信任的代码可能无法打开套接字连接(除非允许特定主机),因此代码将无法以这种方式与数据库发生冲突。

      但是,正确实现安全管理器可能会很棘手(在实现中经常会发现错误,例如最近在 Batik Squiggle 中),因此使用模拟语言(例如 JavaScript/Rhino)可能会更安全。

      【讨论】:

        【解决方案4】:

        您也许可以使用 Java Authentication and Authorization Service 实现这样的可插拔架构。使用 JAAS,您可以执行具有受限访问控制权限的插件。 ACL 可以限制打开套接字连接、写入文件、打开数据库连接等,

        对于数据库访问,您可以通过 JNDI 数据源提供与插件的数据库连接,并使用只能读取而不能更新数据库的 DB 用户配置数据源。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-05
          • 1970-01-01
          相关资源
          最近更新 更多