论文部分内容阅读
摘要:应用程序安全是一个综合性的课题,它需要在权衡各方面的因素之后,再作出安全策略。因此,本文研究了 Java 应用程序安全,分析了 Java 平台自身的安全体系结构,并且还说明了安全策略的具体实施办法。通过本文的分析,使我们不但从总体上对 Java 应用程序的安全体系有比较清晰的认识,而且对安全思想也有比较深入的分析和理解。
关键词:JAVA;安全体系;安全策略
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)27-1943-01
1 JAVA 安全体系结构
Java 的安全模型是由安全策略、访问许可、保护域、访问控制检查、权限操作以及类加载和解析等部分组成。安全策略和访问许可定义了哪些动作是允许的,而保护域和访问控制检查则提供了执行的功能,权限操作、类加载和解析则对整个保护机制是很有帮助的。
因此,Java2 安全体系结构的优势体现在以下几方面:
1) 安全策略的内容和安全机制的实现彻底分开,也和安全接口分离开来,这为以后的升级和发展提供了最大的空间。它让策略配置和运行时环境完全分离开来,从而减少系统管理的复杂性。
2) 访问控制算法和其检查许可语义清晰地分离开来。与此同时,访问控制许可既能静态表示也能动态表示,并且每个许可权限类可以定义它自己的语义。
3) 安全类加载机制和委托机制扩展了 Java 应用程序安全覆盖,这就使得对于所有 Java 代码,不管它们来自哪里以及状态如何,都采用了统一的安全体系结构和策略。
2 安全策略
Java 运行时环境的安全行为由安全策略来指定,安全策略是一个典型的访问控制矩阵,即什么样的系统资源、用哪种形式、在哪些环境下可以被访问。一个安全策略是从描述运行代码的一系列特征到代码允许的访问许可权限之间的映射。
2.1 许可权限
许可权限(Permissions)描述了系统资源和系统资源所支持的操作,每个许可权限有一个名字,也有一个操作列表,如:名字为“/resourec/temp.txt”,操作为“read”,表明文件/resourec/temp.txt的读权限。许可权限被用于指定一个策略所允许的访问资源,同时又表明在运行时进行安全敏感操作前需要什么样的许可权限。如果安全策略中有权限,就可以说授予了权限,如果没有权限则意味着权限的拒绝。
许可权限类(Permission)的根类是java.security.Permission,这是一个抽象类,它的子类用来代表特定的访问控制。新的许可权限或者是 Permission 类的子类,或者是它的子类的子类。
常见的许可权限类有:BasicPermission类、AllPermission类以及UnresolvedPermission 类。BasicPermission类也是一个抽象类,它的操作只能由它的子类来实现。AllPermission 类用来描述所有的许可权限,它隐含所有的许可权限,而且,任意两个 AllPermission 对象总是被认为相等的。另外UnresolvedPermission 类用来控制“未决的(unresolved)”许可权限,但系统从不认为一个 UnresolvedPermission 隐含有另一个许可权限。最后,为了能一次处理多个许可权限,定义了特定类型许可权限集合(PermissionCollection),从而,对同类型的多个 Permission 对象一次处理。
2.2 保护域
保护域(ProtectionDomain)是当前 Java 安全模型的核心概念,它提供了更加细粒度的安全控制。这里的域指的是操作环境中要保护的部分,是用来对组件分组或对被保护资源分组的一个抽象概念,它将具有同样权限的类归在一个组里面。在安全策略中定义了保护域,但它实际上是将各种技术、API和基本的Java体系结构组合在一起保护应用程序的集合。
在 Java 的安全体系结构中将保护域分为系统保护域与应用保护域。前者对文件系统或网络套接字(socket)等系统资源的访问加以控制。而后者对各种组件或应用程序某部分的访问进行控制,它是针对具体应用程序的。应用保护域涉及到商业逻辑的执行,允许应用程序代码中敏感部分的执行,从而常常与商业应用的安全规则密切相关。应用保护域使用应用安全(例如,使用 AS 包或 J2EE 的容器管理安全机制)增强了当前的安全策略。然而,应用安全通常使用定制的权限来限制对特权代码的访问。通过 BasicPermission 的子类可以创建这些定制权限,这些权限和对这些权限进行检查的代码一起用于建立应用保护域。
2.3 策略配置
可以为 Java 应用程序配置三种类型的安全策略文件:系统安全策略文件、放有用户根目录下的用户策略文件,以及应用程序选择加载的应用安全策略文件。
(下转第1949页)
(上接第1943页)
安全策略文件指定了允许从特定代码来源和所有人的代码访问许可权限,这些许可权限主要指系统资源访问的类型。为了能让一个程序获得安全运行的许可权,比如读写一个文件,它必须被授予这个特定动作的权限。当采用默认的Policy实现时,必须在许可文件中通过许可条目来授予其权限。由默认 Policy 实现读取的策略配置文件的语法包括一个条目表。
3 执行安全策略
安全策略执行环境由SecurityManager、AccessControlContext、DomainCombiner和AccessController四个类构成。
3.1 SecurityManager类
Java.lang.SecurityManager 从 JDK1.0 中引入,它是访问控制的关键。当需要决定是否授予或者拒绝安全敏感资源的访问时,都要调用安全管理器(SecurityManager)。Sun.applet.AppletSecurity 类是 SecurityManager 类的一个例子,也是 SecurityManager 类的子例,它实现了 JDK1.0 版本中的砂盒安全模型。根据这一模型,本地文件系统上的应用程序类具有所有的系统访问权,而 applets(即通过网络加载的远程类)除了具有特殊授予权限之外全部会被拒绝。
3.2 AccessControlContext 类
AccessControlContext 依据其所封装的上下文来决定对系统资源的访问,它封装了一个上下文及一个与 AccessController 类中的 checkPermission 方法等价的 checkPermission 方 法。不同之处在于,AccessController 类 中 的checkPermission 方法根据自身所封装的上下文而不是当前执行线程的上下文来作出访问决策。因此,AccessControlContext 是专门针对那些应该给定上下文内进行安全检查,却需要从其它上下文中执行的情况,例如在工作者线程内。
3.3 DomainCombiner 类
java.Security.DomainCombiner 接口使得外来执行类可以增加并动态升级与当前 AccessControlContext有关的ProtectionDomain,它还增加了对AccessControlContext和AccessController的更改,以支持基于身份(principal)的访问控制。
3.4 AccessController 类
java.security.AccessController作为访问控制算法的一个完整默认实现,具有足够的通用性,可以为大多数应用程序所使用。开发者可以自由地使用它的实现方式,而且用户也可以获得跨不同应用程序和平台的相互兼容的行为。AccessController 中定义的默认 checkPermission 方法调用 SecurityManager 的checkPermission 方法,然后 SecurityManager 委托 AccessController 进行安全决策。
4 结束语
人们从很多安全事件和专家的警告中,渐渐地认识到应用程序安全性的重要性。现在,它也成为信息安全中的一个重要课题,成为大家关注的一个焦点。本文对 Java 应用程序安全性进行了深入的研究和探讨,介绍了Java自身的安全机制,对Java应用程序安全性进行了分析和研讨。Java 通过安全策略保证应用程序在自身的平台上安全运行。
参考文献:
[1] Marc Fleury, Scott Stark, Norman Richards. JBoss 4.0 The Office Guide[M]. 刘凡,贾顺林,邓一凡,译. 北京:电子工业出版社,2006.
[2] Art Taylor, Randy Layman, Brian Buege. Haking Exposed J2EE
关键词:JAVA;安全体系;安全策略
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)27-1943-01
1 JAVA 安全体系结构
Java 的安全模型是由安全策略、访问许可、保护域、访问控制检查、权限操作以及类加载和解析等部分组成。安全策略和访问许可定义了哪些动作是允许的,而保护域和访问控制检查则提供了执行的功能,权限操作、类加载和解析则对整个保护机制是很有帮助的。
因此,Java2 安全体系结构的优势体现在以下几方面:
1) 安全策略的内容和安全机制的实现彻底分开,也和安全接口分离开来,这为以后的升级和发展提供了最大的空间。它让策略配置和运行时环境完全分离开来,从而减少系统管理的复杂性。
2) 访问控制算法和其检查许可语义清晰地分离开来。与此同时,访问控制许可既能静态表示也能动态表示,并且每个许可权限类可以定义它自己的语义。
3) 安全类加载机制和委托机制扩展了 Java 应用程序安全覆盖,这就使得对于所有 Java 代码,不管它们来自哪里以及状态如何,都采用了统一的安全体系结构和策略。
2 安全策略
Java 运行时环境的安全行为由安全策略来指定,安全策略是一个典型的访问控制矩阵,即什么样的系统资源、用哪种形式、在哪些环境下可以被访问。一个安全策略是从描述运行代码的一系列特征到代码允许的访问许可权限之间的映射。
2.1 许可权限
许可权限(Permissions)描述了系统资源和系统资源所支持的操作,每个许可权限有一个名字,也有一个操作列表,如:名字为“/resourec/temp.txt”,操作为“read”,表明文件/resourec/temp.txt的读权限。许可权限被用于指定一个策略所允许的访问资源,同时又表明在运行时进行安全敏感操作前需要什么样的许可权限。如果安全策略中有权限,就可以说授予了权限,如果没有权限则意味着权限的拒绝。
许可权限类(Permission)的根类是java.security.Permission,这是一个抽象类,它的子类用来代表特定的访问控制。新的许可权限或者是 Permission 类的子类,或者是它的子类的子类。
常见的许可权限类有:BasicPermission类、AllPermission类以及UnresolvedPermission 类。BasicPermission类也是一个抽象类,它的操作只能由它的子类来实现。AllPermission 类用来描述所有的许可权限,它隐含所有的许可权限,而且,任意两个 AllPermission 对象总是被认为相等的。另外UnresolvedPermission 类用来控制“未决的(unresolved)”许可权限,但系统从不认为一个 UnresolvedPermission 隐含有另一个许可权限。最后,为了能一次处理多个许可权限,定义了特定类型许可权限集合(PermissionCollection),从而,对同类型的多个 Permission 对象一次处理。
2.2 保护域
保护域(ProtectionDomain)是当前 Java 安全模型的核心概念,它提供了更加细粒度的安全控制。这里的域指的是操作环境中要保护的部分,是用来对组件分组或对被保护资源分组的一个抽象概念,它将具有同样权限的类归在一个组里面。在安全策略中定义了保护域,但它实际上是将各种技术、API和基本的Java体系结构组合在一起保护应用程序的集合。
在 Java 的安全体系结构中将保护域分为系统保护域与应用保护域。前者对文件系统或网络套接字(socket)等系统资源的访问加以控制。而后者对各种组件或应用程序某部分的访问进行控制,它是针对具体应用程序的。应用保护域涉及到商业逻辑的执行,允许应用程序代码中敏感部分的执行,从而常常与商业应用的安全规则密切相关。应用保护域使用应用安全(例如,使用 AS 包或 J2EE 的容器管理安全机制)增强了当前的安全策略。然而,应用安全通常使用定制的权限来限制对特权代码的访问。通过 BasicPermission 的子类可以创建这些定制权限,这些权限和对这些权限进行检查的代码一起用于建立应用保护域。
2.3 策略配置
可以为 Java 应用程序配置三种类型的安全策略文件:系统安全策略文件、放有用户根目录下的用户策略文件,以及应用程序选择加载的应用安全策略文件。
(下转第1949页)
(上接第1943页)
安全策略文件指定了允许从特定代码来源和所有人的代码访问许可权限,这些许可权限主要指系统资源访问的类型。为了能让一个程序获得安全运行的许可权,比如读写一个文件,它必须被授予这个特定动作的权限。当采用默认的Policy实现时,必须在许可文件中通过许可条目来授予其权限。由默认 Policy 实现读取的策略配置文件的语法包括一个条目表。
3 执行安全策略
安全策略执行环境由SecurityManager、AccessControlContext、DomainCombiner和AccessController四个类构成。
3.1 SecurityManager类
Java.lang.SecurityManager 从 JDK1.0 中引入,它是访问控制的关键。当需要决定是否授予或者拒绝安全敏感资源的访问时,都要调用安全管理器(SecurityManager)。Sun.applet.AppletSecurity 类是 SecurityManager 类的一个例子,也是 SecurityManager 类的子例,它实现了 JDK1.0 版本中的砂盒安全模型。根据这一模型,本地文件系统上的应用程序类具有所有的系统访问权,而 applets(即通过网络加载的远程类)除了具有特殊授予权限之外全部会被拒绝。
3.2 AccessControlContext 类
AccessControlContext 依据其所封装的上下文来决定对系统资源的访问,它封装了一个上下文及一个与 AccessController 类中的 checkPermission 方法等价的 checkPermission 方 法。不同之处在于,AccessController 类 中 的checkPermission 方法根据自身所封装的上下文而不是当前执行线程的上下文来作出访问决策。因此,AccessControlContext 是专门针对那些应该给定上下文内进行安全检查,却需要从其它上下文中执行的情况,例如在工作者线程内。
3.3 DomainCombiner 类
java.Security.DomainCombiner 接口使得外来执行类可以增加并动态升级与当前 AccessControlContext有关的ProtectionDomain,它还增加了对AccessControlContext和AccessController的更改,以支持基于身份(principal)的访问控制。
3.4 AccessController 类
java.security.AccessController作为访问控制算法的一个完整默认实现,具有足够的通用性,可以为大多数应用程序所使用。开发者可以自由地使用它的实现方式,而且用户也可以获得跨不同应用程序和平台的相互兼容的行为。AccessController 中定义的默认 checkPermission 方法调用 SecurityManager 的checkPermission 方法,然后 SecurityManager 委托 AccessController 进行安全决策。
4 结束语
人们从很多安全事件和专家的警告中,渐渐地认识到应用程序安全性的重要性。现在,它也成为信息安全中的一个重要课题,成为大家关注的一个焦点。本文对 Java 应用程序安全性进行了深入的研究和探讨,介绍了Java自身的安全机制,对Java应用程序安全性进行了分析和研讨。Java 通过安全策略保证应用程序在自身的平台上安全运行。
参考文献:
[1] Marc Fleury, Scott Stark, Norman Richards. JBoss 4.0 The Office Guide[M]. 刘凡,贾顺林,邓一凡,译. 北京:电子工业出版社,2006.
[2] Art Taylor, Randy Layman, Brian Buege. Haking Exposed J2EE