WebLogic安全架构与JAAS编程全解析
立即解锁
发布时间: 2025-08-24 00:57:32 阅读量: 1 订阅数: 6 

### WebLogic安全架构与JAAS编程全解析
#### 1. WebLogic安全领域对比
WebLogic Server拥有自己的安全领域,这与WebLogic Enterprise Domain的安全领域不同。要将经过身份验证的用户的身份信息从WebLogic Server传播到WebLogic Enterprise Domain,唯一的方法是使用WLEC,这被称为安全上下文传播。这种安全传播是单向的,即WebLogic Server包含的安全信息将被WebLogic Enterprise Domain检索,反之则不行。这意味着必须形成一个包含IIOP连接的受信任CORBA池。安全上下文传播通过IIOP连接池中的一个连接在网络连接上发送,每个网络连接都使用定义的用户身份进行了身份验证。在IIOP处理程序中使用插件将主体更改为令牌。
为了传递用户身份的身份验证和授权信息,使用了一对令牌。这些令牌会跨越WebLogic Enterprise Domain传播到目标WebLogic Server进行身份验证和授权,然后再传播到需要使用它们来访问资源的EJB或CORBA对象。可以使用SSL来保护从WebLogic Server安全领域发送的请求,SSL可用于IIOP请求和RMI请求。要使用SSL,WebLogic Connectivity和WebLogic Enterprise应用程序都需要配置为支持该协议。
#### 2. WebLogic安全模型的授权层
WebLogic安全模型中的下一层安全是授权。WebLogic Server通过使用访问控制列表(ACLs)来进行授权。WebLogic Server中的授权列表存储在安全领域中,这些安全领域代表用户、组和允许用户访问资源的访问控制列表。默认情况下,WebLogic Server使用文件作为安全领域,但也可以将其设置为适用于Windows NT、Unix、LDAP和自定义开发的安全领域。要使用安全领域访问资源,用户必须在具有该资源权限的安全领域中定义。WebLogic Server确定调用WebLogic Server资源上的方法所需的权限集,如果调用用户至少拥有其中一个所需权限,WebLogic Server将允许调用该方法。
通过将安全上下文从WebLogic Server安全领域传递到WebLogic Enterprise域,可以实现从身份验证层到授权层的安全传播,这可以通过使用WebLogic Enterprise Connectivity(WLEC)来完成。
#### 3. WebLogic安全架构总结
WebLogic Server的安全架构解决了常见的安全问题,并为新兴的Java和J2EE安全API提供支持。BEA在支持当前的Java安全API和协议方面做得很好,并将其扩展用于WLS 6.1。本章展示的JAAS示例表明,其中一个区别是将JAAS扩展为支持WLS安全领域,而不是策略文件。WLS分发的参考示例类似于Sun对Java安全协议的参考实现,这使架构师能够将未来的Java扩展纳入当前架构。
目前,没有多少应用服务器像WebLogic Server那样支持JAAS。支持整个企业安全似乎缺少的唯一部分是对文件完整性的支持,这仅仅是因为WebLogic Server不是目录和文件服务器,而是应用服务器。这意味着组织仍然需要对WebLogic Server之外的一些对象负责。解决安全问题仍然是一项全职工作,当购买像WebLogic Server这样的工具时,特定组织仍然有很多设置和编程需求。
WebLogic Server只是一个工具,如果攻击者仍然进入了系统,这不是工具的错,而是其实现方式以及组织为防范攻击者而制定的安全策略的问题。这要求为安全问题实施WLS 6.1的人员不能仅仅使用该产品,还必须花时间在新闻组中搜索并联系客户支持,以确保程序始终保持最新状态,并确保WLS和Java得到正确实施。可以随时进行增强,以确保当前的攻击威胁得到遏制。全面了解应用服务器提供的安全功能以及企业的整体安全方法对于获得所需的企业安全至关重要。
#### 4. JAAS编程简介
JAAS 1.0是Sun提供的一个单独的软件包,用于扩展Java软件开发工具包1.3版本,作为JNDI身份验证过程的替代方案。它是Java SDK 1.4 Beta的标准组件。这意味着至少必须安装并使用Java软件开发工具包1.3版本进行开发。JAAS机制用于从Java客户端通过WebLogic Server对主体进行身份验证。由于使用了安全领域,JAAS中没有为WebLogic Server提供授权组件。要了解如何对WebLogic Server的JAAS实现进行编程,必须首先了解如何对Sun的JAAS实现进行编程。
JAAS v1.0架构由以下类组成:
- `javax.security.auth.Subject`:表示请求的来源,可以是具有一组公共和私有凭据的个人或组。在用户身份验证或登录成功完成时创建Subject对象。
- `javax.security.auth.login.LoginContext`:提供启动登录、注销的基本API,并获取经过身份验证的Subject以进行授权。
- `javax.security.auth.login.Configuration`:是指定从LoginConext使用哪个LoginModule的配置对象。
- `javax.security.auth.spi.LoginModule`:为支持JAAS的提供商提供特定身份验证技术实现的模块,也是实际执行身份验证的对象。
- `javax.security.auth.callback.Callback`:是与CallbackHandler接口的对象,允许安全服务与调用应用程序交互以检索特定数据,如用户名和密码。使用的回调类型基于LoginModule的类型。
- `javax.security.auth.callback.Callback.CallbackHandler`:作为LoginContext和LoginModule之间的机制传递,用于与主体通信以获取身份验证机制。该机制用于向LoginModule提供信息和从其获取信息,信息通过Callback对象传递。
#### 5. 编写和配置LoginContext
要创建用于身份验证的Java客户端,第一步是将登录机制与LoginContext关联。登录机制是LoginModule的实现。当构造LoginContext时,LoginModule和CallbackHandler实例会在那时与之关联。LoginModule不是硬编码到LoginContext中,而是通过Configuration对象分发。在LoginContext中调用的只是存储在配置文件中的引用,用于指定要安装的登录机制。这样,无需更改代码,只需更改配置即可插入登录机制。
以下是启动LoginContext的示例代码:
```java
/**
* Sample client for JAAS user authentication
*/
public class Sample {
/**
* Attempt to authenticate the user.
*/
public static void main(String[] args) {
LoginContext loginContext = null;
/**
* Set JAAS server url system property and create a LoginContext
*/
try {
// Create LoginContext
loginContext = new LoginContext("Sample",
new MyCallbackHandler());
} catch (SecurityException se) {
se.printStackTrace();
} catch (LoginException le) {
le.printStackTrace();
}
/**
* Attempt authentication
*/
try {
// If we return without an exception, authentication succeeded
loginContext.login();
} catch (FailedLoginException fle) {
System.out.println("Authentication Failed, " +
fle.getMessage());
} catch (AccountExpiredException aee) {
System.out.println("Authentication Failed: Account Expired");
} catch (CredentialExpiredException cee) {
System.out.println("Authentication Failed: CredentialsExpired");
} catch (Exception e) {
System.out.println("Authentication Failed: Unexpected Exception, "
+ e.getMessage());
e.printStackTrace();
}
/**
* Retrieve authenticated subject, perform SampleAction as Subject
*/
Subject subject = loginContext.getSubject();
SampleAction sampleAction = new SampleAction();
Subject.doAs(subject, sampleAction);
System.exit(0);
}
}
```
在LoginContext创建过程中,CallbackHandler的实例会传递给底层的LoginModule,以便Subject和LoginModule进行通信。LoginModule的配置必须成功,身份验证才能成功。可以发现,LoginModule和LoginContext之间从不直接交互,而是通过配置对象和CallbackHandler等中介进行交互。
Java客户端创建LoginContext对象后,必须调用login()函数。该函数将依次调用LoginContext创建时定义的每个LoginModule对象的login()函数。无论login()函数是否失败,该方法都会通过调用LoginModules的commit或abort函数完成两阶段身份验证过程。如果login()函数成功进行身份验证,则调用commit()函数将主体和凭据与Subject关联;如果失败,则调用abort()函数清理用于验证的任何资源。Subject的login()函数成功完成且没有抛出异常,则身份验证成功;否则,身份验证失败。身份验证成功后,可以在LoginContext上调用getSubject()函数获取当前经过身份验证的Subject。要获取Subject上的主体,可以在Subject对象上调用getPrincipals()函数;要获取当前凭据,可以在当前Subject对象上调用getCredentials()函数。
配置决定了将应用于LoginContext的LoginModule
0
0
复制全文
相关推荐










