설치 절차 자체는 OpenLDAP v2.7.1 설치 가이드 에 있다. 이 문서는 그 과정에서 걸리는 오류와 원인을 모았다. 대부분 ./configure 단계에서 빠진 개발 패키지이거나, 설치 경로와 설정 파일이 가리키는 경로가 어긋난 경우다.
동적 모듈 적재에 필요한 헤더가 없다.
dnf install -y libtool libtool-ltdl libtool-ltdl-devel
Perl 백엔드를 켠 구성에서 필요하다.
dnf install -y perl-ExtUtils-Embed
perl -MExtUtils::Embed -e 'print "ok\n"'
Perl 백엔드를 쓸 일이 없으면 --enable-perl=no 로 끄는 편이 낫다.
SQL 백엔드가 켜져 있는데 ODBC 개발 패키지가 없다. SQL 백엔드는 스키마 매핑을 직접 작성해야 하는 특수 구성이라 일반 환경에서는 쓰지 않는다.
# 필요 없으면 끈다
./configure ... --enable-sql=no
# 정말 쓸 거라면
dnf install -y unixODBC unixODBC-devel
--enable-backends=mod 처럼 모든 백엔드를 켜면 WiredTiger 백엔드까지 빌드하려 한다. RHEL 계열 기본 저장소에는 이 라이브러리가 없다. 일반적인 구성은 mdb(LMDB) 하나면 충분하다.
./configure --prefix=/usr/local/openldap \
--sysconfdir=/etc/openldap \
--enable-slapd --enable-modules --enable-dynamic \
--disable-wt --enable-sql=no \
--with-tls=openssl --with-cyrus-sasl \
--enable-crypt --enable-spasswd
시험 스크립트가 아직 설치되지 않은 바이너리를 찾는 경우다. make 후 make install 을 마친 뒤 실제 구동으로 확인하는 편이 빠르다. 시험을 돌리려면 소스 트리 안에서 빌드 산출물 경로가 유지된 상태여야 한다.
서비스 계정이 없다.
getent group ldap || groupadd -r ldap
getent passwd ldap || useradd -r -g ldap -d /var/lib/openldap -s /sbin/nologin ldap
install -d -o ldap -g ldap /var/lib/openldap /var/run/openldap
chown -R ldap:ldap /etc/openldap
slapd.conf 의 include 경로가 실제 설치 위치와 다르다. --prefix 와 --sysconfdir 을 따로 준 경우 스키마는 prefix 아래에, 설정 파일은 sysconfdir 아래에 놓이므로 경로가 갈린다.
find /usr/local/openldap /etc/openldap -name core.schema 2>/dev/null
찾은 경로로 include 를 고친다. 이어지는 <include> handler exited with 1! 은 같은 원인의 후속 메시지다.
포트는 설정 파일이 아니라 -h 옵션이 정한다.
/usr/local/openldap/libexec/slapd -F /usr/local/openldap/etc/openldap/slapd.d \
-h "ldap:/// ldaps:/// ldapi:///" -u ldap -g ldap
ldaps:/// 를 넣었다면 TLS 인증서 설정이 먼저 있어야 한다. 없으면 기동이 실패한다.
TLSCertificateFile /etc/openldap/certs/server.crt
TLSCertificateKeyFile /etc/openldap/certs/server.key
TLSCACertificateFile /etc/openldap/certs/ca.crt
키 파일은 ldap 계정이 읽을 수 있어야 한다(chown ldap:ldap, chmod 600).
Type=forking 인데 -d 옵션으로 포그라운드에 남거나, 반대로 Type=simple 인데 데몬화되면 상태가 어긋난다. 디버그로 직접 띄워 보면 원인이 빨리 보인다.
/usr/local/openldap/libexec/slapd -d 1 -F /usr/local/openldap/etc/openldap/slapd.d \
-h "ldap:/// ldapi:///"
slapd -d 로는 되는데 서비스로는 안 되면 SELinux · 경로 · 계정 권한을 본다.
| 파일 | 대상 | 내용 |
|---|---|---|
slapd.conf (또는 slapd.d) |
서버 | 스키마 · 데이터베이스 · ACL · TLS 인증서 |
ldap.conf |
클라이언트 도구 | URI · BASE · TLS_CACERT |
ldapsearch 가 이상한 서버를 보고 있다면 ldap.conf 를 확인한다. 반대로 서버 동작이 이상한데 ldap.conf 를 고치는 것은 소용이 없다.
# /etc/openldap/ldap.conf
URI ldap://ldap.example.com ldaps://ldap.example.com
BASE dc=example,dc=com
TLS_CACERT /etc/pki/tls/certs/corp-ca.crt
/usr/local/openldap/sbin/slapd -VV
/usr/local/openldap/sbin/slaptest -f /etc/openldap/slapd.conf -v
ldapsearch -x -H ldap://localhost -b "" -s base namingContexts
ss -lntp | grep -E ':389|:636'