14

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

感谢 infocenter 文档,我已经成功地将我的 WebSphere 单元配置为网络部署模式以支持 Kerberos 身份验证。

krb5.conf和文件都可以,krb5.keytab并且在 Linux和答案中都经过测试。kinitklistwsadmin$AdminTask validateKrbConfigtrue

客户端设置仅引用 JAASlogin.config文件以使用命令系统属性启用。我的直觉告诉我,这可能还不够。

但是现在,我找不到更多信息来完成测试用例:

  • 必须如何设置 JNDI 初始上下文环境才能触发 Kerberos 协商?
  • 如果服务器端有其他要求,比如用角色保护我的 EJB(例如 JBoss 不需要它)?

更新

由于没有运行 JavaEE 客户端容器./launchClient,我在我的 JNLP 中设置了读取所需的属性sas.client.props和 JAAS 登录配置:

<property name="java.security.auth.login.config" value="C:\temp\wsjaas_client.config"/>
<property name="com.ibm.CORBA.ConfigURL" value="C:\temp\sas.client.props"/>

Mywsjaas_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 身份验证:WAS/myserver.mydomain.com在我的 kerberos 缓存(来自 Windows 或 Linux 工作站)中没有针对 SPN 的 TGS,并且 JNDI 连接仍然是匿名建立的。

没有错误消息,没有警告,最后没有主体。我如何诊断出了什么问题或缺少什么?

更新 2012/06/20

这里有一些前进的步骤。在使用 Oracle Java 运行的应用程序 JNLP 中,我设置了以下属性以使用 IBM ORB 并启用完整的跟踪和调试信息:

<property name="org.omg.CORBA.ORBSingletonClass" value="com.ibm.rmi.corba.ORBSingleton"/>
<property name="org.omg.CORBA.ORBClass" value="com.ibm.CORBA.iiop.ORB"/>
<property name="traceSettingsFile" value="C:\temp\TraceSettings.properties"/>

该文件TraceSettings.properties包含

traceFileName=c:\\temp\\traces.log
ORBRas=all=enabled
SASRas=all=enabled
com.ibm.*=all=enabled

即使在阅读了WebSphere 7 Security IBM RedBook的大部分内容之后,我仍然无法从客户端获得 CSIv2 触发器 Kerberos 身份验证。

4

3 回答 3

6

根据GSS-API/Kerberos v5 身份验证指南,您必须在调用 JNDI 上下文之前对 Kerberos 进行身份验证。执行 Kerberos 配置后,您可以按如下方式配置初始上下文:

  • 创建初始上下文时,将 Context.SECURITY_AUTHENTICATION(在 API 参考文档中)环境属性设置为字符串“GSSAPI”。

过去我处理过让 Java 客户端使用 Kerberos(尽管不是使用 JNDI)。这是我在客户端消除对 JVM 选项和本地配置文件的需要的方法(在客户端尝试进行身份验证之前调用此代码):

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<String, String> options = new HashMap<String, String>(); 
        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大量的日志记录。

于 2012-05-21T22:13:59.387 回答
4

由于您没有在您遵循的步骤中特别提及,您是否按照您提供的客户端设置链接配置了您的 sas.client.props?

您可以查看 RedBook在 WebSphere Application Server Environment中实现 Kerberos,以获取有关如何进行此配置以及 Application Client 的剩余配置的示例。

第 13.5 节(13.5 配置 Java EE 应用程序客户端)提供了设置胖客户端运行时的示例,包括 sas.client.props 文件。

于 2012-05-17T13:02:35.447 回答
3

总结一下上下文:多年来,我们的部署一直在生产中,IBM WebSphere 在 Linux 上运行,并且由于 Java WebStart 在 Sun JavaSE 6 上运行而部署了应用程序,其中包含 IBM ORB 并配置为无需任何身份验证即可连接。现在我们想要通过 RMI-IIOP 启用 Kerberos 身份验证和单点登录,自 WebSphere 6(我认为)就支持了。

现在这里有一些答案。

自 WebSphere 7 以来,引入了一个新概念来基于每个服务器配置安全方面:安全域。理论上,安全域中未更改的任何选项都继承自全局安全部分。

在测试 Kerberos 设置时,我们为我们的测试服务器创建了一个专用的安全域,以避免在单元中运行的其他服务器出现问题。

但是,即使在全局安全中启用了 Kerberos ,它也不会为配置有自己的安全域的服务器继承/启用。

一旦我们使用默认全局安全性运行我们的测试服务器,其中 Kerberos 选项可见并启用,那么 Kerberos 身份验证就开始与IBM JavaSE 6一起使用,该脚本从具有通常 ClassPath 和文档中声明的所有属性的cmd bat 脚本执行。

注意:JNDIContext.SECURITY_AUTHENTICATION选项从未设置。反编译后,IBM ORB 的唯一可用值是none,但还没有实现。simplestrongstrong

还有一点:根据生成的日志,IBM ORB 不能file:/C:/temp/sas.client.config作为com.ibm.CORBA.ConfigURL. 它必须是 URI 而不是文件路径。我们甚至遇到了解析C主机名的 DNS 查找失败!阿尔夫。所有文档示例都是基于 Unix 的,file:/path/to/sas.client.config因此我们在从 HTTP 服务器交付该文件之前进行了许多试验。

现在部署的Java WebStart 部分

  • 没有任何安全性且没有 Kerberos 设置的相同原始 JNLP 与 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。

于 2012-06-29T06:50:23.420 回答