Active Directory를 사용한 Java 애플리케이션 인증

Active Directory를 사용한 Java 애플리케이션 인증

Active Directory를 사용하여 사용자를 인증해야 하는 타사 Java 응용 프로그램을 개발 중입니다.

이 애플리케이션은 RHEL 6.5에서 호스팅되며 LDAP를 사용하여 Windows Active Directory에 인증합니다. AD 서버가 설정되었으며 이전 버전의 애플리케이션(통합을 활성화하도록 구성됨)에서 제대로 작동합니다.

최신 버전의 경우 공급업체는 AD 서버와 연결하기 위해 애플리케이션 파일을 수정/구성하는 몇 가지 단계를 마련했으며 이는 인증에 도움이 될 것으로 예상됩니다.

애플리케이션에는 현재 데이터베이스를 인증 처리기로 사용하도록 구성된 CAS 구성 요소 중 하나가 있습니다. 자격 증명(사용자 이름: abcd, 비밀번호: Samplepswd)을 입력하면 성공적으로 로그인할 수 있습니다.

비즈니스 요구 사항은 LDAP를 사용한 Active Directory 인증이므로 CAS 속성 파일을 수정해야 합니다. 제품 공급업체의 지침에 따라 ldap을 사용하도록 다음 속성을 변경했습니다.

authenticationHandler.type=ldap
ldapSSLConfig.enabled=false
ldapContextSource.url=ldap://sample.ADserver.example.net:389
ldapContextSource.userDn=abcd
ldapContextSource.password=samplepswd
ldapAuthenticationHandler.filter=uid=%u
ldapAuthenticationHandler.searchBase=OU=DEF,OU=PQR,OU=XYZ,DC=ADserver,DC=example,DC=net

또한 다음 속성에 대해 casAuthConfig xml 파일을 변경해야 합니다(익명 검색은 지원되지 않음). 1. 익명 읽기 전용, 값이 false로 설정됨 2. java.naming.security.authentication, 값이 단순으로 설정됨

SSL을 통한 LDAP를 사용하는 규정도 있지만 현재는 이를 사용하지 않습니다. 그러나 SSL을 사용하는 경우 다음 속성을 추가로 변경해야 합니다.

ldapSSLConfig.enabled=true
ldapSSLConfig.trustStorePath=/home/dir1/subdir1/subdir2/keystorename.keystore
ldapSSLConfig.trustStoreType=jceks

이는 우리(클라이언트) 측에서 수행된 유일한 구성 변경입니다. 실제로 유일한 변경 사항이 적용되었습니다. 서버(AD서버)에는 다른 사용자 외에는 아무것도 추가/수정되지 않았으나 기존 설정에는 영향을 미치지 않습니다.

변경 사항을 반영하기 위해 CAS를 다시 시작한 후 입력된 값은 정확하지만 잘못된 자격 증명 오류가 발생합니다.

2015-09-16 12:12:30,558 INFO [com.pqr.cas.authentication.support.DelegatingAuthenticationHandler] - Authenticating credential using handler 
com.pqr.cas.adaptors.ldappwd.BindLdapAuthenticationHandler 
2015-09-16 12:12:30,558 DEBUG [com.pqr.cas.authentication.support.DelegatingAuthenticationHandler] - credentials.getUsername() = abcd
2015-09-16 12:12:30,672 INFO [com.pqr.cas.adaptors.ldappwd.BindLdapAuthenticationHandler] - Search for cn=abcd returned 0 results. 
2015-09-16 12:12:30,672 INFO [org.jasig.cas.authentication.AuthenticationManagerImpl] - AuthenticationHandler: 

com.pqr.cas.authentication.support.DelegatingAuthenticationHandler failed to authenticate the user which provided the following credentials: 

[username: abcd] 
2015-09-16 12:12:30,676 ERROR [org.jasig.cas.integration.restlet.TicketResource] - error.authentication.credentials.bad 
org.jasig.cas.ticket.TicketCreationException: error.authentication.credentials.bad 
at org.jasig.cas.CentralAuthenticationServiceImpl.createTicketGrantingTicket_aroundBody10(CentralAuthenticationServiceImpl.java:423) 

누구든지 이 문제를 도와주실 수 있나요? 아니면 올바른 방향을 가리킬 수 있을까요? 어떤 도움이라도 대단히 감사하겠습니다.

감사합니다.

답변1

귀하의 구성에 몇 가지 잠재적인 문제가 있는 것으로 보입니다.

ldapContextSource.userDn 및 .password는 애플리케이션에 로그인하는 모든 사용자 계정을 읽을 수 있는 액세스 권한이 있는 AD 계정에 대한 자격 증명이어야 합니다. 그들은 .userDn 값이 실제로 LDAP DN 문자열(.searchBase에 대한 것과 유사)이 되도록 의도하지만 Active Directory의 경우 대신 userPrincipalName(UPN) 속성을 사용할 수 있습니다(보통 이는 다음과 같습니다).[이메일 보호됨]). 따라서 잘못된 자격 증명 오류는 단순히 사용자 이름을 어떤 것으로도 한정하지 않는다는 것일 수 있습니다. 계정은 AD 내에서 이동할 수 있고 응용 프로그램은 변경되는 DN과 달리 신경 쓰지 않기 때문에 항상 LDAP 통합에 UPN을 사용하는 것을 선호합니다.

문제가 해결되었다고 가정하면 .filter 값도 문제가 될 수 있습니다. uid 특성은 Active Directory에 존재하지만 일반적으로 기본적으로 채워지지 않습니다. 사용자가 자신의 사용자 이름만으로 로그인할 수 있도록 하려면 대신 sAMAccountName으로 변경해야 합니다.

LDAPS(LDAP over SSL)를 활성화하려면 Java 애플리케이션이 신뢰하는 도메인 컨트롤러에 TLS 인증서가 있어야 합니다. 자체 서명된 인증서인 경우 해당 인증서는 해당 문서가 참조하는 키 저장소로 이동해야 합니다. 공용 또는 내부 PKI 인프라에서 생성된 인증서인 경우 대신 해당 인프라에 대한 CA 인증서 체인을 추가해야 합니다. 또한 LDAP 서버 URI를 ldap으로 변경해야 합니다.에스:// 및 포트 636(또는 글로벌 카탈로그 검색의 경우 3269).

관련 정보