如何在WebSphere上为远程EJB调用启用Kerberos身份validation?

由于经典的JNDI查找和RMI-IIOP方法调用,我的应用程序是一个独立的Swing客户端调用EJB无状态会话bean。 它作为Java WebStart应用程序启动。 我的目标是使用getCallerPrincipal方法从EJBContext检索客户端用户的身份,这要归功于Windows工作站,ActiveDirectory和Linux上运行的WebSphere服务器之间的Kerberos SSO。

由于信息中心文档,我已经在网络部署模式下成功配置了我的WebSphere单元以支持Kerberos身份validation。

krb5.confkrb5.keytab文件都可以使用Linux kinitklistwsadmin进行测试, $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.kdcjava.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的唯一可用值是nonesimplestrongstrong尚未实现。

另一点:根据生成的日志,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。