Расширение Spring Kerberos, SSO и машины вне домена - PullRequest
2 голосов
/ 30 ноября 2010

Я выполняю POC'ing с этапом 2 расширения Kerberos для достижения единого входа.

Краткий обзор моей настройки:
KDC: Windows Server 2003 (SP2)
Веб-сервер: Ubuntu 10.04,Tomcat 5.5, Java 1.6.0_22 (не в домене)
Spring: Framework 3.0.5, безопасность 3.0.4, расширение Kerberos 1.0.0 M2

У меня есть настройкаКонфигурация для первой попытки аутентификации SPNEGO, а в случае неудачи - перенаправление на страницу входа.Это можно сделать, установив свойство SpnegoAuthenticationProcessingFilter * faultHandler.Я успешно проверил это на компьютерах с Windows (XP и 7), которые входят и выходят из домена.Машины, находящиеся вне домена, перенаправляются на страницу входа и затем могут успешно войти в систему.
Вот мой конфиг:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:beans="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util-3.0.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <http entry-point-ref="spnegoEntryPoint" auto-config="false">
        <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <intercept-url pattern="/j_spring_security_check*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
     <intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" />

     <custom-filter ref="spnegoAuthenticationProcessingFilter" position="BASIC_AUTH_FILTER" />
        <form-login login-page="/login.html" default-target-url="/" always-use-default-target="true"/>
   </http>

   <authentication-manager alias="authenticationManager">
      <authentication-provider ref="kerberosServiceAuthenticationProvider" />
      <authentication-provider ref="kerberosAuthenticationProvider"/>
   </authentication-manager>

    <beans:bean id="spnegoEntryPoint"
  class="org.springframework.security.extensions.kerberos.web.SpnegoEntryPoint" />

 <beans:bean id="spnegoAuthenticationProcessingFilter"
  class="org.springframework.security.extensions.kerberos.web.SpnegoAuthenticationProcessingFilter">
        <beans:property name="failureHandler">
   <beans:bean class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
    <beans:property name="defaultFailureUrl" value="/login.html" />
                <beans:property name="allowSessionCreation" value="true"/>
   </beans:bean>
  </beans:property>
  <beans:property name="authenticationManager" ref="authenticationManager" />
 </beans:bean>

    <beans:bean id="kerberosServiceAuthenticationProvider"
  class="org.springframework.security.extensions.kerberos.KerberosServiceAuthenticationProvider">
  <beans:property name="ticketValidator">
   <beans:bean
    class="org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator">
    <beans:property name="servicePrincipal" value="HTTP/mywebserver.corpza.corp.co.za"/>
    <beans:property name="keyTabLocation" value="classpath:mywebserver.keytab" />
    <beans:property name="debug" value="true"/>
   </beans:bean>
  </beans:property>
  <beans:property name="userDetailsService" ref="dummyUserDetailsService" />
 </beans:bean>

    <beans:bean id="kerberosAuthenticationProvider" class="org.springframework.security.extensions.kerberos.KerberosAuthenticationProvider">
  <beans:property name="kerberosClient">
   <beans:bean class="org.springframework.security.extensions.kerberos.SunJaasKerberosClient">
    <beans:property name="debug" value="true" />
   </beans:bean>
  </beans:property>
  <beans:property name="userDetailsService" ref="dummyUserDetailsService" />
 </beans:bean>

    <beans:bean class="org.springframework.security.extensions.kerberos.GlobalSunJaasKerberosConfig">
  <beans:property name="debug" value="true" />
  <beans:property name="krbConfLocation" value="/etc/krb5.conf" />
 </beans:bean>

    <beans:bean id="dummyUserDetailsService" class="main.server.DummyUserDetailsService"/>

  </beans:beans>

Когда машина Windows находится за пределами домена, мой веб-сервер отвечает Заголовок "WWW-Authenticate Negotiate " (как обычно), на который машина Windows отвечает заголовком NTLM ("Negotiate TlRM ..."), где SpnegoAuthenticationProcessingFilter затем говорит«Заголовок согласования был недействительным ...» и неожиданно перенаправляет пользователя на страницу входа.Отлично.

Проблема:
Существует ряд компьютеров Mac и Linux, которые постоянно находятся за пределами домена и могут использовать это веб-приложение.Когда они запускают веб-приложение (с Firefox 3.6), мой веб-сервер отвечает ожидаемым заголовком "WWW-Authenticate Negotiate" , чтобы сообщить клиенту, что веб-приложение Kerberized, НО ни машины Mac, ни Linux не отвечаютсовсем.Таким образом, SpnegoAuthenticationProcessingFilter не вводится снова и, следовательно, не происходит сбоев и, следовательно, перенаправление на страницу входа не происходит.

Вопрос:
Почему немашины Mac и Linux реагируют так же, как машины Windows (не могу поверить, я только что спросил ...)?

Я знаю, что когда машины Mac и Linux получают билет (черезkinit) они могут проходить проверку подлинности, но это совсем не похоже на хорошее решение, поскольку от пользователя требуется приложить усилия для предоставления учетных данных и т. д., где также истекает срок действия билетов.

Так есть ли способ, которыммы можем заставить эти машины отправлять обратно заголовок NTLM, как это делают машины Windows?Или, если есть какие-либо другие предложения / способы, пожалуйста, сообщите мне.

Кстати, я настроил Firefox, которые я использовал для тестирования на компьютерах Mac и Linux ( "network.negotiate-auth.delegation-uris " и " network.negotiate-auth.trusted-uris " было установлено в" .corpza.corp.co.za ").

Ответы [ 2 ]

0 голосов
/ 27 ноября 2011

Вы идете не в ту сторону. Не полагайтесь на неисправный фильтр SPNEGO. Клиенты Linux и Mac ведут себя так же, как и клиент Windows. Общая настройка должна выглядеть следующим образом: если фильтр не реализует / не поддерживает это, вы обнаружили ошибку.

  1. Клиент отправляет запрос на сервер
  2. Клиент получает от сервера «401 WWW-Authenticate: Negotiate» (или любую комбинацию «Переговоры», «Basic», «Дайджест»).
  3. Клиент пытается предоставить данные авторизации, и в случае неудачи показывает страницу 401.

Теперь вы используете ошибочные / не обрабатываемые данные, отправленные клиентом Windows, для представления формы. Вам лучше отправить форму с 401 напрямую, чтобы дать всем клиентам возможность выбрать подходящий метод входа (SPNEGO или форма, т. Е. Отработка отказа). Имейте в виду, что аутентификация формы не является авторизацией http, такой как Negotiate, Digest или Basic. К нему нужно относиться по-другому.

Мы тоже используем этот фильтр, и я не очень доволен им. Так что у меня есть практический опыт.

0 голосов
/ 07 января 2011

Не похоже, что вы установили network.automatic-ntlm-auth.trusted-uris.Вы читали это?

https://developer.mozilla.org/en/Integrated_Authentication

Грант

...