2010-11-30 2 views
2

싱글 사인온 (SSO)을 달성하기 위해 Kerberos 확장의 마일스톤 2를 POC 처리했습니다.스프링 Kerberos 확장, SSO 및 도메인 외부의 머신

내 설치의 빠른 요약 :
KDC : 윈도우 서버 2003 (SP2)
웹 서버 : 우분투 10.04, 톰캣 5.5, 자바 1.6.0_22
(안 도메인) 스프링 : Framework 3.0.5, 보안 3.0.4, Kerberos 확장 1.0.0 M2

SPNEGO 인증을 먼저 시도하고 로그인 페이지로 리디렉션하지 못하면 구성을 설정했습니다. SpnegoAuthenticationProcessingFilter의 "failureHandler"속성을 설정하면됩니다. 도메인 안팎에있는 Windows 컴퓨터 (XP 및 7)에서 성공적으로이 을 테스트했습니다. 도메인 외부에있는 시스템은 로그인 페이지 으로 리디렉션 된 다음 성공적으로 로그인 할 수 있습니다. Windows 시스템 내 웹 서버가 윈도우 머신에 응답하는 (평소에 따라) 헤더 " 협상 WWW 인증"는 응답 도메인 외부의 경우

<?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> 

:
여기 내 설정이다 SpnegoAuthenticationProcessingFilter에 "Negotiate Header was invalid ..."라고 표시된 NTLM 헤더 ("협상 TlRM ...")가있는 경우 및 awesomly 사용자를 로그인 페이지로 리디렉션합니다. 큰.

시트 문제점 :이 웹 응용 프로그램을 사용할 필요가 도메인 외부 영구적입니다 Mac 및 Linux 시스템의 숫자가 있습니다
. 웹 응용 프로그램 (Firefox 3.6)을 방문했을 때 내 웹 서버는 "WWW-Authenticate Negotiate" 헤더를 사용하여 클라이언트에 웹 응용 프로그램이 Kerberos임을 알리지 만 Mac 또는 Linux 컴퓨터는 전혀 응답하지 않습니다 . 따라서 SpnegoAuthenticationProcessingFilter 이 다시 입력되지 않으므로 오류가 발생하지 않으며 로그인 페이지로 리디렉션되지 않습니다. (난 그냥 물어 보라 수 없습니다 ...) 왜 Mac 및 Linux 컴퓨터는 Windows 시스템과 동일한 방식으로 응답하지 않습니다

:

문제는?

나는 맥과 리눅스 기계가 (kinit을 통해) 티켓을 얻었을 때 인증을 할 수 있지만, 좋은 해결책이 아닌 것 같다. 사용자가 신임장을 제공하는 노력을 필요로하기 때문에. 티켓도 만료됩니다.

그래서 Windows 머신처럼 NTLM 헤더를 다시 전송할 수있는 방법이 있습니까? 다른 제안/방법이 있으면 알려 주시기 바랍니다.

b.w. 맥과 리눅스 머신 ("network.negotiate-auth.delegation-uris""network.negotiate-auth"에서 테스트하기 위해 사용했던 Firefox를 설정했다.trusted-uris "이".corpza.corp.co.za "로 설정되었습니다.)

답변

0

당신은 잘못된 길을 가고있다. 실패한 SPNEGO 필터에 의존하지 마십시오. 리눅스 및 Mac 클라이언트가 제대로 작동 윈도우 클라이언트처럼 단지. 일반 설정이 보일 것입니다 다음과 같이 필터가 구현/지원하지 않으면 버그가 발견되었습니다.

서버 (또는 협상의 임의의 조합, 기본, 다이제스트)로부터 "401 협상 WWW 인증은"6,
  1. 클라이언트
  2. 클라이언트가 수신 서버에 요청을 전송한다.
  3. 클라이언트는 인증 데이터를 제공하려고 시도하고 실패하면 401 페이지를 표시합니다.

이제 Windows 클라이언트에서 전송 된 결함있는/처리 불가능한 데이터를 사용하여 양식을 표시합니다. 모든 클라이언트가 적절한 로그인 방법 (SPNEGO 또는 양식, 즉 페일 스루)을 선택할 수 있도록 401과 함께 양식을 직접 보내야합니다. 양식 승인은 협상, 다이제스트 또는 기본과 같은 http 승인이 아닙니다. 다르게 대우 받아야합니다.

우리는 그 필터를 사용하고 있으며 나는 그것에 만족하지 않습니다. 그래서 실무 경험이 있습니다.