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

Yve*_*tin 14 java websphere ejb kerberos java-ee

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

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

这两个krb5.confkrb5.keytab文件都OK,并在Linux测试kinit,klist并且wsadmin,$AdminTask validateKrbConfig解答true.

客户端安装不只是指JAAS login.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"/>
Run Code Online (Sandbox Code Playgroud)

wsjaas_client.config是针对Oracle Java的,因此它包含:

WSKRB5Login{
    com.sun.security.auth.module.Krb5LoginModule required
       debug=true useTicketCache=true doNotPrompt=true;
};
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

目前,没有触发Kerberos身份验证:WAS/myserver.mydomain.com我的kerberos缓存(来自Windows或Linux工作站)中的SPN没有TGS,并且仍然匿名建立JNDI连接.

没有错误消息,没有警告,最后没有委托人.我如何诊断错误或缺乏?

更新2012/06/20

这是向前迈出的一步.在我的应用程序JNLP中运行Oracle Java,我已设置以下属性以使用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"/>
Run Code Online (Sandbox Code Playgroud)

该文件TraceSettings.properties包含

traceFileName=c:\\temp\\traces.log
ORBRas=all=enabled
SASRas=all=enabled
com.ibm.*=all=enabled
Run Code Online (Sandbox Code Playgroud)

即使在阅读了大量IBM 7安全性IBM RedBook之后,我仍然无法从客户端获得CSIv2触发Kerberos身份验证.

Mal*_*ith 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; 
} 
Run Code Online (Sandbox Code Playgroud)

你可能需要根据你的上下文调整这个(java.security.krb5.kdc并且java.security.krb5.realm不正确) - 但我希望它有所帮助.转向sun.security.krb5.debug true大量的伐木.


Yve*_*tin 3

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

现在是一些答案。

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

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

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

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

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

另一点:根据生成的日志,IBM ORB 无法用作file:/C:/temp/sas.client.config的值com.ibm.CORBA.ConfigURL。它必须是 URI 而不是文件路径。我们甚至遇到 DNS 查找无法解析C主机名的情况!阿夫。所有文档示例都是基于 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 抱怨NoClassDefFoundErrorClassPath 中(仍然/始终)可用的 ffdc 日志管理器实现。这听起来确实像是代码与 Java WebStart 受保护的类加载器层次结构不兼容。

  • 借助 Kerberos JNLP,在 Oracle JavaSE 6 上运行的 IBM ORB 似乎只是忽略安全设置并像往常一样进行匿名连接。

因此,第一步现已开始实施:IBM Java 6 从命令行启动,但为了实现我们的目标,调查尚未结束:Java WebStart 上下文中的 Kerberos 与 Oracle JavaSE 6。