Как включить проверку подлинности Kerberos для удаленного вызова EJB в WebSphere?

Мое приложение является автономным клиентом Swing, вызывающим сеанс бездействия EJB без ограничений beans благодаря классическим вызовам JNDI и вызовам метода RMI-IIOP. Он запускается как приложение Java WebStart. Моя цель - получить идентификатор пользователя клиента из EJBContext с помощью метода getCallerPrincipal благодаря Kerberos SSO между рабочей станцией Windows, сервером ActiveDirectory и сервером WebSphere, работающим в Linux.

Я уже успешно настроил ячейку WebSphere в режиме сетевого развертывания, чтобы поддерживать аутентификацию Kerberos благодаря документации инфоцентра.

Оба файла krb5.conf и krb5.keytab в порядке и протестированы как с ответами 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"/>

My wsjaas_client.config предназначен для Oracle Java, поэтому он содержит:

WSKRB5Login{
    com.sun.security.auth.module.Krb5LoginModule required
       debug=true useTicketCache=true doNotPrompt=true;
};

My 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: TGS для SPN WAS/myserver.mydomain.com отсутствует в кеше кешью (на рабочих станциях Windows или Linux), а соединение 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"/>

Файл 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

Подводя итог контексту: наше развертывание с годами работает с IBM WebSphere, работающим в Linux, и приложение, развернутое благодаря Java WebStart, работающему на Sun JavaSE 6, с IBM ORB, включенным и настроенным для подключения без какой-либо аутентификации. Теперь мы хотим включить аутентификацию Kerberos и однократную регистрацию по RMI-IIOP, поддерживаемую с WebSphere 6 (я думаю).

Вот фрагменты ответа.

Начиная с WebSphere 7, была введена новая концепция для настройки аспектов безопасности для каждого сервера: домена безопасности. Теоретически любой параметр, который не был изменен в домене безопасности, наследуется от глобальной секции безопасности.

При тестировании установки Kerberos мы создали выделенный домен безопасности для нашего тестового сервера, чтобы избежать проблем с другими серверами, работающими в ячейке.

НО, даже если Kerberos включен в глобальной безопасности, он не наследуется/не разрешен для сервера, настроенного с собственным доменом безопасности.

Как только мы запустим наш тестовый сервер с глобальной безопасностью по умолчанию, где параметры Kerberos видны и включены, аутентификация Kerberos начал работать с IBM JavaSE 6, выполненным из cmd bat script с обычным ClassPath и всеми свойствами, объявленными в документации.

Примечание: параметр JNDI Context.SECURITY_AUTHENTICATION никогда не устанавливается. После декомпиляции единственными доступными значениями для IBM ORB являются none, simple и strong, но strong еще не реализована.

Другой момент: согласно сгенерированному журналу, IBM ORB не может работать с file:/C:/temp/sas.client.config как значение для com.ibm.CORBA.ConfigURL. Он ДОЛЖЕН быть URI, а не путь к файлу. Мы даже получили отказ DNS-поиска для решения C hostname! ARFF. Все примеры документации основаны на Unix на основе file:/path/to/sas.client.config, поэтому мы сделали множество пробных версий перед доставкой этого файла с HTTP-сервера.

Теперь часть Java WebStart развертывания:

  • тот же оригинальный JNLP без какой-либо защиты, и никакие настройки Kerberos не работают отлично как с Oracle JavaSE 6, так и с IBM Java 6

  • с включенной защитой WebSphere и Kerberos в JNLP (и только этот набор изменений) IBM ORB, работающий на IBM Java 6, жалуется на NoClassDefFoundError о реализации менеджера журналов ffdc, который (все еще/всегда) доступен в ClassPath. Это действительно похоже на несовместимость кода с иерархией классов ClassLoader с Java WebStart.

  • с Kerberos JNLP, IBM ORB, работающий на Oracle JavaSE 6, похоже, просто игнорирует параметры безопасности и анонимно подключается, как обычно.

Итак, первый шаг теперь работает: IBM Java 6 запускается из командной строки, но исследования не завершены для достижения нашей цели: Kerberos с Oracle JavaSE 6 в контексте Java WebStart.

Ответ 2

В соответствии с GSS-API/Kerberos v5 Аутентификация, вы должны пройти аутентификацию в Kerberos перед тем, как позвонить в контекст JNDI. После того как вы выполнили конфигурацию 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 для объемных количеств каротажа.

Ответ 3

Поскольку вы не указали конкретно в своих шагах, настроили ли вы sas.client.props, как указано в установочной ссылке клиента?

Вы можете проверить RedBook Внедрение Kerberos в среде WebSphere Application Server для примеров того, как сделать эту конфигурацию, а также оставшуюся конфигурацию для приложения Клиент.

В разделе 13.5 (13.5 Настройка клиента приложения Java EE) приводятся примеры для настройки вашей толстой клиентской среды выполнения, включая файл sas.client.props.