【问题标题】:How to enable Kerberos authentication for remote EJB call on WebSphere?如何为 WebSphere 上的远程 EJB 调用启用 Kerberos 身份验证?
【发布时间】:2023-03-21 13:40:01
【问题描述】:

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

我已经成功地将我的 WebSphere 单元配置为网络部署模式以支持 Kerberos 身份验证thanks to the infocenter documentation

krb5.confkrb5.keytab 文件都可以,并且在 Linux kinitklistwsadmin$AdminTask validateKrbConfig 上都经过测试,答案是 true

client setup 仅引用 JAAS login.config 文件以通过命令系统属性启用。我的直觉告诉我这可能还不够。

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

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

更新

由于没有使用 ./launchClient 运行 JavaEE 客户端容器,我在 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"/>

我的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 身份验证:我的 kerberos 缓存(来自 Windows 或 Linux 工作站)中没有 SPN WAS/myserver.mydomain.com 的 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 身份验证。

【问题讨论】:

    标签: java jakarta-ee ejb websphere kerberos


    【解决方案1】:

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

    您可以查看 RedBook Implementing Kerberos in a WebSphere Application Server Environment 以获取有关如何进行此配置的示例,以及应用程序客户端的剩余配置。

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

    【讨论】:

    • 我已经有了所有的参考资料。 sas.client.props 绝对不够……还没有触发 kerberos 身份验证。所以我问了两个问题。
    • 已根据信息中心文档在 WebSphere 服务器本身上修改了 sas.client.props... 我同意 PDF 更易于理解。但是我将我的 EJB 客户端作为独立的 JVM 运行 - 我不使用带有 launchClient 的 JavaEE 客户端容器。
    • 我的应用程序是 Java WebStart 应用程序。我添加了 wsjaas_client.config 文件的属性和 sas.client.properties 中的属性: com.ibm.CORBA.authenticationTarget=KRB5 和 com.ibm.CORBA.loginSource=krb5Ccache 但它没有任何改变。 JNDI 连接仍然未经身份验证。
    【解决方案2】:

    根据GSS-API/Kerberos v5 Authentication 指南,您必须在调用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.kdcjava.security.krb5.realm 将不正确) - 但我希望它有所帮助。转sun.security.krb5.debugtrue 获取大量日志记录。

    【讨论】:

    • 谢谢,但您描述了“低级”Kerberos 用法。就我而言,我不应该编写任何代码,因为 Kerberos 支持包含在 IBM CORBA ORB 实现中并且它应该是可配置的(绝对不容易...)
    • 好的 - 我没有使用 IBM CORBA ORB 的经验,但请记住 - 这不是代码,而是配置。此代码只是对所需 JVM 选项和 Krb5LoginModule 配置文件的编程替换。
    • 我知道它取代了 java.security.auth.login.config 选项和以下内容......
    • 更新了关于 JNDI 身份验证信息的答案 - 在这个 secanario 中仍然需要 getProgramaticLoginConfig - 但可能需要修改以适应您的配置要求
    • 如果引用不是 IBM-JDK 或 WebSphere 特定的,我必须测试 Context.SECURITY_AUTHENTICATION 的 GSSAPI 值。好提示!
    【解决方案3】:

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

    这里有一些答案。

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

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

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

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

    注意:永远不会设置 JNDI Context.SECURITY_AUTHENTICATION 选项。反编译后,IBM ORB 唯一可用的值是nonesimplestrong,但strong 还没有实现。

    另一点:根据生成的日志,IBM ORB 无法将file:/C:/temp/sas.client.config 用作com.ibm.CORBA.ConfigURL 的值。它必须是 URI 而不是文件路径。我们甚至无法解析C 主机名!阿尔夫。所有文档示例均基于 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。

    【讨论】:

    • 根据 IBM 的说法,目前两端都需要 IBM JavaSE 6 才能使 Kerberos 身份验证在 IIOP 上运行。所以这可能意味着它对于在 Solaris 上运行在 Oracle JavaSE 上的 WebSphere 根本不起作用,但我对此表示怀疑。可能每一侧都需要相同的 JVM - 但这不是我当前的配置。
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多