Java SSO: проверка подлинности Kerberos в Active Directory
Я все еще пытаюсь найти решение на базе Java для SSO (работает на * nix), которое я могу использовать на JBoss для авторизации против контроллера Active Directory/домена. Сначала я попытался сделать это через NTLM, но отказался, потому что он не будет поддерживаться в Windows Server >= 2008.
Поэтому я пытаюсь реализовать это с помощью Kerberos, но, похоже, невозможно найти правильное/рабочее решение. Пожалуйста, укажите мне в правильном направлении, объясняя, как настроить такую конфигурацию, как проверять Active Directory и/или контроллер домена, чтобы:
- узнать, действительна ли учетная запись и
- выберите список пользователей группы
Любая помощь приветствуется!
UPDATE
Я работаю над решением, использующим jcifs-ext-0.9.4 и jcifs-krb5-1.3.12. Я установил web.xml, как описано ниже:
<web-app>
<!-- servlet / servlet-mapping / welcome-file-list skipped -->
<filter>
<filter-name>auth</filter-name>
<filter-class>jcifs.http.AuthenticationFilter</filter-class>
<init-param>
<param-name>java.security.auth.login.config</param-name>
<param-value>/WEB-INF/login.conf</param-value>
</init-param>
<init-param>
<param-name>jcifs.spnego.servicePrincipal</param-name>
<param-value>HTTP/[email protected]</param-value>
</init-param>
<init-param>
<param-name>jcifs.spnego.servicePassword</param-name>
<param-value>supersecret</param-value>
</init-param>
<init-param>
<param-name>sun.security.krb5.debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>java.security.krb5.realm</param-name>
<param-value>mydomain.com</param-value>
</init-param>
<init-param>
<param-name>java.security.krb5.kdc</param-name>
<param-value>testdom01.mydomain.com </param-value>
</init-param>
<init-param>
<param-name>jcifs.smb.client.domain</param-name>
<param-value>TESTDOMAIN</param-value>
</init-param>
<init-param>
<param-name>jcifs.http.enableNegotiate</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>jcifs.http.basicRealm</param-name>
<param-value>mydomain.com</param-value>
</init-param>
<init-param>
<param-name>jcifs.http.domainController</param-name>
<param-value>testdom01.mydomain.com</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>auth</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Это приводит к следующей stacktrace, если вы пытаетесь получить доступ к приложению:
2010-07-22 15:53:10,588 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/google].[default]] Servlet.service() for servlet default threw exception
java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at jcifs.ntlmssp.Type2Message.toByteArray(Type2Message.java:261)
at jcifs.spnego.Authentication.processNtlm(Authentication.java:265)
at jcifs.spnego.Authentication.process(Authentication.java:233)
at jcifs.http.Negotiate.authenticate(Negotiate.java:46)
at jcifs.http.AuthenticationFilter.doFilter(AuthenticationFilter.java:192)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Thread.java:619)
Любая помощь приветствуется.
Ответы
Ответ 1
Для этого вам действительно нужно использовать LDAP. К счастью для вас, Java имеет надежную поддержку как для Kerberos, так и для LDAP. Подробную процедуру можно найти в http://java.sun.com/products/jndi/tutorial/ldap/security/gssapi.html.
Обзор шагов:
- Аутентификация Kerberos
- Использовать Kerberos для идентификации пользователя
- выполнить привязку GSSAPI к серверу LDAP Active Directory
- Получить список групп по LDAP
Ответ 2
Вы можете использовать Waffle. Он бесплатный и поддерживает переговоры, NTLM и Kerberos. Вы также можете проверить список групп пользователей.
"WAFFLE - Функциональная среда проверки подлинности Windows (Light Edition) - это родная библиотека С# и Java, которая выполняет все проверки подлинности Windows (Negotiate, NTLM и Kerberos).
Ответ 3
Мы используем Jespa для обработки аутентификации NTLM, мы протестировали на Tomcat и Glassfish, работающие на Solaris, IE и Firefox, поддерживаются, и теперь Chrome теперь поддерживает NTLM. Вам понадобится лицензия для коммерческого использования, но я бы определенно рекомендовал ее.
Ответ 4
Я начал писать статью, когда я экспериментировал с kerberos и JBoss, план состоит в том, чтобы иметь полное руководство для начинающих, чтобы настроить и использовать kerberos с JBoss. Я не говорю, что это полный ответ, но если вы зададите вопросы, я могу попытаться ответить на них и добавить их в блог.
статья
Ответ 5
Если вы хотите отладить конфигурацию kerberos, AD на вашем компьютере, вы можете загрузить приложение по следующей ссылке.
https://github.com/shubham49/debugSSO
Загрузите приложение и разверните его на сервере weblogic.
После развертывания откройте домашнюю страницу, и вы будете испытывать различные тесты для отладки конфигурации.