OpenLDAP 서버를 Docker Compose를 활용하여 구축 구성 및 운영에 대한 안내서

OpenLDAP 서버를 Docker Compose를 활용하여 구축 구성 및 운영에 대한 안내서

1. 서론: 컨테이너 환경에서의 OpenLDAP

OpenLDAP은 조직 내 사용자, 시스템, 네트워크, 서비스 및 애플리케이션에 대한 정보를 공유하기 위한 핵심적인 디렉토리 서비스로 기능한다.1 이는 중앙 집중식 인증 솔루션의 근간을 이루며, 이를 통해 분산된 시스템 전반에 걸쳐 ID 관리를 단순화하고, 보안 정책을 일관되게 적용하며, 접근 제어를 효율적으로 개선할 수 있다.2

이러한 OpenLDAP 서버를 배포하는 데 Docker와 Docker Compose를 활용하는 것은 현대적인 IT 환경에서 수많은 이점을 제공한다. Docker는 격리되고 일관된 환경을 보장하여, 호스트 시스템의 환경을 변경하지 않고도 신속하고 간편하게 서버를 구축할 수 있게 한다.4 특히 Docker Compose는 OpenLDAP 서버와 phpLDAPadmin과 같은 관리 도구를 포함하는 전체 서비스 스택을 단일 YAML 파일로 정의하고,

docker-compose up이라는 단 하나의 명령어로 모든 구성 요소를 동시에 실행, 연결 및 테스트할 수 있게 해준다. 이는 개발, 테스트, 프로덕션 환경 전반에 걸쳐 디버깅 과정을 단순화하고 사용자 정의를 용이하게 만든다.4

단순한 배포 도구를 넘어, Docker Compose는 OpenLDAP 서버의 전체 생명주기—구성, 초기 데이터, 보안 정책—를 선언적으로 정의하고 버전 관리할 수 있는 강력한 프레임워크를 제공한다. docker-compose.yml 파일, 초기 데이터가 담긴 bootstrap.ldif 파일, TLS 인증서 등 모든 구성 요소는 텍스트 기반 파일로 존재하므로 Git과 같은 버전 관리 시스템으로 완벽하게 통제할 수 있다. 이는 전통적인 서버 관리 방식에서 벗어나, 재현 가능하고 이식성 높은 ID 관리 시스템을 구축하는 패러다임의 전환을 의미한다. 즉, ID 인프라 전체를 코드로 관리(Infrastructure as Code)함으로써 변경 사항을 추적하고, 여러 환경에 걸쳐 동일한 상태를 오차 없이 재현하며, DevOps 워크플로우에 완벽하게 통합할 수 있는 기반을 마련하는 것이다.

2. 부: 기반 환경 구축 및 기본 구성

2.1 프로젝트 환경 설정

안정적이고 확장 가능한 OpenLDAP 운영을 위해서는 체계적인 디렉토리 구조를 갖추는 것이 첫걸음이다. 다음 구조는 구성 파일(docker-compose.yml), 영속적 데이터(data/), 초기화 스크립트(ldif/), 그리고 보안 인증서(certs/)를 명확히 분리하여 관리의 복잡성을 줄이고 운영 효율성을 극대화한다.4

ldap-docker/
├── docker-compose.yml
├── data/
│   ├── openldap-data/
│   └── openldap-config/
├── ldif/
│   └── bootstrap.ldif
└── certs/
├── ldap.crt
└── ldap.key

각 디렉토리와 파일의 역할은 다음과 같다.

  • docker-compose.yml: OpenLDAP과 phpLDAPadmin 서비스 스택의 구성, 네트워크, 볼륨 등을 정의하는 핵심 파일이다.

  • data/: 컨테이너가 삭제되거나 재시작되어도 데이터가 보존되도록 영속적 데이터를 저장하는 호스트 디렉토리다.

  • openldap-data/: 실제 사용자 및 그룹 정보가 저장되는 LDAP 데이터베이스 파일(MDB)이 위치한다.

  • openldap-config/: 서버의 스키마, ACL, 복제 설정 등 동적 구성 정보가 저장된다.

  • ldif/: 서버가 처음 시작될 때 디렉토리의 기본 구조(OU, 그룹 등)를 자동으로 생성하는 데 사용될 LDIF(LDAP Data Interchange Format) 파일을 보관한다.

  • certs/: 프로덕션 환경에서 통신을 암호화하기 위한 사용자 정의 TLS/SSL 인증서 파일을 저장한다.

이러한 디렉토리 구조는 단순한 파일 정리를 넘어, 컨테이너의 ’상태(State)’를 ’영속적 데이터(Persistent Data)’와 ’초기화 구성(Initialization Config)’으로 명확히 분리하는 설계 철학을 반영한다. ldif/certs/ 디렉토리의 내용은 버전 관리 시스템(Git)으로 추적해야 할 ’구성’의 일부이며, data/ 디렉토리는 런타임에 생성되는 ’데이터’이므로 정기적인 백업의 대상이 된다. 이 논리적 분리는 신규 배포, 데이터 마이그레이션, 백업 및 복원과 같은 다양한 운영 시나리오에 맞는 올바른 전략을 직관적으로 선택하고 실행할 수 있도록 유도하여, 관리의 복잡성을 근본적으로 단순화시킨다.

2.2 핵심 docker-compose.yml 작성

osixia/openldaposixia/phpldapadmin 이미지를 기반으로 한 docker-compose.yml 파일은 두 서비스를 유기적으로 연결하는 역할을 한다. 아래는 필수적인 구성 요소를 포함한 예시이다.4

version: '3.8'

services:
openldap:
image: osixia/openldap:1.5.0
container_name: openldap-server
hostname: ldap.example.org
environment:
- LDAP_ORGANISATION=Example Inc
- LDAP_DOMAIN=example.org
- LDAP_ADMIN_PASSWORD=adminpassword
- LDAP_CONFIG_PASSWORD=configpassword
- LDAP_TLS=false
volumes:
-./data/openldap-data:/var/lib/ldap
-./data/openldap-config:/etc/ldap/slapd.d
-./ldif/bootstrap.ldif:/container/service/slapd/assets/config/bootstrap/ldif/custom.ldif
ports:
- "389:389"
- "636:636"
networks:
- ldap_network
command: --copy-service
restart: unless-stopped

phpldapadmin:
image: osixia/phpldapadmin:latest
container_name: phpldapadmin-ui
environment:
- PHPLDAPADMIN_LDAP_HOSTS=openldap-server
- PHPLDAPADMIN_HTTPS=false
ports:
- "8080:80"
networks:
- ldap_network
depends_on:
- openldap
restart: unless-stopped

networks:
ldap_network:
driver: bridge

이 구성의 주요 특징은 다음과 같다.

  • 네트워크 격리: ldap_network라는 사용자 정의 브리지 네트워크를 생성하여 두 서비스가 외부와 격리된 안전한 환경에서 서로 통신하도록 한다.4

  • 서비스 의존성: depends_on 지시어를 사용하여 openldap 서비스가 완전히 시작된 후에 phpldapadmin 서비스가 시작되도록 보장한다. 이는 phpLDAPadmin이 연결할 대상 서버가 없는 상태로 시작되는 것을 방지한다.4

  • 자동 재시작: restart: unless-stopped 정책을 적용하여 호스트 시스템이 재부팅되거나 컨테이너가 예기치 않게 종료되었을 때 자동으로 재시작되도록 설정함으로써 서비스 가용성을 높인다.4

3. 부: OpenLDAP 서비스 심층 분석

3.1 필수 환경 변수 마스터하기

osixia/openldap 이미지는 환경 변수를 통해 서버의 거의 모든 측면을 제어하도록 설계되었다. 이는 컨테이너를 변경 불가능한 인프라(Immutable Infrastructure)로 취급하는 Docker의 핵심 원칙에 부합하는 방식으로, 설정을 코드로서 관리할 수 있게 해준다.9

Table 1: osixia/openldap 핵심 환경 변수

환경 변수설명기본값권장 설정 예시
LDAP_DOMAINLDAP 디렉토리의 도메인. LDAP_BASE_DN의 기반이 된다.example.orgmydomain.com
LDAP_ORGANISATION조직의 이름.Example Inc.My Company
LDAP_BASE_DN디렉토리 트리의 최상위 노드(Base Distinguished Name). 비워두면 LDAP_DOMAIN으로부터 자동 생성된다 (예: dc=mydomain,dc=com).(비어 있음)dc=mydomain,dc=com
LDAP_ADMIN_PASSWORD관리자 계정(cn=admin,dc=...)의 비밀번호.admin강력한 비밀번호 (예: S3curE_P@ssw0rd!)
LDAP_CONFIG_PASSWORD구성 데이터베이스(cn=config)에 접근하기 위한 비밀번호.config강력한 비밀번호 (예: C0nf1g_S3cr3t!)
LDAP_TLSTLS 암호화를 활성화한다. 프로덕션 환경에서는 true가 강력히 권장된다.truetrue
LDAP_TLS_ENFORCEldapi를 제외한 모든 연결에 TLS를 강제한다.falsetrue
LDAP_LOG_LEVELSlapd 데몬의 로그 상세 수준을 설정한다. 디버깅 시 유용하다.256256 (기본) 또는 디버깅 시 -1
LDAP_READONLY_USER읽기 전용 사용자를 생성할지 여부.falsetrue (필요시)

이 변수들은 서버의 정체성(LDAP_DOMAIN), 보안(LDAP_ADMIN_PASSWORD, LDAP_TLS), 운영(LDAP_LOG_LEVEL)을 정의하는 핵심 요소다. 특히 LDAP_BASE_DN은 모든 LDAP 항목의 기반이 되는 중요한 값이므로 신중하게 결정해야 한다.9

3.2 데이터 영속성 확보 전략

Docker 컨테이너는 기본적으로 상태를 저장하지 않는(stateless) 비영속적 특성을 가진다. 컨테이너가 중지되거나 삭제되면 내부의 모든 데이터는 사라진다. 따라서 OpenLDAP 서버와 같이 상태를 저장해야 하는 서비스에서는 Docker 볼륨을 사용하여 데이터를 컨테이너 외부의 호스트 파일 시스템에 영속적으로 저장하는 것이 절대적으로 필수적이다.9

OpenLDAP은 두 종류의 핵심 데이터를 관리한다.

  1. 데이터베이스 (/var/lib/ldap): 사용자, 그룹, 비밀번호 등 실제 디렉토리 정보가 저장되는 공간이다.

  2. 동적 구성 (/etc/ldap/slapd.d): 스키마 정의, 접근 제어 목록(ACL), 복제 설정 등 서버의 동작 방식을 정의하는 구성 정보가 저장된다.

최신 OpenLDAP은 전통적인 단일 설정 파일(slapd.conf) 방식에서 벗어나, cn=config라는 특별한 디렉토리 내에 LDIF 형식의 항목들로 설정을 관리하는 동적 구성 방식을 채택했다.3 이 방식은 서버 재시작 없이 설정을 변경할 수 있고, 설정 자체를 LDAP 프로토콜을 통해 복제할 수 있는 강력한 장점을 제공한다. 이는 곧

설정 자체가 데이터가 되었음을 의미한다. 따라서 /etc/ldap/slapd.d 디렉토리를 볼륨으로 마운트하여 영속화하지 않는 것은, 데이터베이스만 백업하고 서버의 핵심 동작 방식(스키마, ACL 등)을 모두 유실하는 치명적인 실수로 이어질 수 있다. docker-compose.yml에서 이 두 경로를 모두 볼륨으로 마운트하는 것은 안정적인 운영을 위한 필수 조건이다.3

3.3 초기 디렉토리 구조 시딩(Seeding)

osixia/openldap 이미지는 컨테이너가 처음 시작될 때 특정 경로에 위치한 LDIF 파일을 자동으로 로드하여 디렉토리를 초기화하는 강력한 시딩(seeding) 기능을 제공한다.4 이를 통해 수동 작업 없이도 표준화된 디렉토리 구조를 모든 환경에 동일하게 배포할 수 있다.

LDIF(LDAP Data Interchange Format)는 디렉토리 항목을 텍스트 형식으로 표현하기 위한 표준이다. 각 항목은 다음과 같은 기본 구조를 가진다.11

  • dn: 항목의 고유한 식별 이름(Distinguished Name)을 정의한다.

  • objectClass: 항목의 유형을 정의하는 스키마 클래스를 지정한다 (예: organizationalUnit, inetOrgPerson).

  • changetype: 항목에 대한 작업을 명시한다. 초기 생성 시에는 add를 사용한다.

  • 속성: 값: 해당 objectClass에서 허용하는 속성과 그 값을 정의한다.

아래는 일반적인 조직 단위(OU)와 그룹을 생성하는 bootstrap.ldif 파일의 예시이다.4

LDIF

# Base structure
dn: ou=people,{{ LDAP_BASE_DN }}
objectClass: organizationalUnit
ou: people
description: All users in the organization

dn: ou=groups,{{ LDAP_BASE_DN }}
objectClass: organizationalUnit
ou: groups
description: All groups in the organization

# A sample group for administrators
dn: cn=admins,ou=groups,{{ LDAP_BASE_DN }}
objectClass: top
objectClass: groupOfNames
cn: admins
description: LDAP Administrators
member: cn=admin,{{ LDAP_BASE_DN }}

이 LDIF 파일은 docker-compose.ymlvolumes 설정을 통해 컨테이너 내부의 /container/service/slapd/assets/config/bootstrap/ldif/custom.ldif 경로에 마운트된다. 이때, docker-compose.ymlcommand 지시어에 --copy-service를 추가하는 것이 매우 중요하다. 이 옵션은 slapd 데몬이 시작되기 전에, 볼륨으로 마운트된 외부 파일들을 컨테이너 내부의 임시 작업 공간으로 복사하여 안전하게 처리하도록 보장한다. 이 옵션이 누락될 경우, 컨테이너는 마운트된 파일의 변경 사항을 인식하지 못하여 초기 데이터가 로드되지 않는 문제가 발생할 수 있다.4

bootstrap.ldif를 통한 시딩과 환경 변수를 통한 구성은 ‘선언적 구성(Declarative Configuration)’ 패러다임의 핵심이다. 이는 어떤 환경에서든 docker-compose up을 실행하면 항상 동일한 초기 상태의 LDAP 서버가 생성됨을 보장한다. 이러한 접근 방식은 최종 상태를 파일에 명시하고 실행 과정은 도구에 위임함으로써 멱등성(Idempotence), 즉 몇 번을 실행해도 결과가 동일함을 보장한다. 이 특성은 테스트 자동화, CI/CD 파이프라인 통합, 재해 복구 시나리오에서 예측 가능하고 신뢰할 수 있는 인프라를 구축하는 근본적인 기반이 된다. 예를 들어, 재해가 발생했을 때 새로운 인프라에 구성 파일들을 배포하고 docker-compose up만 실행하면 최소한의 기본 구조를 갖춘 서버가 즉시 복구되어 복구 시간 목표(RTO)를 크게 단축시킬 수 있다.

Table 2: docker-compose.yml 핵심 지시어 상세

지시어설명예시
image서비스를 생성하는 데 사용할 Docker 이미지.osixia/openldap:1.5.0
container_name컨테이너에 할당할 사용자 정의 이름.openldap-server
hostname컨테이너 내부의 호스트 이름을 설정. TLS 인증서 생성 등에 사용된다.ldap.example.org
environment컨테이너 내부에 설정할 환경 변수 목록.- LDAP_DOMAIN=example.org
volumes호스트 경로를 컨테이너 경로에 마운트하여 데이터를 영속화한다.-./data/openldap-data:/var/lib/ldap
ports호스트의 포트를 컨테이너의 포트로 외부에 노출시킨다.- "8080:80"
networks컨테이너를 연결할 네트워크를 지정한다.- ldap_network
depends_on다른 서비스가 시작된 후에 현재 서비스를 시작하도록 의존성을 설정한다.depends_on: [openldap]
command컨테이너 시작 시 기본 명령어를 덮어쓴다.command: --copy-service
restart컨테이너 종료 시 재시작 정책을 정의한다.restart: unless-stopped

4. 부: 배포, 검증 및 관리

4.1 컨테이너 실행 및 상태 확인

docker-compose.yml 파일 작성이 완료되면, 터미널에서 해당 파일이 위치한 디렉토리로 이동하여 다음 명령어를 실행한다. 이 명령어는 YAML 파일에 정의된 모든 서비스를 백그라운드에서 생성하고 시작한다.2

Bash

docker-compose up -d

서비스가 정상적으로 시작되었는지 확인하기 위해 docker compose ps 명령어를 사용한다. 이 명령어는 현재 Compose 프로젝트에 의해 관리되는 컨테이너들의 목록과 상태를 보여준다.17

Bash

docker compose ps

출력 결과에서 각 서비스의 STATUSUp 또는 running으로 표시되고, PORTS 항목에 docker-compose.yml에서 설정한 포트 매핑이 올바르게 나타나는지 확인해야 한다. 만약 컨테이너가 시작되지 않거나 계속 재시작된다면, docker logs 명령어를 통해 특정 컨테이너의 로그를 확인하여 원인을 파악할 수 있다. 예를 들어, OpenLDAP 컨테이너의 로그를 확인하여 slapd 데몬이 성공적으로 시작되었는지 점검할 수 있다.19

Bash

docker logs openldap-server

4.2 CLI를 통한 서버 검증

서버가 실행 중임을 확인한 후, LDAP 기능이 정상적으로 동작하는지 검증하는 것이 중요하다. ldapsearch 유틸리티는 이를 위한 가장 기본적인 CLI 도구이다. 먼저 docker exec 명령어를 사용하여 실행 중인 OpenLDAP 컨테이너 내부의 셸 환경으로 진입한다.2

Bash

docker exec -it openldap-server bash

컨테이너 내부에 접속한 후, ldapsearch를 사용하여 서버에 질의를 보낸다. 다음 명령어는 관리자(cn=admin)로 바인딩하여 디렉토리의 기본 DN(dc=example,dc=org) 아래의 모든 항목을 조회한다. 이 명령이 성공적으로 실행되고 bootstrap.ldif에서 정의한 항목들이 출력된다면, 서버가 정상적으로 초기화되었음을 의미한다.2

Bash

ldapsearch -x -H ldap://localhost -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w adminpassword

Table 3: ldapsearch 주요 옵션 및 사용 예시

옵션설명사용 예시
-xSASL 대신 단순 인증(Simple Authentication)을 사용한다.ldapsearch -x...
-H연결할 LDAP 서버의 URI를 지정한다.ldapsearch -H ldap://ldap.example.org:389...
-b검색을 시작할 기준 DN(Base DN)을 지정한다.ldapsearch -b "ou=people,dc=example,dc=org"...
-D서버에 바인딩(인증)할 사용자의 DN(Bind DN)을 지정한다.ldapsearch -D "cn=admin,dc=example,dc=org"...
-w바인드 DN에 대한 비밀번호를 지정한다.ldapsearch -w adminpassword...
-W비밀번호를 프롬프트에서 입력받는다 (보안상 권장).ldapsearch -W...
-ZZStartTLS를 사용하여 연결을 암호화하도록 강제한다.ldapsearch -ZZ...

4.3 phpLDAPadmin을 이용한 웹 기반 관리

phpLDAPadmin은 LDAP 디렉토리를 시각적으로 탐색하고 관리할 수 있는 편리한 웹 인터페이스를 제공한다. docker-compose.yml에서 phpldapadmin 서비스의 ports에 설정한 포트(예: 8080)를 사용하여 웹 브라우저에서 http://localhost:8080 주소로 접속한다.4

로그인 화면에서는 다음 정보를 입력해야 한다.

  • Login DN: cn=admin,dc=example,dc=org와 같이 docker-compose.ymlLDAP_DOMAIN 환경 변수를 기반으로 생성된 관리자 DN을 입력한다.21

  • Password: LDAP_ADMIN_PASSWORD 환경 변수에 설정한 비밀번호를 입력한다.4

로그인에 성공하면 왼쪽 패널에 디렉토리 정보 트리(DIT)가 계층 구조로 표시된다. 여기서 각 항목을 클릭하여 상세 정보를 확인하거나, 새로운 항목을 생성하고 기존 항목을 수정 또는 삭제할 수 있다. 예를 들어, ou=people 항목을 선택한 후 ’Create a child entry’를 클릭하고 ‘Generic: User Account’ 템플릿을 사용하여 새로운 사용자를 손쉽게 추가할 수 있다. 마찬가지로, 그룹을 생성하고 기존 사용자를 그룹의 멤버로 추가하는 등의 일상적인 관리 작업을 직관적인 UI를 통해 수행할 수 있다.21

CLI 도구와 GUI 도구는 각각의 강점을 가지고 있어 상호 보완적으로 활용해야 한다. ldapsearch, ldapadd와 같은 CLI 도구는 반복적인 대량 작업이나 자동화된 스크립트에 최적화되어 있다. 예를 들어, 수백 명의 사용자를 한 번에 등록하거나 CI/CD 파이프라인에서 LDAP 상태를 검증하는 작업은 CLI를 통해 이루어져야 한다. 반면, phpLDAPadmin과 같은 GUI 도구는 디렉토리 구조를 직관적으로 파악하거나, 비정기적으로 발생하는 소량의 수동 데이터 수정, 또는 LDAP에 익숙하지 않은 관리자를 위한 교육 목적으로 매우 유용하다. 따라서 DevOps 환경에서는 CLI 기반의 자동화된 관리를 기본으로 하되, 예외적인 상황이나 시각적 확인이 필요할 때 GUI를 보조적으로 활용하는 것이 가장 효율적인 운영 전략이다.

5. 부: 고급 구성 및 운영

5.1 TLS/LDAPS를 통한 통신 암호화

프로덕션 환경에서 LDAP 트래픽을 평문으로 전송하는 것은 심각한 보안 위협이다. 사용자 계정 정보와 비밀번호가 네트워크 상에서 탈취될 수 있으므로, TLS(Transport Layer Security)를 통해 모든 통신을 암호화하는 것은 필수적이다.3

osixia/openldap 이미지는 TLS 설정을 간편하게 할 수 있는 다양한 방법을 제공한다.

5.1.1 방법 1: 자동 생성 인증서 사용 (개발/테스트용)

osixia/openldap 이미지는 기본적으로 LDAP_TLS=true로 설정되어 있어, 별도의 설정이 없으면 컨테이너 시작 시 자체 서명된 TLS 인증서를 자동으로 생성한다.9 이 인증서는 컨테이너의

hostname을 CN(Common Name)으로 사용한다. 이 방식은 개발 및 테스트 환경에서 빠르게 암호화된 연결을 설정하고 테스트하는 데 매우 편리하다.

5.1.2 방법 2: 사용자 정의 인증서 적용 (프로덕션용)

프로덕션 환경에서는 신뢰할 수 있는 인증 기관(CA)에서 발급받았거나, 조직 내부의 자체 CA로 서명한 인증서를 사용해야 한다.

  1. 인증서 준비: 서버 인증서(ldap.crt), 개인 키(ldap.key), 그리고 CA 인증서(ca.crt)를 준비하여 앞서 생성한 프로젝트의 certs/ 디렉토리에 위치시킨다.

  2. 볼륨 마운트: docker-compose.yml 파일의 openldap 서비스에 volumes 설정을 추가하여, 호스트의 certs/ 디렉토리를 컨테이너 내부의 인증서 경로인 /container/service/slapd/assets/certs에 마운트한다.8

YAML

services:
openldap:
#... other settings
volumes:
#... other volumes
-./certs:/container/service/slapd/assets/certs
  1. 환경 변수 설정 (선택 사항): 만약 인증서 파일 이름이 기본값(ldap.crt, ldap.key, ca.crt)과 다르다면, LDAP_TLS_CRT_FILENAME, LDAP_TLS_KEY_FILENAME, LDAP_TLS_CA_CRT_FILENAME 환경 변수를 사용하여 파일 이름을 명시적으로 지정할 수 있다.9

설정이 완료되면, LDAP 서버는 포트 389에서 StartTLS를, 포트 636에서 LDAPS(SSL) 연결을 수신 대기한다. ldapsearch 명령어에 -ZZ 옵션을 추가하면 StartTLS를 사용하여 암호화된 연결을 테스트할 수 있다.27 클라이언트 측에서는 서버의 CA 인증서를 신뢰하도록

ldap.conf 파일에 TLS_CACERT 경로를 설정하는 과정이 필요할 수 있다.27

5.2 백업 및 복원 전략

데이터 유실은 모든 시스템에서 발생할 수 있는 치명적인 문제이므로, 정기적인 백업은 안정적인 OpenLDAP 운영의 핵심이다.30 Docker 환경에서는 두 가지 주요 백업 전략을 고려할 수 있다.

5.2.1 전략 1: 논리적 백업 (LDIF 덤프)

이 방법은 slapcat 유틸리티를 사용하여 데이터베이스의 내용을 표준 텍스트 형식인 LDIF 파일로 내보내는 방식이다.

  • 백업: docker exec를 통해 실행 중인 컨테이너에서 slapcat 명령을 실행한다. 구성 데이터베이스(-n 0)와 주 데이터베이스(-n 1)는 별도로 백업해야 한다.31

Bash

# 구성 백업
docker exec openldap-server slapcat -n 0 -l /var/lib/ldap/config_backup.ldif
# 데이터 백업
docker exec openldap-server slapcat -n 1 -l /var/lib/ldap/data_backup.ldif

생성된 LDIF 파일은 볼륨 마운트된 호스트 경로(data/openldap-data)에서 접근할 수 있다.

  • 복원: 복원은 slapadd 유틸리티를 사용한다. 먼저 docker-compose stop openldap로 서버를 중지하고, 기존 데이터베이스 파일을 삭제한 후 slapadd로 LDIF 파일을 임포트한다.32

Bash

# 서버 중지 및 데이터 삭제
docker-compose stop openldap-server
sudo rm -rf./data/openldap-data/*./data/openldap-config/*
# 데이터 복원
docker exec openldap-server slapadd -n 1 -l /var/lib/ldap/data_backup.ldif
# 구성 복원
docker exec openldap-server slapadd -n 0 -l /var/lib/ldap/config_backup.ldif
# 서버 시작
docker-compose start openldap-server

5.2.2 전략 2: 물리적 백업 (볼륨 백업)

이 방법은 docker-compose.yml에서 볼륨으로 마운트한 호스트 디렉토리 자체를 직접 아카이빙하는 방식이다.

  • 백업: 데이터 일관성을 보장하기 위해 먼저 OpenLDAP 컨테이너를 중지한다. 그 후 tar와 같은 도구를 사용하여 데이터와 구성 디렉토리를 압축 파일로 만든다.35

Bash

docker-compose stop openldap-server
tar -czvf ldap_backup_$(date +%F).tar.gz./data
docker-compose start openldap-server
  • 복원: 복원은 매우 간단하다. 컨테이너를 중지하고, 기존 data 디렉토리를 삭제한 후, 백업 아카이브 파일의 압축을 해제하고 컨테이너를 다시 시작하면 된다.35

두 전략은 서로 다른 목적을 가진다. 물리적 백업은 동일한 환경으로 신속하게 복구하는 ’빠른 원상 복구’에 최적화되어 있다. 반면, 논리적 백업은 데이터를 표준 형식으로 추출하므로 OpenLDAP 버전이 다르거나 다른 종류의 LDAP 서버로 데이터를 이전해야 하는 ’데이터 이식성 및 유연성’이 요구되는 시나리오에 더 적합하다. 가장 견고한 재해 복구 계획은 두 가지 방식을 병행하는 것이다. 예를 들어, 일일 백업은 빠른 복구를 위해 물리적 볼륨 백업으로 수행하고, 주간 또는 월간 백업은 장기 보관 및 마이그레이션 유연성을 위해 논리적 LDIF 덤프로 수행하는 하이브리드 전략을 채택할 수 있다. 추가적으로, osixia/openldap-backup과 같은 전용 이미지를 활용하면 이러한 백업 과정을 자동화하고 스케줄링할 수 있다.37

6. 결론: 프로덕션 환경을 위한 최종 권장 사항

본 가이드에서 설명한 Docker Compose를 활용한 OpenLDAP 배포 방식은 선언적 구성, 데이터 영속성, 초기 데이터 시딩, TLS 암호화, 정기적 백업이라는 핵심 요소를 통해 안정적이고 확장 가능한 ID 관리 시스템을 구축하는 현대적인 접근법을 제시한다. 프로덕션 환경에서 이를 성공적으로 운영하기 위해서는 다음의 추가적인 권장 사항을 고려해야 한다.

첫째, 보안을 최우선으로 강화해야 한다. docker-compose.yml 파일에 관리자 비밀번호를 평문으로 저장하는 대신, .env 파일을 사용하거나 Docker Secrets와 같은 보다 안전한 메커니즘을 활용하여 민감한 정보를 외부로 분리해야 한다.9 또한, OpenLDAP이 제공하는 강력한 접근 제어 목록(ACL) 기능을 활용하여 역할에 따라 사용자의 데이터 접근 권한을 최소한으로 제한하고 2, 강력한 암호 정책(Password Policy) 오버레이를 적용하여 사용자 비밀번호의 복잡도, 유효 기간, 실패 시 계정 잠금 등을 강제하는 것이 바람직하다.

둘째, 안정적인 운영을 위한 모니터링 체계를 구축해야 한다. LDAP_LOG_LEVEL 환경 변수를 적절히 설정하고, 컨테이너에서 발생하는 로그를 Fluentd나 Logstash와 같은 로그 수집기를 통해 중앙화된 로깅 시스템(예: Elasticsearch)으로 전송하여 실시간으로 서버 상태를 모니터링하고 이상 징후를 신속하게 감지할 수 있어야 한다.7

마지막으로, 고가용성 및 재해 복구 계획을 수립하고 검증해야 한다. 단일 장애 지점(SPOF)을 제거해야 하는 고가용성 환경에서는 osixia/openldap 이미지가 지원하는 다중 마스터 복제(Multi-Master Replication) 기능을 도입하는 것을 적극적으로 검토해야 한다.9 무엇보다 중요한 것은, 수립된 백업 및 복원 절차를 정기적으로 테스트하여 실제 재해 상황에서 계획이 예상대로 신속하고 정확하게 작동하는지 검증하는 것이다. 잘 문서화되고 검증된 복구 절차만이 실제 위기 상황에서 서비스의 연속성을 보장할 수 있다.

7. 참고 자료

  1. How To Run OpenLDAP Server in Docker Containers | ComputingForGeeks, https://computingforgeeks.com/run-openldap-server-in-docker-containers/
  2. Setting Up OpenLDAP Server with Docker. | by Amrutha Chennepalli | Medium, https://medium.com/@amrutha_20595/setting-up-openldap-server-with-docker-d38781c259b2
  3. Docker-compose an OpenLDAP server - The Rambling Homelabist - David Kowis, https://david.kow.is/2020/10/31/docker-compose-an-openldap-server/
  4. Setting up OpenLDAP and phpLDAPadmin with docker-compose | by devripper - Medium, https://medium.com/@devripper133127/setting-up-openldap-and-phpldapadmin-with-docker-compose-cf2336590989
  5. osixia/docker-openldap configuration to let users other than admin search the database, https://www.reddit.com/r/openldap/comments/vub8df/osixiadockeropenldap_configuration_to_let_users/
  6. Setting Up Custom Attributes in OpenLDAP Using Docker | by Saurabh Batham | Medium, https://medium.com/@saurabhbatham17/setting-up-custom-attributes-in-openldap-using-docker-2c7fdf35e988
  7. Docker OpenLDAP + phpldapadmin example - GitHub Gist, https://gist.github.com/thomasdarimont/d22a616a74b45964106461efb948df9c
  8. Docker Compose | Authelia - IBRACORP, https://docs.ibracorp.io/authelia/openldap/installation/docker-compose
  9. osixia/docker-openldap: OpenLDAP container image - GitHub, https://github.com/osixia/docker-openldap
  10. External Library / Docker Openldap - iGem Gitlab, https://gitlab.igem.org/external-library/docker-openldap/-/tree/v1.2.0
  11. A LDIF File Format, https://docs.oracle.com/cd/E10773_01/doc/oim.1014/e10531/ldif_appendix.htm
  12. LDIF(5) - OpenLDAP, https://www.openldap.org/software//man.cgi?query=LDIF&sektion=5
  13. OpenLDAP 2.2 Administrator’s Guide: Database Creation and Maintenance Tools, https://www.openldap.org/doc/admin22/dbtools.html
  14. Mapping users/groups from an OpenLDAP or Generic LDAP server - GFI Support, https://manuals.gfi.com/en/kerio/connect/content/server-configuration/ldap-and-directory-services/mapping-users-groups-from-an-openldap-or-generic-ldap-server-294.html
  15. Sample LDAP Data Interchange Format (LDIF) file to onboard users and groups to openldap. - GitHub Gist, https://gist.github.com/Wathsara/738b86c66eaba8ed9333b5a27beaa23c
  16. Configure OpenLDAP - Garage Num Doc - GitLab, https://garagenum.gitlab.io/doc/divers/devops/sso/sso-ldap/
  17. oncase/sample-ldap: Docker Compose that spins up an OpenLDAP server with sample data, https://github.com/oncase/sample-ldap
  18. docker compose ps - Docker Docs, https://docs.docker.com/reference/cli/docker/compose/ps/
  19. OpenLDAP Integration - Open WebUI, https://docs.openwebui.com/features/openldap/
  20. Run OpenLDAP with a UI on Docker - Ruan Bekker’s Blog, https://ruan.dev/blog/2022/03/20/run-openldap-with-a-ui-on-docker
  21. Set Up LDAP Using OpenLDAP Container - Litmus Technical Documentation, https://docs.litmus.io/litmusedge/set-up-ldap-using-openldap-container
  22. login DN and password for osixia/phpLDAPAdmin docker image - Stack Overflow, https://stackoverflow.com/questions/49727169/login-dn-and-password-for-osixia-phpldapadmin-docker-image
  23. Setup and Configure OpenLDAP using Docker Image on Ubuntu 16.04 - Scytalelabs, https://scytalelabs.com/2023/01/10/setup-and-configure-openldap-using-docker-image-on-ubuntu-16-04/
  24. Set up and configure LDAP with Deploy - digital.ai Documentation, https://docs.digital.ai/deploy/docs/how-to/setup-and-configuration-ldap-with-deploy
  25. OpenLDAP TLS vs SSL - Super User, https://superuser.com/questions/1266934/openldap-tls-vs-ssl
  26. osixia/openldap - Git repositories on apache, https://apache.googlesource.com/airflow-openldap/+/b52560b82d93f3383a0256455ff33f16486d339d/README.md
  27. How to enable TLS on OpenLDAP - ssl - Server Fault, https://serverfault.com/questions/539226/how-to-enable-tls-on-openldap
  28. Docker OpenLDAP Server for testing LDAP applications - GitHub, https://github.com/rroemhild/docker-test-openldap
  29. docker - Connecting via TLS to OPENLDAP: Certificate not found - Stack Overflow, https://stackoverflow.com/questions/65576605/connecting-via-tls-to-openldap-certificate-not-found
  30. OpenLDAP: Effective Backup Strategies and Data Restoration Techniques - Medium, https://medium.com/niveus-solutions/openldap-effective-backup-strategies-and-data-restoration-techniques-ea79ecdd6d77
  31. Backup and restore OpenLDAP - Ubuntu Server documentation, https://documentation.ubuntu.com/server/how-to/openldap/backup-and-restore/
  32. How To Backup and Restore OpenLDAP - Tyler’s Guides, https://tylersguides.com/articles/backup-restore-openldap/
  33. Importing config and data from previous OpenLDAP installation · Issue #106 - GitHub, https://github.com/osixia/docker-openldap/issues/106
  34. Backup and Restore OpenLDAP - Deep Dive in OpenLdap - WordPress.com, https://openldapdive.wordpress.com/backup-and-restore-openldap/
  35. Back Up and Share Docker Volumes with This Extension, https://www.docker.com/blog/back-up-and-share-docker-volumes-with-this-extension/
  36. Easy Automated Docker Volume Backups That Are Database Friendly, https://www.thepolyglotdeveloper.com/2025/05/easy-automated-docker-volume-backups-database-friendly/
  37. osixia/docker-openldap-backup - GitHub, https://github.com/osixia/docker-openldap-backup
  38. nursecurtis/docker-openldap - Docker Image - Docker Hub, https://hub.docker.com/r/nursecurtis/docker-openldap
  39. openLDAP Multi master replication in docker - General, https://forums.docker.com/t/openldap-multi-master-replication-in-docker/135730