인디노트

LDAP 인증에 2FA 인증 구현 본문

내 프로젝트/보안인증 (OTPKEY)

LDAP 인증에 2FA 인증 구현

인디개발자 2023. 2. 20. 14:43

이 문서는 LDAP 인증을 사용하는 기존 WEB 인증 시스템에 OTPKEY 인증서버를 이용하여 아주 간단히 2FA 인증을 구현하는 방법을 설명하고 있습니다.

Spring Security 를 이용한 LDAP ID/PW 인증

LDAP 을 이용한 ID/PW 인증의 구현은 Spring Security 를 이용하고 있다고 가정하며 다음과 같은 구성으로 구현되어 있는 상황으로 설명 하도록 하겠습니다.

Spring Security LDAP Authentication 에 대한 공식 문서는 다음의 링크들을 참고 하시면 좋겠습니다.

https://docs.spring.io/spring-security/reference/servlet/authentication/passwords/ldap.html

 

LDAP Authentication :: Spring Security

Active Directory supports its own non-standard authentication options, and the normal usage pattern does not fit too cleanly with the standard LdapAuthenticationProvider. Typically, authentication is performed by using the domain username (in the form of [

docs.spring.io

https://spring.io/guides/gs/authenticating-ldap/

 

Spring | Home

Cloud Your code, any cloud—we’ve got you covered. Connect and scale your services, whatever your platform.

spring.io

 

LDAP 서버

LDAP 서버는 다음과 같은 구성으로 구성하였습니다. 이 LDAP 서버는 본 설명을 위해서 임의로 설치하고 설정한 LDAP 서버입니다.

  • Address : ldap.otpkey.com
  • Port : 389
  • protocol : LDAP v3
  • Base DN : dc=otpkey,dc=com
  • User DN : cn=admin,dc=otpkey,dc=com
  • Password : LdapPassword1!

 

LDAP 서버 접속

JXplorer 를 이용하여 LDAP 서버를 접속해 보도록 하겠습니다.

 

LDAP 에 존재하는 그룹과 계정

설치된 LDAP 에는 다음과 같은 3개의 그룹과 사용자 계정이 존재하도록 하였습니다. 이 문서에서 user 그룹에 있는 john@otpkey.com 에 대하여 2차 인증을 등록하고 적용하는 방법을 설명하겠습니다.

 

Spring Security 가 적용된 Spring Boot 샘플 프로젝트

시작에 앞서 다음과 같은 Spring Security 가 적용된 프로젝트를 준비하였습니다. 이 간단한 프로젝트는 인터넷에서 쉽게 구할 수 있으며 https://github.com/otpkey 에서 다운로드 받을 수 있습니다.

 

이 프로젝트는 계정 인증에서 LDAP 서버를 연결하며 Spring Security 에서 기본으로 제공하는 로그인 화면을 이용하여 로그인을 성공해야 웹 컨텐츠( index.html, index.jsp) 를 확인 할 수 있도록 구현되었습니다.

이 프로젝트의 소스를 분석해 보면 LDAP 인증 관련한 부분은 다음과 같습니다.

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {

@EnableWebSecurity 를 사용하여 Spring Web Security 를 사용하도록 함

@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests((authz) -> authz
            .anyRequest().authenticated()
        )
        .formLogin()
        .defaultSuccessUrl("/", true)
        .failureForwardUrl("/failure")
        .failureUrl("/failure")
    .and()
        .logout()
        .logoutSuccessUrl("/")
        .deleteCookies("JSESSIONID");
    return http.build();
}
  • anyRequest().authenticated() 를 이용하여 모든 페이지에 인증이 필요함
  • formLogin() 을 이용하여 Spring Security 의 기본 로그인 폼을 이용함

 

@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.ldapAuthentication()
        .userSearchFilter("(uid={0})")
        .userSearchBase("dc=otpkey,dc=com")
        .userDnPatterns("uid={0},ou=admin", "uid={0},ou=dev", "uid={0},ou=user")
        .groupSearchFilter("(otpkeyMember={0})")
        .passwordCompare()
        .passwordEncoder(new BCryptPasswordEncoder())
        .passwordAttribute("userPassword")
    .and()
        .contextSource()
        .url("ldap://ldap.otpkey.com:389/dc=otpkey,dc=com")
        .managerDn("cn=admin,dc=otpkey,dc=com")
        .managerPassword("LdapPassword1!");
}
  • User ID 는 LDAP 의 uid 값에 매칭함
  • User PW 는 LDAP 의 userPassword 값에 매칭함
  • Search Base 는 dc=otpkey,dc=com
  • admin, dev, user 3개의 소속(ou)에서 사용자를 찾음
  • otpkeyMember 그룹 필터를 적용함
  • BCrypt 방식으로 암호를 암호화 함
  • LDAP 서버 URL 은 ldap://ldap.otpkey.com:389/dc=otpkey,dc=com
  • LDAP 관리자 계정은 cn=admin,dc=otpkey,dc=com
  • LDAP 관리자 암호는 LdapPassword1!

 

Visual Studio Code 를 통하여 서버 구동 및 웹 접속

이 프로젝트를 Visual Studio Code (이하 VSC) 를 이용하여 다음과 같이 구동하도록 하겠습니다.

사용된 Tomcat 포트는 8080 (http) 입니다. 이제, 웹브라우저로 접속해 보도록 하겠습니다.

이렇게 Spring Security 에서 기본으로 제공하는 로그인 페이지가 표시됩니다.

물론 현장에서의 프로젝트는 로그인 화면을 별도로 디자인하여 구현합니다. 여기서는 Spring Security 의 기본 코드에서 OTPKEY 2차 인증을 구현하도록 하는것을 설명하기 위하여 이와같이 구현 하였습니다. 이 프로젝트는 실제로 spring.io 사이트에서 설명하는 공식 코드 절차를 따르고 있습니다.

john@otpkey.com 계정에 로그인 해 보도록 하겠습니다.

계정 (john@otpkey.com) 과 암호를 입력하여 LDAP 서버로부터 승인되면 다음과 같이 로그인 된 화면을 표시합니다.

 

OTPKEY 인증서버 구성

우리는 다음과 같이 Application Server (예; Tomcat) 와 LDAP Server (예; OpenLDAP) 사이에 OTPKEY LDAP Proxy 를 추가하는 방법으로 2차인증 (이 문서는 Push 인증을 적용) 을 구현할 수 있습니다.

더보기

LDAP Server 와 OTPKEY 인증서버를 연동하는 방법에는 여러가지 방법이 있습니다. 이 문서에서는 LDAP Proxy 를 구성하여 연동하는 방법에 대한 설명을 하고 있습니다.

LDAP 서버의 포트는 389 번을 계속 사용하도록 하고 OTPKEY LDAP Proxy 포트를 1389 번으로 사용하도록 하겠습니다.

 

OTPKEY Authentication Server 의 Administration 화면에서 [CONFIGURATION] 메뉴의 Policies 섹션을 채우고 Save 합니다.

  • Auto Send Push OTP : Checked
  • 다른 항목은 Checked 혹은 Unchecked 모두 상관 없습니다.

 

OTPKEY Authentication Server 의 Administration 화면에서 [CONFIGURATION] 메뉴의 LDAP 섹션을 채우고 Save 합니다.

  • LDAP Server
    • Host : ldap.otpkey.com
    • Port : 389
    • Secured : Un-Checked
    • Pooled : Checked
    • Base DN : dc=otpkey,dc=com
    • Admin DN : cn=admin,dc=otpkey,dc=com
    • Admin Password : LdapPassword1!
    • Search Base :
    • Search Filter : (objectclass=person)
  • LDAP Proxy
    • Port : 1389
    • Timeout : 60
    • Domains : otpkey.com
    • OUs : admin,dev,user
  • Authentication
    • Group Filter : otpkeyMember
    • Auth Methods : pushotp,emailotp,smsotp
    • ID Tag : uid
    • Password Tag : userPassword

설정 한 후 [ Test Connection ] 를 클릭하거나

[ Proxy Test ] 를 클릭하여 연결 테스트를 할 수 있습니다.

[ Test Connection ] : LDAP 서버에 직접 연결하는 테스트

[ Proxy Test ] : Proxy 를 통해서 LDAP 서버를 연결하는 테스트

 

Spring Security 코드에서 다음과 같이 포트 번호를 1389 로 변경하면 됩니다.

@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.ldapAuthentication()
        .userSearchFilter("(uid={0})")
        .userSearchBase("dc=otpkey,dc=com")
        .userDnPatterns("uid={0},ou=admin", "uid={0},ou=dev", "uid={0},ou=user")
        .groupSearchFilter("(otpkeyMember={0})")
        .passwordCompare()
        .passwordEncoder(new BCryptPasswordEncoder())
        .passwordAttribute("userPassword")
    .and()
        .contextSource()
        .url("ldap://ldap.otpkey.com:1389/dc=otpkey,dc=com")
        .managerDn("cn=admin,dc=otpkey,dc=com")
        .managerPassword("LdapPassword1!");
}

이렇게 코드를 변경하고 다시 (VSC 에서 Live 실행을 하였기 때문에 코드를 변경하면 자체 Tomcat 서버가 재 시작하여 변경된 코드가 적용됨) 접속하여 정상적으로 로그인 되는지 확인합니다.

이렇게 OTPKEY LDAP Proxy 를 경유 해도 이전과 똑같이 로그인이 가능하면 지금까지의 설정이 모두 성공적이라고 판단할 수 있습니다.

우리는 지금까지 Spring Security 가 OTPKEY LDAP Proxy 를 경유하여 LDAP 서버를 접속하도록 하였습니다. 그러나, 아직 로그인시 2차 인증은 이루어지지 않고 있습니다.

그 이유는 해당 로그인 계정 john@otpkey.com 에 아직 2차 인증에 필요한 인증팩터를 등록하지 않았기 때문입니다.

이제 계정에 2차 인증에 필요한 인증팩터 (이 문서에서는 Push 인증) 를 등록하는 방법을 설명하도록 하겠습니다.

진행에 앞서 2차 인증시 사용될 OTPKEY 인증앱 (iOS or Android) 을 설치한 스마트폰을 준비하시기 바랍니다. 구글 플레이스토어 및 애플 앱스토어에서 “otpkey” 로 검색하면 쉽게 앱을 찾아서 설치할 수 있습니다.

OTPKEY 인증앱 설치에 대한 자세한 사항은 https://otpkey.com/#/app 을 방문해 주시기 바랍니다.

 

2차 인증 (Push 인증) 을 위한 인증 앱 등록

OTPKEY Administration 의 [ SAMLES ] 메뉴에서

Sample 2 의 [ Sign In ] 을 선택합니다.

계정 및 암호 (LDAP 서버에 존재하는 계정 및 암호) 를 입력하고 Sign In 합니다. 로그인 되면 다음과 같이 [ User’s Realm ] 에 들어갈 수 있습니다.

 

OTP 크리덴셜 등록

[ User’s Realm ] 화면의 아랫쪽으로 이동하면 [ OTP Enroll ] 버튼을 찾을 수 있습니다. 버튼을 클릭하면 다음과 같이 QR 코드가 화면에 표시됩니다.

OTPKEY 인증앱에서 QR 코드를 스캔하여 등록합니다.

다음 그림의 3번째 OTP 크리덴셜 카드 (john@otpkey.com) 가 새로 등록한 OTP 인증 카드 입니다.

OTPKEY 인증앱에 등록된 OTP 인증 카드에 표시되는 OTP 코드를 웹 화면의 OTP Code 에 입력한 후 [Enroll] 버튼으로 등록합니다.

등록에 성공하면 다음과 같이 [ OTP Enroll ] 버튼이 [ OTP Unenroll ] 으로 바뀌게 됩니다.

이제 LDAP 인증에서 사용할 2차 인증팩터로 [ Push Enroll ] 을 등록할 수 있습니다. OTPKEY 인증서버의 Push 인증은 OTP 등록이 완료된 후 Push 인증을 등록할 수 있습니다.

OTPKEY 인증서버의 Push 인증에는 OTPKEY 인증앱에 발급되는 Push 인증서와 OTP 인증이 조합되어 보안등급을 향상시키고 있습니다.

 

Push 크리덴셜 등록

[ Push Enroll ] 버튼을 클릭하면 다음과 같이 OTP 코드 입력 화면이 표시됩니다. 앞에서 등록한 OTP 인증 카드에 표시되는 OTP 코드를 입력하여 진행할 수 있습니다.

다음과 같은 Push 등록에 필요한 QR 코드가 화면에 표시됩니다.

마찬가지로 OTPKEY 인증앱에서 QR 코드를 스캔하여 Push 크리덴셜 카드를 등록합니다.

다음과 같이 OTPKEY 인증앱에 등록된 Push 인증 카드의 인증코드는 XXXX-XXXX 형식으로 표현되며 승인 대기중인 Push 인증 카드는 [DENY] [APPROVE] 버튼이 표시됩니다.

OTPKEY 인증앱에 등록된 Push 인증 카드에 표시되는 인증코드를 웹 화면에 입력하여 등록을 완료해도 되며, OTPKEY 인증앱에서 [APPROVE] 버튼을 터치하여 등록을 완료 할 수도 있습니다.

Push 인증 등록이 완료되면 다음과 같이 [ Push Enroll ] 버튼이 [ Push Unenroll ] 버튼으로 바뀌게 됩니다. 참고로 [ Push Unenroll ] 버튼을 클릭하여 등록된 Push 인증을 제거 할 수 있습니다.

 

LDAP 인증시 2차인증 (Push 인증) 확인

이제 등록된 Push 인증으로 앞에서 준비한 Spring Security 웹 화면에서 LDAP 인증시 Push 인증까지 확인 하는것을 테스트 해 보겠습니다.

Spring Security 의 LDAP 을 이용한 로그인 화면에서 이전과 똑같은 방법으로 로그인을 진행 합니다.

 

OTPKEY 인증앱에서 푸시 인증 메시지를 수신하게 되며 다음과 같이 [ APPROVE ] 할 수 있는 창이 표시됩니다. [ DENY ] 버튼을 이용하여 거절 할 수도 있습니다.

OTPKEY 인증앱에서 [ APPROVE ] 버튼을 터치하여 인증을 승인하면 웹 화면의 로그인 처리가 승인되어 다음과 같이 로그인 된 화면이 표시됩니다.

마치며

지금까지 우리는 LDAP 서버를 이용하여 ID/PW 인증을 수행하는 Spring Security 웹의 LDAP 연결 주소를 OTPKEY LDAP Proxy 주소로 바꾸기만 하는 작업으로 2차 인증 (Push 인증) 을 구현하는 절차를 진행하였습니다.

또한, OTPKEY 인증서버는 다양한 로그인 방식을 지원하고 있으니 저희 기술문서 사이트를 많이 참고 바라겠습니다.

참고 :

이 문서에서 사용된 Spring Security LDAP Authentication 코드는 https://github.com/otpkey 에서 다운 받을 수 있습니다.

https://github.com/otpkey/ldapauth

 

GitHub - otpkey/ldapauth: Sample code for adding OTPKEY push authentication to Spring Security web login authentication.

Sample code for adding OTPKEY push authentication to Spring Security web login authentication. - GitHub - otpkey/ldapauth: Sample code for adding OTPKEY push authentication to Spring Security web l...

github.com

 

동영상은 https://www.youtube.com/@otpkey 에서 확인하실 수 있습니다.

https://youtu.be/1EC0wBPPHoc

 

감사합니다.

반응형

'내 프로젝트 > 보안인증 (OTPKEY)' 카테고리의 다른 글

스마트한 DDNS 서비스 ImDNS  (1) 2023.05.17
OTPKEY 인증자 앱  (0) 2023.03.26
마이크로소프트 윈도우즈 스토어  (0) 2023.03.20
Comments