| 방식 | 설명 |
|---|---|
slapd.conf (정적) |
텍스트 파일 하나. 고치면 재기동 필요. 최신 OpenLDAP 에서는 비권장 |
cn=config (동적, slapd.d) |
설정 자체가 LDAP 트리. ldapmodify 로 무중단 변경 |
두 방식은 동시에 쓸 수 없다. slapd 를 -f <파일> 로 띄우면 정적, -F <디렉터리> 로 띄우면 동적이다. slapd.conf 를 열심히 고쳤는데 반영되지 않는다면 실제로는 -F 로 기동 중인 경우가 많다.
ps -ef | grep [s]lapd
# 1) 기존 디렉터리를 비우고 새로 만든다
sudo rm -rf /usr/local/openldap/etc/openldap/slapd.d
sudo mkdir -p /usr/local/openldap/etc/openldap/slapd.d
# 2) 변환
sudo /usr/local/openldap/sbin/slaptest \
-f /usr/local/openldap/etc/openldap/slapd.conf \
-F /usr/local/openldap/etc/openldap/slapd.d
# 3) 소유권
sudo chown -R ldap:ldap /usr/local/openldap/etc/openldap/slapd.d
변환 결과로 cn=config.ldif 와 olcDatabase={n}*.ldif 파일이 생긴다. 이 파일들을 직접 편집하지 않는다. 체크섬이 들어 있어 손으로 고치면 경고가 나고, 실수하면 기동이 막힌다. 변경은 반드시 ldapmodify 로 한다.
# /etc/systemd/system/slapd.service
[Unit]
Description=OpenLDAP Server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/openldap/libexec/slapd -d 0 \
-F /usr/local/openldap/etc/openldap/slapd.d \
-h "ldap:/// ldaps:/// ldapi:///" \
-u ldap -g ldap
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now slapd
포트는 설정 파일이 아니라 -h 옵션이 정한다. 기본이 아닌 포트를 쓰려면 여기에 적는다.
-h "ldap://0.0.0.0:10088 ldaps://0.0.0.0:10089 ldapi:///"
ldapi:/// 를 반드시 포함한다. 관리 작업이 이 소켓을 쓴다. 포트를 1024 미만이 아닌 값으로 바꿨다면 클라이언트 쪽 ldap.conf 의 URI 도 함께 고친다.
Type=forking 으로 두고 -d 옵션을 함께 주면 프로세스가 포그라운드로 남아 systemd 가 기동 실패로 판단한다. 위처럼 Type=simple + -d 0 조합이 단순하다.
cn=config 를 고칠 때는 UNIX 소켓으로 접속해 프로세스의 UID 로 인증한다.
sudo ldapwhoami -Y EXTERNAL -H ldapi:///
# dn:gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
uidNumber=0 이어야 한다. sudo -u ldap 으로 실행하면 다음처럼 나오고, 이 신원에는 설정 변경 권한이 없어 Insufficient access (50) 가 난다.
SASL username: gidNumber=988+uidNumber=991,cn=peercred,cn=external,cn=auth
ldap_modify: Insufficient access (50)
서비스는 ldap 계정으로 돌리되, 설정 변경 명령만 root 로 실행한다.
sudo /usr/local/openldap/bin/ldapmodify -Y EXTERNAL -H ldapi:/// -f change.ldif
sudo ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config dn
result: 32 no such object : slapd 가 -F 없이 떠 있어 cn=config 트리 자체가 없다. 유닛 파일을 고치고 재기동한다.{1}mdb 이기도 하고 {2}mdb 이기도 하다.sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config \
"(objectClass=olcDatabaseConfig)" dn olcSuffix
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}monitor,cn=config
dn: olcDatabase={2}mdb,cn=config
olcSuffix: dc=example,dc=com
olcSuffix 가 실제 데이터를 담는 데이터베이스다. LDIF 의 DN 을 여기에 맞춘다.
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=example,dc=com
-
replace: olcRootPW
olcRootPW: {SSHA}<slappasswd 출력값>
slappasswd # 해시 생성
olcRootDN 은 ACL 을 우회하는 계정이며 데이터베이스마다 따로 있다. olcDatabase={0}config 의 rootDN 은 설정 트리 전용이고, 데이터 트리의 rootDN 과 다르다. cn=root,... 로 cn=config 를 고치려다 Insufficient access 를 보는 것은 이 둘을 혼동한 경우다.
rootDN 에 지정한 DN 은 트리에 실제로 존재하지 않아도 된다. 반대로 트리에 cn=admin 항목을 만들어 두었다고 관리자가 되는 것도 아니다.
전환 직후에는 최상위 항목이 없어 no such object 가 난다. 먼저 만들어 준다.
# base.ldif
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Example
dc: example
dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people
ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f base.ldif
Naming violation (64) 는 dc: 값이 DN 의 dc= 와 다를 때 난다. dn: dc=example,dc=com 이면 dc: example 이어야 한다.
cn=config 로 전환한 뒤에도 slapd.conf 를 남겨 두면 어느 쪽이 적용 중인지 헷갈린다. 전환이 끝나면 파일 이름을 바꿔 두고, 설정 백업은 다음처럼 뜬다.
sudo slapcat -n 0 -F /usr/local/openldap/etc/openldap/slapd.d -l config-backup.ldif # 설정
sudo slapcat -n 2 -F /usr/local/openldap/etc/openldap/slapd.d -l data-backup.ldif # 데이터
olcAccess 규칙 작성.