如何在WebSphere上为远程EJB调用启用Kerberos身份validation?
由于经典的JNDI查找和RMI-IIOP方法调用,我的应用程序是一个独立的Swing客户端调用EJB无状态会话bean。 它作为Java WebStart应用程序启动。 我的目标是使用getCallerPrincipal
方法从EJBContext
检索客户端用户的身份,这要归功于Windows工作站,ActiveDirectory和Linux上运行的WebSphere服务器之间的Kerberos SSO。
由于信息中心文档,我已经在网络部署模式下成功配置了我的WebSphere单元以支持Kerberos身份validation。
krb5.conf
和krb5.keytab
文件都可以使用Linux kinit
, klist
和wsadmin
进行测试, $AdminTask validateKrbConfig
回答为true
。
客户端设置仅引用JAAS login.config
文件以使用命令系统属性启用。 我的直觉告诉我这可能还不够。
但现在,我找不到更多信息来完成测试用例:
- 如何设置JNDI初始上下文环境以触发Kerberos协商?
- 如果在服务器端有其他要求,比如用角色保护我的EJB(例如JBoss不需要它)?
更新
由于没有使用./launchClient
运行JavaEE客户端容器,我在JNLP中设置了读取sas.client.props
和JAAS登录配置所需的属性:
我的wsjaas_client.config
适用于Oracle Java,因此它包含:
WSKRB5Login{ com.sun.security.auth.module.Krb5LoginModule required debug=true useTicketCache=true doNotPrompt=true; };
我的sas.client.props
包含:
com.ibm.CORBA.securityEnabled=true com.ibm.CORBA.authenticationTarget=KRB5 com.ibm.CORBA.loginSource=krb5Ccache com.ibm.CORBA.loginUserid= com.ibm.CORBA.loginPassword= com.ibm.CORBA.krb5CcacheFile= com.ibm.CORBA.krb5ConfigFile=C:\\temp\\krb5.conf
目前,没有触发Kerberos身份validation:我的kerberos缓存(来自Windows或Linux工作站)中的SPN WAS/myserver.mydomain.com
没有TGS,并且仍然匿名建立JNDI连接。
没有错误信息,没有警告,最后没有校长。 我如何诊断错误或缺乏?
更新2012/06/20
这是向前迈出的一步。 在我的应用程序JNLP中运行Oracle Java,我已设置以下属性以使用IBM ORB并启用完整的跟踪和调试信息:
TraceSettings.properties
文件包含
traceFileName=c:\\temp\\traces.log ORBRas=all=enabled SASRas=all=enabled com.ibm.*=all=enabled
即使在阅读了大量的WebSphere 7 Security IBM RedBook之后,我仍然无法从客户端获得CSIv2触发Kerberos身份validation。
根据GSS-API / Kerberos v5身份validation指南,您必须在调用JNDI上下文之前对Kerberos进行身份validation。 执行Kerberos配置后,您可以按如下方式配置初始上下文:
- 创建初始上下文时,将Context.SECURITY_AUTHENTICATION(在API参考文档中)环境属性设置为字符串“GSSAPI”。
我曾经处理过让Java客户端使用Kerberos(尽管没有使用JNDI)。 这是我在客户端删除对JVM选项和本地配置文件的需求的方法(在客户端尝试进行身份validation之前调用此代码):
public static void initKerberosConfig() { System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); System.setProperty("java.security.krb5.kdc", "host.name:88"); System.setProperty("java.security.krb5.realm", "REALM"); System.setProperty("sun.security.krb5.debug", "false"); Configuration progConfig = getProgramaticLoginConfig(); Configuration.setConfiguration(progConfig); } private static Configuration getProgramaticLoginConfig() { HashMap options = new HashMap(); options.put("useTicketCache", "true"); options.put("doNotPrompt", "true"); AppConfigurationEntry krb5LoginModule = new AppConfigurationEntry("com.sun.security.auth.module.Krb5LoginModule", LoginModuleControlFlag.REQUIRED, options); final AppConfigurationEntry[] aces = new AppConfigurationEntry[]{krb5LoginModule}; Configuration progConfig = new Configuration() { @Override public AppConfigurationEntry[] getAppConfigurationEntry(String arg0) { return aces; } }; return progConfig; }
您可能需要针对您的上下文调整此值( java.security.krb5.kdc
和java.security.krb5.realm
将不正确) – 但我希望它有所帮助。 对于大量的日志记录, sun.security.krb5.debug
true
。
由于您没有在后面的步骤中特别提到,您是否已按照您提供的客户端设置链接配置了sas.client.props?
您可以在WebSphere Application Server环境中检查RedBook 实现Kerberos,以获取有关如何进行此配置的示例,以及Application Client的其余配置。
第13.5节(13.5配置Java EE应用程序客户机)提供了设置胖客户机运行时的示例,包括sas.client.props文件。
总结上下文:我们的部署已经投入生产多年,IBM WebSphere在Linux上运行并部署了应用程序,这要归功于运行在Sun JavaSE 6上的Java WebStart,其中包含IBM ORB并配置为无需任何身份validation即可进行连接。 现在,我们希望通过RMI-IIOP启用Kerberos身份validation和单点登录,自WebSphere 6(我认为)以来一直支持。
现在这里有一些答案。
从WebSphere 7开始,引入了一个新概念来基于每个服务器配置安全性方面: 安全域 。 从理论上讲,安全域中未更改的任何选项都inheritance自全局安全性部分。
在测试Kerberos设置时,我们为测试服务器创建了一个专用安全域,以避免在单元中运行的其他服务器出现问题。
但即使在全局安全性中启用了Kerberos,也不会为配置了自己的安全域的服务器inheritance/启用Kerberos。
一旦我们使用默认的全局安全性运行我们的测试服务器,其中Kerberos选项可见并启用,那么Kerberos身份validation已开始与使用通常ClassPath的cmd bat脚本执行的IBM JavaSE 6以及文档中声明的所有属性一起使用。
注意:永远不会设置JNDI Context.SECURITY_AUTHENTICATION
选项。 在反编译之后,IBM ORB的唯一可用值是none
, simple
且strong
但strong
尚未实现。
另一点:根据生成的日志,IBM ORB无法使用file:/C:/temp/sas.client.config
作为com.ibm.CORBA.ConfigURL
值。 它必须是URI而不是文件路径。 我们甚至无法解析C
主机名的DNS查找! ARFF。 所有文档示例都是基于Unix的file:/path/to/sas.client.config
因此我们在从HTTP服务器传递该文件之前进行了许多试验。
现在部署的Java WebStart部分 :
-
相同的原始JNLP没有任何安全性,没有Kerberos设置与Oracle JavaSE 6和IBM Java 6完美配合
-
在启用了WebSphere安全性和JNLP中的Kerberos(并且只有该更改集)中,在IBM Java 6上运行的IBM ORB向
NoClassDefFoundError
抱怨有关在ClassPath中(仍然/始终)可用的ffdc日志管理器实现。 这听起来像是与Java WebStart安全的ClassLoader层次结构不兼容的代码。 -
使用Kerberos JNLP,在Oracle JavaSE 6上运行的IBM ORB似乎只是忽略安全设置并像往常一样匿名连接。
因此,第一步现在正在运行:IBM Java 6从命令行开始,但尚未完成调查以实现我们的目标:在Java WebStart上下文中使用Oracle JavaSE 6的Kerberos。