LDAP

Welcome to Seoyun Dev Log·2023년 8월 30일
0

LDAP 접속 순서

import javax.naming.Context;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import java.util.Hashtable;

public class LdapQueryExample {
    public static void main(String[] args) {
        Hashtable<String, String> env = new Hashtable<>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://ldap.example.com:389");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, "cn=admin,dc=example,dc=com");
        env.put(Context.SECURITY_CREDENTIALS, "password");
        
        try {
            DirContext ctx = new InitialDirContext(env);

            // 검색 설정
            SearchControls searchControls = new SearchControls();
            searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

            // LDAP 쿼리
            String searchFilter = "(objectClass=person)";
            
            // 검색 수행
            NamingEnumeration<SearchResult> results = ctx.search("ou=users,dc=example,dc=com", searchFilter, searchControls);
            
            // 결과 처리
            while (results.hasMore()) {
                SearchResult result = results.next();
                System.out.println("Name: " + result.getName());
                System.out.println("Attributes: " + result.getAttributes());
            }
            
            ctx.close();
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
}

LDAP 속성

LDAP DN

: DN(Distinguished Name) : 특정 이름으로 컴퓨터를 domain에 저장 (표준형식) Directory Srvice 에서 개체를 고유하게 해주는 이름
ex) OU=엔지니어부, DC=tistory, DC=com

속성

1) DN(Distinguished Name) : 특정 이름으로 컴퓨터를 domain에 저장 (표준형식)
Directory Srvice 에서 개체를 고유하게 해주는 이름
ex) OU=엔지니어부, DC=tistory, DC=com

2) RDN(Relative DN) : DN에서 domain을 생략한 것

ex) OU=엔지니어부

3) CN(Canonical Name) : 보여지는 이름

ex) 조재윤

4) LDAP(Lightweight Directory Access Protocol)

  • 둘 이상의 DN이 정보를 주고 받을때 사용하는 프로토콜

5) SID (Security ID) : 보안 ID - 고유한 식별번호, 일련번호 (랜덤하게 생성)

-> window는 logon ID와는 다른 고유한 일련번호로 저장한다.

6) RID (Relative ID)

-> SID와 컴퓨터 이름의 중복을 막기 위해 Domain에서 추가적으로 부여하는 일련번호

7) GUID (Global Unique ID) : RID가 모여있는 일련번호

연결 설정 속성

  • com.sun.jndi.ldap.connect.timeout: LDAP 서버에 연결할 때, 연결을 설정하는 데 소요되는 시간이 정해진 타임아웃 값 내에 완료되지 않으면 연결이 실패하게 됩니다. 이것은 네트워크 장애나 서버 응답 지연과 같은 상황에서 무한정 대기하지 않도록 보장하기 위한 중요한 설정

만약 timeout 내에 LDAP 서버와의 연결이 수립되지 않으면 Exception이 발생할 것

  • com.sun.jndi.ldap.LdapCtxFactory: com.sun.jndi.ldap.LdapCtxFactory를 사용하여 실제 LDAP 서버와 연결하고, 요청된 검색을 수행하여 결과를 반환합

LDAP의 "include" 쿼리

: LDAP 필터의 조건을 확장하여 다른 조건을 추가하거나 포함하는데 사용되는 개념
: LDAP 필터 문자열 내에 다른 필터를 포함하는 방식으로 구현됩니다. LDAP 필터의 조건은 (&) 또는 (|)와 같은 논리 연산자를 사용하여 복합 조건으로 결합될 수 있습니다.

예를 들어, 다음은
"(&(objectClass=person)(memberOf=cn=users,ou=groups,dc=example,dc=com))"라는
LDAP "include" 쿼리의 예입니다. 이 쿼리는 "objectClass"가 "person"인 엔트리 중에서 "memberOf" 속성 값이 "cn=users,ou=groups,dc=example,dc=com"인 엔트리들을 검색합니다.

ldap sAMAccountName

sAMAccountName은 Microsoft Active Directory(AD)에서 사용되는 속성(attribute)의 하나로, 사용자 계정의 로그인 이름을 나타냅니다. 이 로그인 이름은 보통 사용자가 네트워크에 로그인할 때 사용되는 계정의 식별자입니다.

sAMAccountName은 주로 다음과 같은 형식으로 사용됩니다: domain\username 또는 username@domain.com. 이는 사용자가 도메인에 대한 계정 이름과 함께 로그인할 수 있도록 하는 것을 지원합니다.

Active Directory에 있는 사용자의 sAMAccountName을 검색하거나 필터링하는 경우 LDAP 쿼리에서는 일반적으로 sAMAccountName 속성을 사용하여 검색을 수행합니다. 예를 들어, "johndoe"라는 사용자의 sAMAccountName을 검색하는 LDAP 쿼리는 다음과 같이 작성될 수 있습니다:

(&(objectClass=user)(sAMAccountName=johndoe))

위의 쿼리는 "user" 객체 클래스에 속하면서 sAMAccountName 속성이 "johndoe"인 엔트리를 검색합니다.

ldap failover

LDAP 클라이언트가 LDAP 서버와의 연결을 유지하거나 복구하기 위한 전략을 나타냅니다. LDAP 서버 장애가 발생하거나 서비스가 중단되는 경우, 클라이언트가 중단 없이 서비스를 계속할 수 있도록 하는 것이 목표

LDAP 서버 장애 조치를 구현하는 방법 중 일부는 다음과 같습니다:

  • 다중 서버 구성: 클라이언트가 여러 개의 LDAP 서버를 사용하여 요청을 분산하고, 하나의 서버가 실패하면 다른 서버로 자동으로 요청을 전환합니다. 이를 통해 하나의 서버가 다운되더라도 다른 서버로 요청을 처리할 수 있습니다.

  • LDAP 프록시: LDAP 프록시 서버는 클라이언트와 실제 LDAP 서버 사이에서 중개 역할을 하며, 클라이언트는 프록시 서버에만 연결합니다. 프록시 서버가 여러 개의 실제 LDAP 서버와 통신하여 요청을 전달하며, 장애 시에도 서버 선택 및 재시도 로직을 통해 failover를 제공할 수 있습니다.

  • 연결 및 타임아웃 관리: LDAP 클라이언트는 서버와의 연결을 유지하거나 끊는 데 관한 설정을 가질 수 있습니다. 장애 시에는 연결이 끊어지지 않도록 타임아웃 값을 적절하게 설정하고, 연결이 끊겼을 때 서버 재시도 로직을 구현하여 클라이언트가 서비스를 유지할 수 있도록 할 수 있습니다.

  • 캐싱 및 미러링: LDAP 클라이언트는 데이터를 로컬 캐시에 저장하거나 미러 서버에 데이터를 동기화하여 사용자 요청에 더 빠른 응답을 제공할 수 있습니다. 장애 시에도 캐시나 미러 서버를 통해 데이터를 제공할 수 있습니다.

  • 지속적인 모니터링: LDAP 클라이언트는 서버의 상태를 지속적으로 모니터링하여 장애 발생 시 즉시 대응할 수 있도록 합니다. 서버가 응답하지 않거나 응답 시간이 길어질 경우, 클라이언트는 다른 서버로 요청을 전환할 수 있습니다.

LDAP 서버 장애 조치는 클라이언트의 요구 사항과 서버 환경에 따라 다양한 전략을 선택하여 구현할 수 있습니다. 클라이언트 애플리케이션의 중단 없는 서비스 제공을 위해 장애 조치 전략을 신중하게 고려하고 구현하는 것이 중요합니다.


  • InitialDirContext.search()
search(String name, String filter, SearchControls cons)

: name: 검색을 시작할 베이스 DN (Distinguished Name)입니다.
filter: 검색 조건을 나타내는 LDAP 필터 문자열입니다.
cons: 검색 설정을 나타내는 SearchControls 객체입니다.

베이스 DN에서 (objectClass=person) 조건을 만족하는 객체들을 검색하는 작업을 수행합니다.
검색 결과는 results 열거형(iterable)에 저장
따라서 반복적으로 수행할 수 있다

profile
하루 일지 보단 행동 고찰 과정에 대한 개발 블로그

0개의 댓글