OpenLDAP
1. 개요
OpenLDAP은 1998년 시작된 오픈 소스 LDAP 서버 구현 프로젝트이다. 핵심 구성 요소는 독립형 LDAP 데몬인 `slapd`, LDAP 부하 분산 프록시 서버인 `lloadd`, LDAP 프로토콜을 구현하는 라이브러리, 그리고 클라이언트 소프트웨어로 구성된다. OpenLDAP은 다양한 백엔드, 오버레이, 모듈을 지원하며, 특히 RFC 4533 기반의 Syncrepl 및 Delta-syncrepl 복제 기능을 제공한다.
| 명칭 | OpenLDAP |
|---|---|
| 설명 | 인터넷 프로토콜 구현체 |
| 개발자 | OpenLDAP 프로젝트 |
|---|---|
| 최초 릴리스 날짜 | 1998년 8월 26일 |
| 최신 릴리스 버전 | 2.6.6 |
| 최신 릴리스 날짜 | 2023년 7월 31일 |
| 프로그래밍 언어 | C 언어 |
| 운영 체제 | 모든 운영 체제 |
| 플랫폼 | 크로스 플랫폼 |
| 장르 | LDAP 디렉터리 서비스 |
| 라이선스 | OpenLDAP Public License |
-
디렉토리 서비스 -
액티브 디렉터리
액티브 디렉터리는 마이크로소프트에서 개발한 디렉터리 서비스로, 윈도우 도메인 네트워크의 핵심 기반이며, 사용자, 컴퓨터, 그룹 등 네트워크 리소스에 대한 중앙 집중식 관리, 인증 및 접근 권한 제어를 제공하고, AD DS, AD LDS, AD CS, AD FS, AD RMS 등의 서비스로 구성되어 포리스트, 트리, 도메인으로 구성된 계층 구조를 가진다. -
디렉토리 서비스 -
X.500
X.500은 ITU-T가 정의한 디렉터리 서비스 표준으로, 분산 환경에서 정보 접근을 위한 프로토콜과 데이터 모델을 제공하며, 경량 디렉터리 접근 프로토콜(LDAP)과 X.509 인증 프레임워크에 영향을 주었다. -
C로 작성된 자유 소프트웨어 -
PostgreSQL
PostgreSQL은 캘리포니아 대학교 버클리 분교의 Ingres 프로젝트에서 시작되어 전 세계 개발자들의 협력을 통해 발전해온 객체 관계형 데이터베이스 관리 시스템(ORDBMS)이다. -
C로 작성된 자유 소프트웨어 -
김프
김프(GIMP)는 GNU 프로젝트에서 개발된 크로스 플랫폼 기반의 무료 오픈소스 래스터 그래픽 편집기로, 다양한 운영체제를 지원하며 풍부한 기능을 제공하지만 사용자 인터페이스에 대한 비판과 일부 기능의 부족함에 대한 평가도 존재한다. -
공식 웹사이트에 알 수 없는 변수를 사용한 문서 -
브루클린 미술관
브루클린 미술관은 1823년 브루클린 견습생 도서관으로 시작하여 현재 약 50만 점의 소장품을 보유한 뉴욕 브루클린 소재의 미술관으로, 다양한 분야의 예술 작품을 전시하며 특히 아프리카 미술과 여성주의 미술에 대한 기여가 크다. -
공식 웹사이트에 알 수 없는 변수를 사용한 문서 -
광주지방기상청
광주지방기상청은 광주광역시와 전라남도 지역의 기상 예보, 특보, 관측, 기후 정보 제공 등의 업무를 수행하는 기상청 소속 기관으로, 1949년 광주측후소로 설치되어 1992년 광주지방기상청으로 개편되었으며, 기획운영과, 예보과, 관측과, 기후서비스과와 전주기상지청, 목포기상대를 두고 있다.
2. 역사
OpenLDAP 프로젝트는 1998년 쿠르트 자일렌가(Kurt Zeilenga)에 의해 시작되었다. 이 프로젝트는 미시간 대학교에서 1996년 최종 릴리스까지 LDAP 프로토콜의 개발과 발전을 지원했던 장기 프로젝트의 레퍼런스 구현을 복제하여 시작되었다.
2015년 5월 기준으로 OpenLDAP 프로젝트의 핵심 팀원은 하워드 추(수석 아키텍트), 콴아 기브슨-마운트, 홀바르드 푸루세스, 쿠르트 자일렌가 4명이다. 그 외에도 루크 하워드, 라이언 탠디, 개빈 헨리 등 중요하고 활동적인 기여자들이 있으며, 과거 핵심 팀원으로는 피에란젤로 마사라티가 있다.
2.1. 주요 릴리즈
| 버전 | 출시일 | 주요 특징 |
|---|---|---|
| OpenLDAP 1 | 미시간 대학교의 마지막 릴리스(릴리스 3.3) 정리 및 개선 | |
| OpenLDAP 2.0 | 2000년 8월 | LDAPv3 지원, IPv6 지원 등 |
| OpenLDAP 2.1 | 2002년 6월 | 트랜잭션 데이터베이스 백엔드(버클리 DB 기반), 단순 인증 및 보안 계층(SASL) 지원 등 |
| OpenLDAP 2.2 | 2003년 12월 | 복제 지원(syncrepl), 오버레이 인터페이스 등 |
| OpenLDAP 2.3 | 2005년 6월 | 구성 백엔드(동적 구성), RFC 준수 비밀번호 정책 등 |
| OpenLDAP 2.4 | 2007년 10월 | N-way 멀티마스터 복제, 스키마 요소 동적 수정 등 |
| OpenLDAP 2.5 | 2021년 4월 | LDAP 로드 밸런싱 프록시 서버, LDAP 트랜잭션 지원 등 |
| OpenLDAP 2.6 | 2021년 10월 | 추가 로드 밸런싱 전략, 로깅 기능 개선 등 |
3. 구성 요소
OpenLDAP는 독립형 LDAP 데몬인 slapd, lloadd, LDAP 프로토콜과 ASN.1 BER(Basic Encoding Rules)을 구현하는 라이브러리, 클라이언트 소프트웨어 (ldapsearch, ldapadd, ldapdelete 등)로 구성된다.
3.1. 핵심 구성 요소
OpenLDAP는 다음 4가지 주요 구성 요소를 가지고 있다.
* slapd - 독립형 LDAP 데몬 및 관련 모듈과 도구.
* lloadd - 독립형 LDAP 부하 분산 프록시 서버
* LDAP 프로토콜과 ASN.1 기본 인코딩 규칙(BER)을 구현하는 라이브러리
* 클라이언트 소프트웨어: ldapsearch, ldapadd, ldapdelete 등
또한 OpenLDAP 프로젝트는 여러 하위 프로젝트를 보유하고 있다.
* JLDAP – Java용 LDAP 클래스 라이브러리
* JDBC-LDAP – Java JDBC – LDAP 브리지 드라이버
* ldapc++ – C++용 LDAP 클래스 라이브러리
* LMDB – 메모리 맵 데이터베이스 라이브러리
3.2. 하위 프로젝트
OpenLDAP 프로젝트는 다음과 같은 여러 하위 프로젝트를 포함하고 있다.
* JLDAP – 자바용 LDAP 클래스 라이브러리
* JDBC-LDAP – Java JDBC – LDAP 브리지 드라이버
* ldapc++ – C++용 LDAP 클래스 라이브러리
* LMDB – 메모리 맵 데이터베이스 라이브러리
* Fortress - 자바 용 롤 기반 ID 액세스 관리 (일본어판)
4. 백엔드
OpenLDAP 서버(slapd)는 네트워크 처리와 프로토콜 처리를 담당하는 프론트엔드와 데이터 스토리지를 처리하는 백엔드로 나뉜다. 이러한 구조는 1996년 미시간 대학교 코드에서 시작되어 모든 OpenLDAP 릴리스에서 이어져 왔다.
OpenLDAP는 모듈식 구조를 가지고 있으며, 일반적인 데이터베이스뿐만 아니라 다양한 기술과 인터페이스하는 여러 종류의 백엔드를 제공한다. OpenLDAP 배포판에는 17가지 백엔드가 포함되어 있으며, 서드 파티 개발 백엔드도 존재한다. 표준 백엔드는 크게 데이터 저장, 프록시, 동적 백엔드의 세 가지로 분류된다.
4.1. 백엔드의 개념
OpenLDAP 서버(slapd, 독립형 LDAP 데몬) 아키텍처는 네트워크 접근과 프로토콜 처리를 담당하는 프론트엔드와 데이터 저장만을 처리하는 백엔드로 나뉘어져 있다. 이러한 분할 설계는 1996년에 작성된 미시간 대학교의 원래 코드의 특징이며, 이후 모든 OpenLDAP 릴리스에서 지속되었다. 원래 코드는 하나의 주요 데이터베이스 백엔드와 두 개의 실험/데모 백엔드를 포함했다. 이 아키텍처는 모듈형이며, 전통적인 데이터베이스뿐만 아니라 다른 기술과의 인터페이스를 위한 다양한 백엔드가 현재 제공되고 있다.
이전(1.x) 릴리스에서는 "백엔드"와 "데이터베이스"라는 용어가 종종 같은 의미로 사용되었으나, 정확히는 "백엔드"는 스토리지 인터페이스의 클래스이고, "데이터베이스"는 백엔드의 인스턴스이다. slapd 서버는 임의의 수의 백엔드를 동시에 사용할 수 있으며, 각 백엔드의 임의의 수의 인스턴스(즉, 임의의 수의 데이터베이스)를 동시에 활성화할 수 있다.
4.2. 백엔드의 종류
OpenLDAP 배포판에는 17가지 종류의 백엔드가 포함되어 있으며, 이 외에도 서드 파티가 자체 백엔드를 개발하고 있다. 표준 백엔드는 크게 데이터 저장, 프록시, 동적 백엔드의 세 가지로 분류할 수 있다.
과거에는 back-ldbm, back-tcl 등의 백엔드도 있었으나 현재는 사용되지 않는다. back-ldbm은 원래 미시간 대학교의 코드를 계승한 백엔드이며, back-tcl은 Tcl 스크립트를 호출하는 백엔드였다.
back-perl, back-shell, back-sock과 같은 백엔드는 임의의 프로그래밍 언어에 대한 인터페이스를 제공하여 확장 및 사용자 정의가 자유롭게 가능하다. 이를 이용하여, slapd를 작고 잘 정의된 API를 가진 RPC 엔진으로 사용할 수도 있다.
4.2.1. 데이터 저장 백엔드
OpenLDAP는 데이터를 실제로 저장하는 다양한 백엔드를 제공한다.
* back-mdb: Lightning Memory-Mapped Database(LMDB) 기반의 트랜잭션 백엔드이다.
* back-ldif: LDIF 파일을 기반으로 하는 백엔드이다.
* back-bdb (제거됨): 버클리 DB 기반의 트랜잭션 백엔드였으나, OpenLDAP 2.5에서 제거되었다.
* back-hdb (제거됨): back-bdb의 변형으로 계층적 구조를 지원했으나, OpenLDAP 2.5에서 제거되었다.
* back-ndb (제거됨): MySQL NDB 클러스터 엔진 기반의 트랜잭션 백엔드였으나, OpenLDAP 2.6에서 제거되었다.
* back-wiredtiger: WiredTiger 기반의 실험적인 트랜잭션 백엔드이다.
back-bdb와 back-hdb는 back-mdb보다 성능, 안정성, 관리 용이성이 떨어져 제거되었다. back-ndb는 MySQL을 인수한 오라클에 의해 파트너십이 종료되어 제거되었다.
4.2.2. 프록시 백엔드
OpenLDAP에서 프록시 백엔드는 다른 데이터 저장 시스템으로의 게이트웨이 역할을 한다. 다음은 프록시 백엔드의 종류이다.
* back-ldap: 다른 LDAP 서버로의 단순 프록시 역할을 한다.
* back-meta: 메타 디렉터리 기능을 갖춘 프록시이다.
* back-asyncmeta: 메타 디렉터리 기능을 갖춘 비동기 프록시로, OpenLDAP 2.5에 도입되었다.
* back-passwd: 유닉스 계열 시스템의 passwd 및 그룹 데이터를 사용한다.
* back-relay: 다른 slapd 백엔드로 리디렉션한다.
* back-sql: 임의의 SQL 데이터베이스와 통신하며, OpenLDAP 2.5부터 더 이상 사용되지 않는다.
4.2.3. 동적 백엔드
동적 백엔드는 요청 시 데이터를 생성한다.
* back-config: LDAP를 통한 slapd 구성
* back-dnssrv: DNS를 통해 LDAP 서버를 찾습니다.
* back-monitor: LDAP를 통한 slapd 통계
* back-null: Unix /dev/null과 유사한 싱크/무작업 백엔드
* back-perl: LDAP 요청에 대한 응답으로 임의의 Perl 모듈을 호출하며, OpenLDAP 2.5에서 더 이상 사용되지 않습니다.
* back-shell: LDAP 요청에 대해 셸 스크립트를 호출하며, OpenLDAP 2.5에서 제거되었습니다.
* back-sock: IPC를 통해 LDAP 요청을 임의의 데몬으로 전달합니다.
5.1. 오버레이의 개념
일반적으로 LDAP 요청은 프런트엔드에서 수신되어 디코딩된 후 처리를 위해 백엔드로 전달된다. 백엔드가 요청을 완료하면 결과를 프런트엔드로 반환하고, 프런트엔드는 결과를 LDAP 클라이언트로 보낸다. 오버레이는 프런트엔드와 백엔드 사이에 삽입될 수 있는 코드 조각이다. 따라서 백엔드가 요청을 받기 전에 요청을 가로채고 다른 작업을 트리거할 수 있으며, 마찬가지로 백엔드의 결과가 프런트엔드에 도달하기 전에 이에 대해 작용할 수 있다. 오버레이는 slapd 내부 API에 대한 완전한 접근 권한을 가지므로 프런트엔드 또는 다른 백엔드가 수행할 수 있는 모든 것을 호출할 수 있다. 여러 오버레이를 한 번에 사용하여 프런트엔드와 백엔드 사이에 모듈 스택을 형성할 수 있다.
오버레이는 완전히 새로운 백엔드를 작성할 필요 없이 데이터베이스의 기능을 보강하는 간단한 방법을 제공하며, 작고, 쉽게 디버깅하고 유지 관리할 수 있는 모듈로 새로운 기능을 추가할 수 있다. OpenLDAP 2.2에서 오버레이 기능이 도입된 이후 OpenLDAP 커뮤니티에서 많은 새로운 오버레이가 기여되었다.
5.2. 오버레이의 종류
OpenLDAP영어는 프런트엔드와 백엔드 사이에 삽입되어 기능을 보강하거나 변경할 수 있는 다양한 오버레이를 제공한다. 오버레이는 작고, 쉽게 디버깅하고 유지 관리할 수 있는 모듈로 새로운 기능을 추가할 수 있게 해준다. OpenLDAP 2.2에서 오버레이 기능이 도입된 이후, OpenLDAP 커뮤니티에서는 많은 새로운 오버레이들이 개발, 추가되었다.
5.2.1. 코어 오버레이
OpenLDAP는 핵심 배포판에 25개의 오버레이를 제공하며, 사용자 기여 코드 섹션에는 24개의 오버레이가 있고, 더 많은 오버레이가 승인을 기다리고 있다. 코어 오버레이는 다음과 같다.
| 이름 | 설명 | 비고 |
|---|---|---|
| accesslog | 다른 LDAP 데이터베이스에 서버 활동을 로깅한다. | |
| auditlog | 텍스트 파일에 서버 활동을 기록한다. | |
| autoca | 자동 인증 기관. | OpenLDAP 2.5 |
| chain | 참조를 가로채 연결한다. | back-ldap의 일부 |
| collect | X.500 스타일의 집합 속성을 구현한다. | |
| constraint | 특정 속성에 허용되는 값을 제한한다. | |
| dds | 동적 데이터 서비스 – 수명이 짧고 자체 만료되는 항목. | |
| deref | 주어진 검색 결과에서 참조된 항목에 대한 정보를 반환한다. | |
| dyngroup | 간단한 동적 그룹 지원. | |
| dynlist | 더욱 정교한 동적 그룹 지원 및 기타 기능. | |
| homedir | 원격 홈 디렉토리 프로비저닝. | OpenLDAP 2.5 |
| memberof | memberOf 및 유사한 백링크 속성에 대한 지원. | |
| otp | OATH 일회용 비밀번호를 LDAP 사용자 비밀번호와 함께 사용할 수 있다. | OpenLDAP 2.5 |
| pcache | 검색 결과를 캐시하여 주로 프록시 서버의 성능을 향상시킨다. | |
| ppolicy | LDAP 비밀번호 정책 (비밀번호 품질, 만료 등). | |
| refint | 참조 무결성. | |
| remoteauth | 원격 디렉토리에 인증 요청 위임을 허용한다. 마이크로소프트 Active Directory와 함께 작동한다. | OpenLDAP 2.5 |
| retcode | 다양한 작업에 대해 미리 결정된 반환 코드를 설정한다. 클라이언트 디버깅에 사용된다. | |
| rwm | LDAP 데이터의 다양한 변경을 위한 재작성 모듈. | |
| seqmod | 개별 항목에 대한 쓰기를 직렬화한다. | |
| sssvlv | 서버 측 정렬 및 가상 목록 보기. | |
| syncprov | Syncrepl Provider, 복제 계약의 마스터 측을 구현한다. | |
| translucent | 반투명 통과, 프록시 서버에서 로컬로 데이터를 보강하기 위한 것. | |
| unique | 트리 내에서 속성 값의 고유성을 적용하기 위한 것. | |
| valsort | 속성 값에 대한 다양한 정렬 순서를 유지한다. |
5.2.2. contrib 오버레이
6. 기타 모듈
백엔드와 오버레이는 가장 일반적으로 사용되는 두 가지 유형의 모듈이다. 백엔드는 일반적으로 `slapd` 바이너리에 내장되었지만, 동적으로 로드 가능한 모듈로 빌드될 수도 있다. 오버레이는 일반적으로 동적 모듈로 빌드된다. 또한, `slapd`는 새로운 LDAP 구문, 일치 규칙, 제어 및 확장 작업을 구현하기 위한 동적 모듈뿐만 아니라 사용자 지정 접근 제어 메커니즘 및 비밀번호 해싱 메커니즘을 구현하기 위한 동적 모듈도 지원한다.
OpenLDAP는 썬 마이크로시스템즈와 넷스케이프/페도라/레드햇에서 사용되는 플러그인 아키텍처인 SLAPI도 지원한다. 현재 릴리스에서는 SLAPI 프레임워크가 `slapd` 오버레이 내에 구현되어 있다. Sun/Netscape/Fedora/Red Hat용으로 작성된 많은 플러그인이 OpenLDAP와 호환되지만, OpenLDAP 커뮤니티에서는 SLAPI를 사용하는 구성원이 거의 없다.
6.1. 사용 가능한 모듈
OpenLDAP에서 사용 가능한 모듈은 다음과 같다.
* slapd 네이티브 모듈
* ACL/posixgroup – POSIX 접근 제어를 지원한다.
* comp_match – 컴포넌트 기반 매칭을 지원한다.
* kinit – slapd에서의 Kerberos TGT 유지보수 및 갱신을 지원한다.
* passwd/ – 추가적인 패스워드 해싱 메커니즘. 현재 Kerberos, Netscape, RADIUS, 그리고 SHA-2를 제공한다.
* SLAPI 플러그인
* addrdnvalue – 추가 요청에서 RDN 값이 생략된 경우, 엔트리에 RDN 값을 추가한다.
7. 복제
OpenLDAP는 IETF RFC 4533에 규정된 콘텐츠 동기화를 사용한 복제를 지원하며, 이를 syncrepl이라고 부른다. 기본 사양 외에도 delta-syncrepl로 알려진 확장 기능도 지원한다. 다중 프라이머리형(멀티 마스터) 복제를 지원하기 위해 추가적인 확장 기능이 구현되었다.
이 프로토콜은 변경 시퀀스 번호(CSN) 정보를 사용하여 변경 사항을 추적하며, 별도의 영구 데이터베이스가 필요하지 않다. 복제는 복제 클라이언트(소비자)가 복제 서버(제공자)에 "콘텐츠 동기화 검색"을 보내는 방식으로 이루어진다.
7.1. Syncrepl
OpenLDAP는 RFC 4533에 명시된 콘텐츠 동기화(Content Synchronization)를 사용하여 복제를 지원하며, 이를 "syncrepl"이라고 부른다.
이 프로토콜은 변경 시퀀스 번호(CSN) 정보를 사용하여 변경 사항을 추적하며, 별도의 영구 데이터베이스가 필요 없다. 복제 클라이언트(소비자)는 복제 서버(제공자)에 "콘텐츠 동기화 검색"을 보내 복제를 수행한다. 소비자는 이전에 제공자와 동기화된 경우 쿠키를 제공할 수 있으며, 이 쿠키에는 제공자로부터 받은 최신 CSN(contextCSN)이 포함된다.
제공자는 쿠키 정보를 기반으로 소비자를 동기화된 상태로 만들기 위해 변경되지 않은 항목, 추가, 수정 또는 삭제된 항목을 반환한다. 쿠키가 없거나 소비자가 완전히 동기화되지 않은 경우, 제공자는 모든 항목에 대한 추가 정보를 보낸다.
검색은 새로 고침(refresh) 또는 새로 고침 및 지속(refreshAndPersist) 모드 중 하나로 수행할 수 있다. 새로 고침 단계에서는 현재(present) 및 삭제(delete)의 두 단계가 발생할 수 있으며, 현재 단계는 항상 삭제 단계보다 먼저 발생한다. 각 단계는 동기화 정보 응답을 통해 구분된다.
현재 단계에서는 변경되지 않은 항목이 반환될 수 있지만, 삭제 단계에서는 삭제될 항목만 제공될 수 있다. 추가 항목(수정된 항목의 모든 현재 속성을 포함)은 두 단계 모두에서 반환될 수 있다. 현재 단계가 끝나면, 소비자는 제공자와 동기화하기 위해 추가 항목 또는 현재 응답에서 식별되지 않은 항목을 삭제해야 한다.
지속 단계가 시작되면, 제공자는 새로 고침 단계 이후 변경된 항목에 대해서만 추가, 수정 및 삭제 정보를 보낸다. 지속 단계는 무기한으로 계속된다.
7.2. Delta-syncrepl
Delta-syncrepl은 Syncrepl의 확장 기능으로, 변경 로그를 유지하여 변경된 속성만 전송하는 기능을 제공한다. 이는 LDAP 로그 스키마를 사용하여 기록된다.
이 프로토콜은 쓰기(변경) 접근 데이터베이스를 유지함으로써 모든 변경 사항을 엄격하게 나타낸다. 표준 syncrepl 사양을 기반으로 하며, 변경 사항을 항상 완전한 항목으로 전송한다. delta-syncrepl에서는 전송된 항목이 실제로 로그 데이터베이스에서 전송되며, 메인 데이터베이스의 각 변경 사항은 로그 항목으로 기록된다.