OpenLDAP 개요

  • LDAP (Lightweight Directory Access Protocol): X.500 디렉터리 접근 프로토콜을 경량화한 TCP/IP 기반 프로토콜.
  • OpenLDAP: LDAP v3 표준을 구현한 오픈소스 디렉터리 서비스.
  • 주요 용도: 사용자 인증, 그룹 관리, 네트워크 리소스 접근 통제, 메일 서버 주소록, 중앙 집중형 계정 관리 등.

동작 원리

  • 디렉터리 정보 트리(DIT): 계층 구조로 구성된 객체 데이터 저장소.
    • 예: dc=example,dc=com 아래에 ou=People, ou=Group 등이 위치.
  • 항목(Entry): 고유 DN(Distinguished Name)을 가지며, 여러 속성(Attribute)으로 구성됨.
  • 클라이언트 요청 흐름:
    1. 클라이언트가 LDAP 서버에 바인드(Bind) 요청 (인증)
    2. 서버가 인증 후 접근 권한을 판단
    3. 클라이언트가 검색(Search), 수정(Modify), 추가(Add) 등의 작업 수행

LDAP은 왜 사용해야 하는가?

  • 중앙 집중식 계정 관리: 수백~수천 대의 서버 및 서비스에 동일한 계정/권한 적용
  • 확장성: 계층적 구조로 수많은 객체를 관리 가능
  • 이식성: 다양한 OS/애플리케이션과 연동 가능 (Linux PAM, Samba, Postfix 등)
  • 보안: TLS/SSL 지원, 접근 제어 목록 (ACL) 구성 가능

장점

  • 오픈소스 (비용 없음)
  • 다수의 서비스와 연동 용이 (SSSD, PAM, nsswitch 등)
  • 확장성이 뛰어남 (Replication, Overlay 등)
  • 표준 프로토콜 기반으로 이식성과 호환성 우수

구축 환경 예시

  • OS: CentOS 7 / Rocky Linux 8 / Ubuntu 20.04
  • 서버 IP: 192.168.0.10
  • 도메인: example.com
  • Base DN: dc=example,dc=com
  • 관리자 DN: cn=admin,dc=example,dc=com
  • 인증: TLS 기반 인증 + 내부 사용자 인증

OpenLDAP 서버 및 클라이언트 구축 방법 (CentOS 7 기준)

구축 전 고려 사항

  • 방화벽 포트 389, 636 개방 필요
  • 호스트 이름은 FQDN 기준으로 명확히 설정되어 있어야 함
  • 서버 시간 동기화 (ntp 또는 chronyd) 설정 필수
  • SELinux 설정과 AppArmor 상태 확인 필요
# OpenLDAP 서버 및 클라이언트 도구 설치
# LDAP 서버의 핵심 서비스 및 테스트용 클라이언트 도구 설치
sudo yum install -y openldap-servers openldap-clients

# LDAP 데이터베이스 초기화 파일 설정
# DB 설정 파일 복사 및 소유자 변경: slapd 데몬이 읽을 수 있어야 함
sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
sudo chown -R ldap:ldap /var/lib/ldap

# slapd 서비스 활성화 및 즉시 시작
# 부팅 시 자동 실행되도록 설정
sudo systemctl enable slapd
sudo systemctl start slapd

# 관리자 패스워드 생성 도구 실행
# SSHA 형식의 암호 해시를 생성 (LDAP 설정에 사용)
slappasswd

# 관리자 DN에 해당 암호 적용하기 위한 설정 준비
# 설정.ldif 파일 예시는 아래와 같이 구성되어야 함:
# dn: olcDatabase={2}hdb,cn=config
# changetype: modify
# replace: olcRootPW
# olcRootPW: {SSHA}xxx

# LDAP 서버에 로컬 UNIX 도메인 소켓을 통해 접근하여 설정 적용
ldapadd -Y EXTERNAL -H ldapi:/// -f 설정.ldif

클라이언트 설정 방법 (CentOS 7 기준)

LDAP 서버에 사용자 인증을 위임하려면 클라이언트에서 다음 설정이 필요합니다:

# 클라이언트에서 필요한 패키지 설치
sudo yum install -y sssd sssd-ldap oddjob-mkhomedir openldap-clients authconfig
# /etc/sssd/sssd.conf 파일 생성 및 권한 설정
sudo vi /etc/sssd/sssd.conf
[domain/default]
id_provider = ldap
ldap_uri = ldap://192.168.0.10
ldap_search_base = dc=example,dc=com
ldap_tls_reqcert = allow

[sssd]
services = nss, pam
domains = default

[pam]
pam_mkhomedir = True
sudo chmod 600 /etc/sssd/sssd.conf
# 클라이언트의 NSS 및 PAM 시스템에 LDAP 반영
sudo authconfig --enablesssd --enablesssdauth --enablemkhomedir --update
# SSSD 서비스 활성화 및 시작
sudo systemctl enable sssd
sudo systemctl restart sssd
# nsswitch.conf에 sss 반영 확인
cat /etc/nsswitch.conf | grep passwd
# 결과 예시: passwd:     files sss

이 과정을 통해 클라이언트는 LDAP 서버에서 사용자 정보를 검색하고 인증할 수 있게 됩니다.
SSH 접속 시 LDAP 계정으로 로그인이 가능해지며, 홈 디렉토리도 자동으로 생성됩니다.

단, 모든 서버에 홈디렉토리를 개별적으로 생성하는 방식 대신, 공통 NFS 서버에서 /home을 마운트해 공유하는 방식도 자주 사용됩니다. 이 경우:

  1. 중앙 NFS 서버에 홈디렉토리 생성
mkdir -p /nfs/home/alpha
chown 10000:10000 /nfs/home/alpha  # uid/gid는 LDAP 값과 일치해야 함
  1. 클라이언트 측에서는 /home을 NFS로 마운트:
echo 'nfs.example.com:/nfs/home /home nfs defaults 0 0' >> /etc/fstab
mount -a
  1. pam_mkhomedir는 사용하지 않으며, 대신 홈디렉토리는 NFS로 공유되므로 모든 LDAP 사용자가 동일한 경로 /home/alpha를 각 서버에서 사용할 수 있게 됩니다.

🔸 이 방식은 특히 다수의 서버에서 동일 계정으로 접속할 때 사용자 데이터와 환경이 일관되게 유지되는 장점이 있습니다.

# 설치
sudo yum install -y openldap-servers openldap-clients

# 데이터베이스 초기화
sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
sudo chown -R ldap:ldap /var/lib/ldap

# 서비스 시작 및 활성화
sudo systemctl enable slapd
sudo systemctl start slapd

# 관리자 비밀번호 설정 (SSHA 해시 생성)
slapd-password

# LDAP 설정 변경 (olc 방식)
ldapadd -Y EXTERNAL -H ldapi:/// -f 설정.ldif

NIS처럼 쉽게 사용하는 방법

  • nsswitch.conf + PAM + SSSD 조합을 사용:
sudo yum install -y sssd sssd-ldap oddjob-mkhomedir
  • /etc/sssd/sssd.conf: SSSD는 LDAP 등 외부 인증 소스를 통해 계정 정보를 로컬처럼 인식하게 해줌. 필수 설정 파일.
[domain/default]
id_provider = ldap
ldap_uri = ldap://192.168.0.10
ldap_search_base = dc=example,dc=com
ldap_tls_reqcert = allow

[sssd]
services = nss, pam
domains = default

[pam]
pam_mkhomedir = True
  • 주요 옵션 설명:
    • id_provider = ldap: LDAP을 계정 정보 소스로 사용함
    • ldap_uri: LDAP 서버 주소
    • ldap_search_base: 계정 탐색 기준 DN
    • pam_mkhomedir: 로그인 시 홈디렉토리 자동 생성
  • /etc/nsswitch.conf: 시스템이 계정 정보를 어디서 가져올지 정의하는 파일. LDAP 사용 시 sss 항목 추가.
passwd:     files sss
group:      files sss
shadow:     files sss
  • 홈디렉토리 자동 생성:
sudo authconfig --enablemkhomedir --update

설정에서 필수적으로 알아야 하는 요소

  • olcDatabase: DB 설정 (파일 기반 DB, access rule 등)
  • olcAccess: 접근 제어 규칙
  • olcRootDN / olcRootPW: 관리자 DN 및 암호
  • TLS 설정: olcTLSCertificateFile, olcTLSCertificateKeyFile
  • LDIF 파일 구조: 설정은 모두 LDIF 기반으로 적용

주요 옵션 설명

옵션 설명
olcRootDN LDAP 관리자 DN 지정
olcRootPW 관리자 비밀번호 해시
olcSuffix LDAP 데이터의 Base DN
olcAccess 접근 제어 규칙 (ACL) 지정
olcTLS* TLS 인증서 경로 지정
olcDbDirectory DB 파일 저장 경로
olcLogLevel 로깅 수준 설정

계정 및 그룹 생성 예시

수동 LDIF 파일 방식

OpenLDAP에서는 사용자 및 그룹 객체를 LDIF 형식의 파일로 생성할 수 있습니다. 아래는 예시입니다.

# add_user.ldif
 dn: uid=alpha,ou=People,dc=example,dc=com
 objectClass: inetOrgPerson
 objectClass: posixAccount
 objectClass: shadowAccount
 cn: Alpha User
 sn: Alpha
 uid: alpha
 uidNumber: 10000
 gidNumber: 10000
 homeDirectory: /home/alpha
 loginShell: /bin/bash
 userPassword: {SSHA}암호해시
# add_group.ldif
 dn: cn=developers,ou=Group,dc=example,dc=com
 objectClass: posixGroup
 cn: developers
 gidNumber: 10000
 memberUid: alpha
# LDIF 파일을 사용해 사용자 및 그룹 등록
ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f add_user.ldif
ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f add_group.ldif

스크립트를 이용한 자동화 예시

다수의 계정/그룹을 자동으로 생성할 경우 bash 스크립트를 이용할 수 있습니다.

#!/bin/bash
BASE_DN="dc=example,dc=com"
ADMIN_DN="cn=admin,$BASE_DN"
PASSWD_FILE="passwd.ldif"

for i in {1..10}; do
  USERNAME="user$i"
  UID_NUM=$((10000 + i))
  cat <<EOF > tmp_user.ldif
dn: uid=$USERNAME,ou=People,$BASE_DN
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: $USERNAME
sn: $USERNAME
uid: $USERNAME
uidNumber: $UID_NUM
gidNumber: 10000
homeDirectory: /home/$USERNAME
loginShell: /bin/bash
userPassword: $(slappasswd -s password)
EOF
  ldapadd -x -D "$ADMIN_DN" -W -f tmp_user.ldif
done

위 스크립트는 사용자 user1~user10까지 자동 생성하며, 각자 고유 UID를 부여합니다. slappasswd는 동적으로 SSHA 해시를 생성합니다.


TLS/SSL 활성화 방법

OpenLDAP은 기본적으로 비암호화된 389 포트를 사용합니다. 안전한 인증을 위해 TLS/SSL 설정을 수동으로 적용해야 합니다.

인증서 준비

# 예시 경로
/etc/openldap/certs/server.crt
/etc/openldap/certs/server.key
/etc/openldap/certs/ca.crt

LDIF 파일로 설정 적용

# tls-config.ldif
 dn: cn=config
 changetype: modify
 replace: olcTLSCertificateFile
 olcTLSCertificateFile: /etc/openldap/certs/server.crt
 -
 replace: olcTLSCertificateKeyFile
 olcTLSCertificateKeyFile: /etc/openldap/certs/server.key
 -
 replace: olcTLSCACertificateFile
 olcTLSCACertificateFile: /etc/openldap/certs/ca.crt

적용 명령어

ldapmodify -Y EXTERNAL -H ldapi:/// -f tls-config.ldif

클라이언트 접속 테스트

# StartTLS 방식 (권장)
ldapsearch -H ldap://localhost -ZZ -x -D "cn=admin,dc=example,dc=com" -W -b "dc=example,dc=com"

# LDAPS 방식 (포트 636)
ldapsearch -H ldaps://localhost -x -D "cn=admin,dc=example,dc=com" -W -b "dc=example,dc=com"

보안 관련 권장 사항

  • TLS/SSL 통신 강제 (StartTLS)
  • 비밀번호 해시는 SSHA 이상 사용
  • 익명 접근 차단
  • 관리자 계정 별도 생성 및 최소 권한 부여

마무리 팁

  • 설정 시 오타 및 공백, 줄바꿈 오류 주의: LDIF 형식은 민감함
  • slapd.d 디렉토리는 slapd 데몬의 런타임 구성 디렉토리로 직접 수정 금지, 반드시 ldapmodify 등 사용
  • cn=config 구조에서는 설정 반영이 즉시 적용됨. 변경 전 백업 권장
  • 방화벽, SELinux, DNS, 인증서 권한 문제는 LDAP 접속 장애의 주요 원인
  • 설정은 대부분 LDIF 형식으로 적용하며, slapd.d 디렉토리에서 관리됩니다.
  • 구성 변경은 ldapmodify 또는 ldapadd 명령으로 수행.
  • GUI 도구: phpldapadmin, LDAP Account Manager (LAM) 등 활용 가능
  • 대규모 환경에서는 syncrepl을 통한 복제 구성, memberof, refint, auditlog 등 overlay 기능도 고려하세요.
  • 설정은 대부분 LDIF 형식으로 적용하며, slapd.d 디렉토리에서 관리됩니다.
  • 구성 변경은 ldapmodify 또는 ldapadd 명령으로 수행.
  • GUI 도구: phpldapadmin, LDAP Account Manager (LAM) 등 활용 가능
  • 대규모 환경에서는 syncrepl을 통한 복제 구성, memberof, refint, auditlog 등 overlay 기능도 고려하세요.