Welcome

首页 / 软件开发 / JAVA / 基于Java 2运行时安全模型的线程协作

基于Java 2运行时安全模型的线程协作2009-11-09 IBM 李三红

在Java 2之前的版本,运行时的安全模型使用非常严格受限的沙箱模型(Sandbox)。读者应该熟悉,Java 不受信的Applet代码就是基于这个严格受限的沙箱模型来提供运行时的安全检查。沙箱模型的本质是,任何本地运行的代码都是受信的,有完全的权限来存取关键的系统资源。而对于Applet,则属于不受信的代码,只能访问沙箱范围内有限的资源。当然,您可以通过数字签名的方式配置您的Applet为受信的代码,具有同本地代码一样的权限。

从Java 2开始,Java 提供了基于策略(Policy)与堆栈授权的运行时安全模型,它是一个更加细粒度的存取控制,易于配置与扩展,其总体的架构如图 1 所示:

图 1.Java 2安全模型

简单来讲,当类由类装载器(Class Loader)载入到 JVM 运行,这些运行时的类会根据 Java Policy 文件的配置,被赋予不同的权限。当这些类要访问某些系统资源(例如打开 Socket、读写文件等),或者执行某些敏感的操作(例如存取密码)时,Java 的安全管理器(ava.lang.SecuirtyManager)的检查权限方法将被调用,检查这些类是否具有必要的权限来执行该操作。

在继续深入讨论之前,我们先来澄清下面的几个概念:

策略,即系统安全策略,由用户或者管理员配置,用来配置执行代码的权限。运行时的 java.security.Policy 对象用来代表该策略文件。

权限,Java 定义了层次结构的权限对象,所有权限对象的根类是 java.security.Permission。权限的定义涉及两个核心属性:目标(Target)与动作 (Action)。例如对于文件相关的权限定义,其目标就是文件或者目录,其动作包括:读,写,删除等。

保护域,保护域可以理解为具有共同的权限集的类的集合。

在Java 2里,权限实际上是被赋予保护域的,而不是直接赋给类。权限、保护域和类之间的映射关系如图 2。

图 2. 类,保护域,权限的映射关系

如图 2 所示,当前运行时堆栈是从 a.class 到 e.class。在运行时堆栈上的每一帧(Stack Frame)都会被 Java 划归为某个保护域(保护域是 Java 根据 Policy 文件配置构建出来的)。Java 的安全管理器在执行权限检查时,会对堆栈上的每个 Stack Frame 做权限检查,当且仅当每个 Stack Frame 被赋予的权限集都暗含(Imply)了所要求的权限时,该操作才被允许执行,否则 java.security.AccessControlException 异常将被抛出,该操作执行失败。