我正在设计一个用于在Java应用程序中加载,处理和支持插件的系统。在我可以部署之前,我认为其中一个功能绝对至关重要的是能够建立一个安全的环境,其中插件仅限于他们可以做的事情。
我无法理解如何以编程方式使用策略文件,而无需在启动时运行-Djava.security.manager参数。那就是现在。
我的下一个想法是在我自己的SecurityManager子类中覆盖我在SecurityManager中关心的所有方法,并限制谁可以执行它们。
然后问题出现了,通过线程ID检查确定谁在询问此权限的唯一方法。因此,我设计了一个所有插件线程都驻留的系统,并且只能驻留在PluginThreads线程组中。
这很有效......直到一切都爆发了。问题是被阻止的一些事情是由Sun的代码执行的内部操作。
因此,即使是打开窗口等最基本的操作也会失败,因为我的安全经理拒绝访问Sun的代码。使用我的线程检查方法没有任何关系,因为Sun的代码是在PluginThreads组中执行的。
所以我需要知道的是:
1)有没有办法可以找出使用当前线程调用的上下文?
2)有没有更好的方法来做这个我不知道的事情?
3)如果该方法涉及策略文件,您如何将它们加载到代码中?
4)您是否可以考虑使用其他任何方法来阻止Sun的内部Java代码被阻止?
答案 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
/ AccessControlContext
与SecurityManager
一起使用。 API支持类型为Object
的上下文对象,但实际上您需要使用AccessControlContext
。要为用户代码提供正确的权限,请通过ProtectionDomain
的子类提供相关的SecureClassLoader
(URLClassLoader.newInstance
是您必须正确行事的合理示例。)
对于GUI应用程序(例如,这包括使用java.beans
的特定部分的任何内容),您还需要处理AppContext
(在Java库的“Sun”实现中) )。这不是公共API。
线程和线程组不是管理安全性的好方法。不幸的是,这是AppContext
隔离工作的一部分。