如何安全地实现Java插件安全性?

时间:2011-11-26 21:19:41

标签: java multithreading security plugins policy

我正在设计一个用于在Java应用程序中加载,处理和支持插件的系统。在我可以部署之前,我认为其中一个功能绝对至关重要的是能够建立一个安全的环境,其中插件仅限于他们可以做的事情。

我无法理解如何以编程方式使用策略文件,而无需在启动时运行-Djava.security.manager参数。那就是现在。

我的下一个想法是在我自己的SecurityManager子类中覆盖我在SecurityManager中关心的所有方法,并限制谁可以执行它们。

然后问题出现了,通过线程ID检查确定谁在询问此权限的唯一方法。因此,我设计了一个所有插件线程都驻留的系统,并且只能驻留在PluginThreads线程组中。

这很有效......直到一切都爆发了。问题是被阻止的一些事情是由Sun的代码执行的内部操作。

因此,即使是打开窗口等最基本的操作也会失败,因为我的安全经理拒绝访问Sun的代码。使用我的线程检查方法没有任何关系,因为Sun的代码是在PluginThreads组中执行的。

所以我需要知道的是:

1)有没有办法可以找出使用当前线程调用的上下文?

2)有没有更好的方法来做这个我不知道的事情?

3)如果该方法涉及策略文件,您如何将它们加载到代码中?

4)您是否可以考虑使用其他任何方法来阻止Sun的内部Java代码被阻止?

2 个答案:

答案 0 :(得分:1)

SecurityManager是一个可怕的混乱。您应该考虑要求插件以Java的子集编写,以便您能够合理地推断他们可以做什么,而不是迭代地授予更多可能的可滥用权限,直到它看起来有效。

Joe-E提供可分解的安全性。来自http://lambda-the-ultimate.org/node/3830

  

我们提供Joe-E,一种旨在支持安全软件系统开发的语言。 Joe-E是Java的一个子集,可以更轻松地构建和实现具有强安全属性的程序,可以在安全审查期间对其进行检查。它使程序员能够将最小特权原则应用于他们的程序;实现无法绕过的特定于应用程序的参考监视器;引入和使用特定于域的安全抽象; 安全地执行不受信任的代码并与之交互;并构建安全,可扩展的系统。 Joe-E演示了如何实现对象能力语言的强大安全属性,同时保留主流面向对象语言的特性和感觉......

答案 1 :(得分:0)

您需要将java.security.AccessController / AccessControlContextSecurityManager一起使用。 API支持类型为Object的上下文对象,但实际上您需要使用AccessControlContext。要为用户代码提供正确的权限,请通过ProtectionDomain的子类提供相关的SecureClassLoaderURLClassLoader.newInstance是您必须正确行事的合理示例。)

对于GUI应用程序(例如,这包括使用java.beans的特定部分的任何内容),您还需要处理AppContext(在Java库的“Sun”实现中) )。这不是公共API。

线程和线程组不是管理安全性的好方法。不幸的是,这是AppContext隔离工作的一部分。