이 문서에서는 CentOS 7 운영체제에 OpenLDAP 서비스를 설치하고, 기본 디렉터리 구조를 설정한 뒤, phpLdapAdmin을 통해 웹 기반 관리 인터페이스를 제공하는 과정을 설명합니다. 보안 강화를 위해 단순 텍스트 비밀번호 대신 해시된 비밀번호 사용을 권장하나, 본 예제는 학습 편의를 위해 평문 설정을 포함하며 실제 운영 시에는 반드시 암호화 처리를 적용해야 합니다.
1. 패키지 설치 및 초기 준비
먼저 YUM 패키지 매니저를 사용하여 OpenLDAP 서버와 클라이언트 유틸리티를 설치합니다.
# OpenLDAP 관련 패키지 일괄 설치
sudo yum install -y openldap openldap-clients openldap-servers
# 스크립트 및 유틸리티 의존성 설치 (추후 사용자/그룹 관리용)
sudo yum install -y sharutils httpd php phpldapadmin
2. slapd 구성 파일 수정
OpenLDAP의 동적 구성은 /etc/openldap/slapd.d目录下의 LDIF 형식 파일을 통해 이루어집니다. 직접 편집하는 것보다 slapcat 및 slapadd를 사용하거나, 파일 내용을 직접 수정한 후 권한과 소유자를 확인하는 방식이 일반적입니다. 아래는 주요 구성 요소를 변경하는 예시입니다.
2.1 Monitor 데이터베이스 접근 제어 설정
모니터링 데이터베이스에 대한 접근 권한을 정의합니다. 관리자 DN을 지정하여 읽기 권한을 부여합니다.
# /etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif 내용 중 일부
dn: olcDatabase={1}monitor
objectClass: olcDatabaseConfig
olcDatabase: {1}monitor
# 아래 줄에서 'cn=admin,dc=example,dc=com' 부분을 실제 도메인 정보로 교체
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by dn.base="cn=admin,dc=corp,dc=local" read
by * none
2.2 HDB 백엔드 및 루트 계정 설정
주요 데이터베이스(HDB)의 접미사(Suffix), 루트 DN, 그리고 루트 비밀번호를 설정합니다. 또한 인덱싱 옵션을 추가하여 검색 성능을 최적화합니다.
# /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif 내용 중 일부
dn: olcDatabase={2}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
# 도메인 접미사 설정 (예: dc=corp,dc=local)
olcSuffix: dc=corp,dc=local
# 관리자 DN 설정
olcRootDN: cn=admin,dc=corp,dc=local
# 관리자 비밀번호 (실제 운영 시 slappasswd로 생성된 해시값 사용 권장)
olcRootPW: SecretPassword123!
# 인덱스 설정
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
2.3 DB_CONFIG 파일 복사 및 권한 설정
Berkeley DB 엔진이 정상 동작하도록 샘플 설정 파일을 복사하고 소유권을 변경합니다.
sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
sudo chown -R ldap:ldap /var/lib/ldap/
2.4 구성 검증 및 서비스 시작
구문 오류가 없는지 테스트 한 후 서비스를 활성화합니다.
# 구성 파일 문법 검사 (checksum 에러는 무시 가능, succeeded 메시지 확인 필요)
sudo slaptest -u
# slapd 서비스 시작 및 부팅 시 자동 실행 등록
sudo systemctl start slapd
sudo systemctl enable slapd
3. 스키마 로드
NIS, COSINE, inetOrgPerson 등 표준 LDAP 스키마를 서버에 적용합니다. 이 단계가 완료되어야 사용자 및 그룹 객체를 생성할 수 있습니다.
# 각 스키마 파일을 ldapi 프로토콜을 통해 외부 인증으로 추가
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
4. 기본 디렉터리 트리 생성
루트 도메인과 하위 OU(Organization Unit) 구조를 정의하는 LDIF 파일을 작성하고 등록합니다.
4.1 base_tree.ldif 작성
# /etc/openldap/base_tree.ldif
dn: dc=corp,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: Corp Local Organization
dc: corp
dn: ou=People,dc=corp,dc=local
objectClass: organizationalUnit
ou: People
dn: ou=Groups,dc=corp,dc=local
objectClass: organizationalUnit
ou: Groups
4.2 디렉터리 등록
# 관리자 계정으로 인증하여 항목 추가
sudo ldapadd -x -D "cn=admin,dc=corp,dc=local" -W -f /etc/openldap/base_tree.ldif
# Enter LDAP Password: [관리자 비밀번호 입력]
5. 클라이언트 구성 (ldap.conf)
서버 내부 또는 외부 클라이언트가 LDAP 서버를 쉽게 참조할 수 있도록 기본 URI와 BASE DN을 설정합니다.
# /etc/openldap/ldap.conf 수정
BASE dc=corp,dc=local
URI ldap://192.168.1.100:389
TLS_CACERTDIR /etc/openldap/certs
SASL_NOCANON on
6. phpLdapAdmin 웹 관리 도구 설정
Command Line 조작이 번거로운 경우를 대비해 phpLdapAdmin을 설치하고 Apache와 연동합니다.
6.1 Apache 가상 호스트 허용 범위 수정
외부 IP에서 접근할 수 있도록 /etc/httpd/conf.d/phpldapadmin.conf 파일을 수정합니다. Apache 2.4 이상 버전 기준입니다.
<IfModule mod_authz_core.c>
# Require local
Require all granted
</IfModule>
6.2 phpLdapAdmin 설정 파일 수정
/etc/phpldapadmin/config.php 파일을 열어 다음과 같이 조정합니다.
- 로그인 속성 변경: UID 대신 DN으로 로그인하도록 설정합니다.
$servers->setValue('login','attr','dn'); - 익명 바인딩 비활성화: 보안 강화를 위해 익명 조회를 차단합니다.
$servers->setValue('login','anon_bind',false); - 고유성 속성 설정: 중복 방지를 위한 필드를 지정합니다.
$servers->setValue('unique','attrs',array('mail','uid','uidNumber','cn','sn'));
6.3 서비스 재시작 및 접속
sudo systemctl restart httpd
sudo systemctl restart slapd
브라우저를 통해 http://[Server-IP]/phpldapadmin에 접속하여 cn=admin,dc=corp,dc=local 및 설정한 비밀번호로 로그인합니다.
7. 사용자 및 그룹 관리 예시
웹 GUI 외에 터미널에서 LDIF 파일을 이용해 사용자를 생성하는 방법입니다.
7.1 테스트 OU 생성
# /tmp/test_ou.ldif
dn: ou=TestUsers,dc=corp,dc=local
objectClass: organizationalUnit
ou: TestUsers
# 적용 명령어
sudo ldapadd -x -D "cn=admin,dc=corp,dc=local" -w "SecretPassword123!" -f /tmp/test_ou.ldif
7.2 개별 사용자 생성
# /tmp/user_john.ldif
dn: uid=jdoe,ou=TestUsers,dc=corp,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: jdoe
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/jdoe
loginShell: /bin/bash
gecos: John Doe
userPassword:: e1NTSEF9... # slappasswd로 생성된 Base64 인코딩된 해시 값
mail: john.doe@corp.local
# 적용 명령어
sudo ldapadd -x -D "cn=admin,dc=corp,dc=local" -w "SecretPassword123!" -f /tmp/user_john.ldif
8. 자주 사용하는 LDAP 쿼리 명령어
구성 상태나 특정 엔트리를 확인할 때 유용한 명령어들입니다.
8.1 전체 검색 및 필터링
# 모든 엔트리 검색 (간단 인증)
ldapsearch -x -b 'dc=corp,dc=local' '(objectclass=*)'
# 특정 CN을 가진 사용자 검색
ldapsearch -x -b 'dc=corp,dc=local' '(cn=John Doe)'
# 특정 OU 내의 uid 검색
ldapsearch -x -D "cn=admin,dc=corp,dc=local" -w "SecretPassword123!" \
-b 'ou=TestUsers,dc=corp,dc=local' '(uid=jdoe)'
8.2 엔트리 삭제
삭제 시 부모 노드가 먼저 삭제되지 않도록 주의해야 하며, 하위 엔트리가 남아있으면 삭제가 실패할 수 있습니다.
# 특정 사용자 삭제
ldapdelete -x -D "cn=admin,dc=corp,dc=local" -w "SecretPassword123!" \
'uid=jdoe,ou=TestUsers,dc=corp,dc=local'
# OU 삭제 (하위 항목이 없을 때만 가능)
ldapdelete -x -D "cn=admin,dc=corp,dc=local" -w "SecretPassword123!" \
'ou=TestUsers,dc=corp,dc=local'
8.3 주요 용어 참고
- DC (Domain Component): DNS 도메인 이름의 구성 요소 (예:
dc=corp,dc=local). - CN (Common Name): 개체의 일반적인 이름 (예: 사람의 성함).
- OU (Organizational Unit): 조직 단위, 논리적 그룹핑 용도.
- UID (User ID): 시스템 로그인을 위한 고유 식별자.