Вопрос по java – Как включить аутентификацию Kerberos для удаленного вызова EJB в WebSphere?
Мое приложение представляет собой автономный клиент Swing, вызывающий EJB-компоненты без состояния, благодаря классическому поиску JNDI и вызовам методов RMI-IIOP. Он запускается как приложение Java WebStart. Моя цель - получить идентификационные данные пользователя клиента изEJBContext
сgetCallerPrincipal
метод благодаря единому входу Kerberos между рабочей станцией Windows, ActiveDirectory и сервером WebSphere, работающим в Linux.
Я уже успешно настроил свою ячейку WebSphere в режиме сетевого развертывания для поддержки аутентификации Kerberosблагодаря документации инфоцентра.
И то и другоеkrb5.conf
а такжеkrb5.keytab
файлы в порядке и проверены с обоими Linuxkinit
, klist
а такжеwsadmin
, $AdminTask validateKrbConfig
ответыtrue
.
настройка клиента относится только к JAASlogin.config
файл для включения с помощью свойства системы команд. Моя интуиция подсказывает мне, что этого недостаточно.
Но теперь я не нахожу больше информации для завершения тестового примера:
how the JNDI initial context environment must be setup to trigger Kerberos negotiation ? if there are other requirements on server-side like protect my EJB with a role (JBoss does not require it for instance) ?Update
Как не работает клиентский контейнер 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"/>
мой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 не запускается: для SPN нет TGSWAS/myserver.mydomain.com
в моем кеше Kerberos (с рабочих станций Windows или Linux) и JNDI-соединение все еще устанавливается анонимно.
Нет сообщения об ошибке, нет предупреждения и, наконец, нет принципала. Как мне диагностировать то, что неправильно или не хватает?
Update 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 IBM RedBook Я все еще не могу получить аутентификацию Kerberos триггера CSIv2 со стороны клиента.
которые вы выполнили, вы сконфигурировали свой sas.client.props так, как вы указали в ссылке на установку клиента?
Вы можете проверить RedBookРеализация Kerberos в среде сервера приложений WebSphere примеры того, как сделать эту конфигурацию, а также оставшуюся конфигурацию для Application Client.
В разделе 13.5 (13.5 Настройка клиента приложения Java EE) приводятся примеры настройки среды выполнения толстого клиента, включая файл sas.client.props.
GSS-API / аутентификация Kerberos v5 руководство, вы должны пройти аутентификацию в Kerberos, прежде чем сделать свой вызов контексту JNDI. Выполнив настройку Kerberos, вы настраиваете начальный контекст следующим образом:
When creating the initial context, set the Context.SECURITY_AUTHENTICATION(in the API reference documentation) environment property to the string "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
для больших объемов заготовки.
можно сказать, что наше развертывание уже много лет работает, и IBM WebSphere работает на Linux, а приложение развернуто благодаря Java WebStart на Sun JavaSE 6 с включенным IBM ORB и настроенным для подключения без какой-либо аутентификации. Теперь мы хотим включить аутентификацию Kerberos и единый вход через RMI-IIOP, поддерживаемые начиная с WebSphere 6 (я думаю).
Вот теперь части ответа.
Начиная с WebSphere 7, была введена новая концепция для настройки аспектов безопасности для каждого сервера:security domain, Теоретически любой параметр, который не был изменен в домене безопасности, наследуется отglobal security раздел.
При тестировании установки Kerberos мы создали выделенный домен безопасности для нашего тестового сервера, чтобы избежать проблем с другими серверами, работающими в ячейке.
BUT даже если Kerberos включен вglobal security, он не наследуется / не включен для сервера, настроенного с его собственнымsecurity domain.
Как только мы запустим наш тестовый сервер по умолчаниюglobal security где параметры Kerberos видны и включены, затем проверка подлинности Kerberos начал работать сIBM JavaSE 6 выполнен изcmd bat script с обычным ClassPath и всеми свойствами, заявленными в документации.
Для заметки: JNDIContext.SECURITY_AUTHENTICATION
опция никогда не устанавливается. После декомпиляции единственными доступными значениями для IBM ORB являютсяnone
, simple
а такжеstrong
ноstrong
еще не имеет реализации.
Еще один момент: согласно сгенерированному журналу IBM ORB не может работать сfile:/C:/temp/sas.client.config
как значение дляcom.ibm.CORBA.ConfigURL
, ЭтоMUST быть URI, а не путь к файлу. Мы даже не смогли разрешить поиск DNSC
имя хоста! ARFF. Все примеры документации на Unix основаны наfile:/path/to/sas.client.config
поэтому мы сделали много испытаний, прежде чем доставить этот файл с HTTP-сервера.
ТеперьJava WebStart part развертывания:
the same original JNLP without any security and no Kerberos settings works perfectly with both Oracle JavaSE 6 and IBM Java 6
with WebSphere security enabled and Kerberos in JNLP (and only that change set), IBM ORB running on IBM Java 6 complains with NoClassDefFoundError
about ffdc log manager implementation that is (still/always) available in ClassPath. It really sounds like a code incompatibility with Java WebStart secured ClassLoader hierarchy.
with Kerberos JNLP, IBM ORB running on Oracle JavaSE 6 seems to simply ignore security settings and connects anonymously as usual.
Итак, первый шаг сейчас работает: IBM Java 6 запускалась из командной строки, но исследования еще не завершены, чтобы достичь нашей цели: Kerberos с Oracle JavaSE 6 в контексте Java WebStart.