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)으로 구성됨.
- 클라이언트 요청 흐름:
- 클라이언트가 LDAP 서버에 바인드(Bind) 요청 (인증)
- 서버가 인증 후 접근 권한을 판단
- 클라이언트가 검색(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
을 마운트해 공유하는 방식도 자주 사용됩니다. 이 경우:
- 중앙 NFS 서버에 홈디렉토리 생성
mkdir -p /nfs/home/alpha
chown 10000:10000 /nfs/home/alpha # uid/gid는 LDAP 값과 일치해야 함
- 클라이언트 측에서는
/home
을 NFS로 마운트:
echo 'nfs.example.com:/nfs/home /home nfs defaults 0 0' >> /etc/fstab
mount -a
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
: 계정 탐색 기준 DNpam_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 기능도 고려하세요.