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

2022-09-04 03:24:11

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

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

和 文件都可以,并经过 Linux 和 、答案的测试。krb5.confkrb5.keytabkinitklistwsadmin$AdminTask validateKrbConfigtrue

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

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

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

更新

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

<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"/>

My 是针对 Oracle Java 的,所以它包含:wsjaas_client.config

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

没有错误消息,没有警告,最后没有主体。如何诊断错误或不足之处?

更新 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 身份验证。


答案 1

根据 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.kdcjava.security.krb5.realmsun.security.krb5.debugtrue


答案 2

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

您可以查看在 WebSphere 应用程序服务器环境中实现 Kerberos 的红皮书,以获取有关如何进行此配置的示例,以及应用程序客户机的其余配置。

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


推荐