《电子技术应用》
您所在的位置:首页 > 其他 > 业界动态 > 基于JAAS实现分布式仿真应用的安全

基于JAAS实现分布式仿真应用的安全

2008-12-22
作者:闫波,吕艳琴

1  引言
    在国内目前的技术条件下,新一代仿真系统" title="仿真系统">仿真系统的研制中,基于HLA协议或者DIS/HLA结合,实现多武器平台联动、诸军兵种协调、海陆空联合演练的复杂大系统,将是对目前军用仿真技术的一个挑战。复杂大系统的仿真,其各个仿真器节点地理分布上的大跨度决定了仿真支撑平台是一个基于网络的分布式平台。对于一个涉及多种异构平台、包含成百上千仿真实体的分布式仿真系统来说,仿真模型及其动态数据的管理,是分布式仿真支撑平台的基本功能。
    基于CORBA、JAVA中间层的RTI参考标准数据服务功能的概念设计和实现技术是核心研究内容之一,它是连接前端用户与后台分布式实时数据库的纽带。目前,分布式应用主要有以下几种标准, Com、Corba 和J2EE是三种最主要的标准,中间层的实现基本上是基于以上三种标准。Com/Dcom: 由微软开发基于COM的一个分布式对象技术,它是微软全部商业应用的基础。DCOM也是一个BUS构架的,对于COM对象可以即插即用,DCOM模型最适合于Windows/Windows NT环境。但缺点是局限于Windows 的产品系列;CORBA(Common Object Request Broker Architecture):一项由OMG(对象管理组织)所开发的技术,表示公共对象请求代理体系结构,核心的思想是对象BUS的概念,它允许对象即插即用。CORBA 中IIOP可以跨语言,跨厂商进行操作,在CORBA中面向对象仅仅限制为通过引用传递的对象或者在整体框架中预定义。它主要包括三个部分:接口定义语言(IDL),对象请求代理(ORB),ORB间的互操作协议IIOP。CORBA是基于对象管理体系结构的,OMA为创建分布式应用程序" title="应用程序">应用程序定义了广泛的体系结构。Corba标准能够跨平台,但由于各Unix厂商对Corba执行得不够彻底,互联比较困难; Sun公司发起的J2EE是现在市场上的主流产品。J2EE标准是过去几年中形成的一个与厂家无关的公共标准,它将许多分散的Java技术整合到一起,组合成一个完整的企业标准。因此考虑到分布式仿真应用" title="仿真应用">仿真应用实际情况,如分布性、异构平台等特点,要保证应用的伸缩性、灵活性和高可用性,综合DCOM、CORBA和J2EE的特性,在这里我们选择J2EE作为分布式仿真应用中间层的实现标准。由于分布式节点实现透明访问的特性,则系统的安全体系至关重要,在这里使用JAAS结合系统本身的特点实现用户登录认证和授权访问。下图是分布式仿真应用的总体结构图。

2 J2EE和JAAS
2.1  J2EE框架
    J2EE是一种利用JAVA2平台来简化诸多与多级企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE不但巩固了J2SE中许多优点,如“编写一次,到处运行”的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等,还提供了对EJB,SERVLET,JSP和XML的支持。J2EE使用EJB SERVER作为商业组件的部署环境,并且还提供了支持高可用性和高性能的集群技术、失败的自动转移和恢复、应用负载均衡等。J2EE技术提供了一种基于组件的方法来设计、开发、装配和部署应用程序。J2EE服务器以容器的形式为每一个组件类型提供底层服务。容器设置定制了由J2EE服务器提供的底层支持,这包括诸如安全性、事务管理、Java命名目录接口(JNDI)等。JAAS是JAVA 认证和授权服务,是J2EE内嵌的功能。JAAS API 是为用户认证和授权而设计的一套JAVA包。它实现了标准可插入认证模块PAM的JAVA版本,还相应的扩展了Java2平台的访问控制结构来支持授权。
2.2  JAAS技术
JAVA认证和授权服务(JAAS)是J2EE开发包1.3版本的扩展,和1.4版本的一部分。Java 2 平台为访问各种可用的身份识别的方法提供了最为全面一套接口。 Java 平台更为和各种身份认证" title="身份认证">身份认证系统的交互提供了一个服务接口,即 Java 身份认证和授权服务 (JAAS) API。用这个接口,作为服务供应商能够执行高安全性的身份认证,并允许 JAAS 为希望使用哪种身份认证方法的应用程序提供通用接口。可以直接利用J2EE本身提供的JAAS安全服务来保证服务器的安全。Java认证和授权服务JAAS为J2EE应用程序提供了一个方法以为一个特定的用户或一组用户进行认证和授权。JAAS是标准的可插入认证模块PAM结构的Java版本,它对Java 2平台的安全认证框架进行了扩展以支持基于用户的安全认证。JAAS是Java 认证和授权服务。简单的说,认证实际上就是确认用户的身份,而授权是给特定的用户合适的访问权限,使其不越权访问。JAAS API 是为用户认证和授权而设计的一套JAVA包。它实现了标准可插入认证模块PAM的JAVA版本,还相应的扩展了JAVA2平台的访问控制结构来支持授权。
3  基于JASS设计实现用户认证和授权服务
    当某个用户要访问后台的分布式企业应用时,应用程序首先验证用户的身份,通过了用户身份认证之后,然后查看用户是否有对于应用程序的具体模块具有访问权限。
3.1  身份验证
    Login.config作为配置文件,仿真系统使用Login.config文件来指定每个登录模块的认证项。Login.config 文件包含 LoginContext 构造器中引用的文本字符串和登录过程列表。几个参数用于指定一个给定的登录过程的成功或失败对总体认证过程的影响。有如下参数:
· required 表示登录模块必须成功。即使它不成功,还将调用其它登录模块。
· optional 表示登录模块可以失败,但如果另一个登录模块成功,总体登录仍可以成功。如果所有登录模块都是可选的,那么要使整个认证成功至少必须有一个模块是成功的。
· requisite 表示登录模块必须成功,而且如果它失败,将不调用其它登录模块。
· sufficient 表示如果登录模块成功,则总体登录将成功,同时假设没有其它必需或必不可少的登录模块失败。
应用程序调入登录环境LoginContext, LoginContext 是一种用于设置登录过程的 Java 类,它进行实际的登录,如果登录成功,获取 Subject。LoginContext将参考Login.config的配置来进行实际的登录认证。它有如下四种主要方法:
· 构造器loginContext()。它把 login.config 文件中使用的字符串作为其第一个参数,把执行实际任务的回调" title="回调">回调处理程序作为其第二个参数。
· login(),它根据 login.config文件中指定的规范实际登录。
· getSubject(),如果登录总体成功,它返回经认证的 Subject。
· logout(),它向 LoginContext注销 Subject。
每个登录模块以不同的方式认证用户,传统的基于口令的登录模块要求输入用户名和密码;智能卡登录模块要求用户插卡并验证PIN;生物型的登录模块要求输入用户名并且验证用户的指纹。针对应用程序的安全需求,系统管理员可以在一个应用程序中插入多个登录模块,实现多层的认证。登录模块主要有以下方法提供登录管理:
· initialize( subject,callbackHandler, ,) 初始化登录模块。
· login() 设置任何必需的回调,调用 CallbackHandler 来处理它们,并将返回的信息(即用户名和密码)与允许值进行比较。如果匹配,则登录模块成功,尽管仍可能因为另一个登录模块不成功而异常终止它,这取决于 login.config 文件中的设置。
· commit() 作为两阶段提交过程的一部分被调用以确定是否成功。如果根据 login.config 文件中指定的约束,所有登录模块都是成功的,那么新的 Principal 随同用户名一起创建,并被添加到 Subject 的主体集。
· abort(),如果总体登录未成功,则调用它;如果发生异常终止,必须清除内部的登录模块状态。
· logout() 被调用以除去 Subject 的主体集中的 Principal 并执行其它内部状态清除。
用户按照Login.config配置中规定的顺序被登录模块认证。一般的,不管前一个登录模块是否登陆成功,用户继续被堆栈里的登录模块认证。只有当所有必需的登录模块成功后,LoginContext才会返回一个认证成功标识给应用程序。LoginContext用两个阶段来执行这个步骤。两个阶段都必须成功完成,LoginContext才能返回标识总体认证成功的状态。
这两个阶段包括:
(1)LoginContext调用每个配置过的登录模块,并且指引它验证主题的身份,如果所有的登录模块成功通过这个阶段,LoginContex就进入第二个阶段。
(2)LoginContext再次调用每个配置过的登录模块,指引它正式的执行认证。在此阶段,每个登录模块都会将主题与相关的含有用户名和主题的证件的主体联系起来。
JAAS登录使用回调处理程序来获取用户的认证信息。CallbackHandler 是在 LoginContext 对象的构造函数中指定的。回调处理程序使用几个提示来获取用户的用户名和密码信息。从登录模块调用的处理程序的handle()方法将Callback数组对象作为其参数。在登录期间,处理程序遍历Callback数组。handle()方法检查Callback对象的类型并执行适当的用户操作。LoginContext通过允许应用程序规定Callback来解决这个问题,它底层的登录模块可以与用户相互作用。应用程序提供一个CallbackHander给Login Context,这样LoginContext可以直接把它传递给每个登录模块。所以每个登录模块可以调用Callback来收集或显示相关信息。
现在假设登陆模块LoginM1和LonginM2,且这两个登陆模块都要求必须成功,则登陆流程如下:

3.2 授权访问
    如果该用户已经通过系统认证,则系统产生一个JAAS Subject 。要实现用户对方法级的访问则要通过安全拦截器的检查,在系统中我们使用角色与一个用户集合关联,角色被映射到特定的Subject或者特定的用户组,当角色被映射到一个Subject时,特殊的角色敏感的操作所涉及到的Subject名与从角色中提取的Subject名进行比较以决定操作是否允许执行。当角色被映射到一个组时,与一个特殊的角色敏感操作所涉及到的Subject相关的组与从角色中提取的组进行比较以决定操作是否允许执行。这种基于角色的访问控制要求维护一个角色列表并建立从角色到用户或者用户组的映射。
    以下是系统授权的一些基本步骤:
    第一步:从EJB容器获得允许访问EJB方法的角色名,角色名是有包含调用方法的方法允许元素中的ejb-jar.xml描述器角色名元素决定的。
    第二步:如果没有指定角色,或者方法在exclude-list元素中指定,那么访问该方法就被否决了。否则,安全拦截器就调用JaasSecurityManager.doesUserHaveRole()方法来查看调用者是否有指定的一个角色名。DoesUserHaveRole方法重申了角色名并检查认证过的用户的角色群是否包含指定的用户名的简单主体.如果有任何一个角色名在角色群中,访问就被允许。否则,就否决。
    第三步:如果EJB配置了专业的安全策略,调用方法就传递给安全策略。如果安全策略想否决调用者的访问,将生成一个java.lang.SecurityException。如果没有java.lang.SecurityException生成,访问EJB方法将被允许,而且方法调用将被送到下一个容器拦截器进行相关的处理。

    假设安全域名为SecurityDomain,则授权流程如下:

 

4 结论
    JAVA的JAAS技术结合分布式仿真应用的要求,实现了系统的安全体系,只有通过JAAS的认证和授权,用户才能够安全的访问后台分布式数据库或文件系统以及相对应的业务逻辑操作。

参考文献
1.Scott Stark and The Jboss Group.Jboss Administration And Development[M]. Jboss Administration And   Development Second Edition,2002
2.Li Gong.Inside Java 2 Platform Security :Architecture ,Api design,and Implementation[M].Sun Microsystem,Inc,1999
3.Brad Rubin.Java Authentication and Authorization Service[DB/OL]. http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/java-onlinecourse-bytitle/021011
4. 谢杨. J2EE核心技术[N].计算机世界网, 2002-6-26

 

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。