OpenLDAP: миграция с slapd.conf на cn=config (OLC)

Автор: | 11/03/2014

openldap_logoПример выполняется на:

# cat /etc/redhat-release
CentOS release 6.5 (Final)

С использованием:

# yum list installed | grep openldap
openldap.x86_64         2.4.23-34.el6_5.1
openldap-clients.x86_64 2.4.23-34.el6_5.1
openldap-servers.x86_64 2.4.23-34.el6_5.1

OLCon-line configuration, была введена в OpenLDAP с версии 2.3, и позволяет производить настройку сервера без необходимости его перезагрузки. Для управления с его помощью – в каталоге LDAP создаётся отдельный DIT, которая содержит в себе все настройки сервера.

Важно, что после перехода на конфигурацию через OLC – файл slapd.conf вообще не будет использоваться, т.к. при загрузке сервер сначала ищет директорию slapd.d, и только если он её не находит – ищет файл slapd.conf.

По-умолчанию во время установки OpenLDAP создаётся директория slapd.d.original:

# ls -l /etc/openldap/ | grep origin
drwx------. 3 ldap ldap 4096 Feb 12 14:39 slapd.d.original

В которой находится пример базы и ldif-файл:

# ls -l /etc/openldap/slapd.d.original/
total 8
drwx------. 3 ldap ldap 4096 Feb 12 14:39 cn=config
-rw-------. 1 ldap ldap 1131 Feb 12 14:39 cn=config.ldif

Но мы ими пользоваться не будем. Наша задача – конвертировать имеющий уже в работе файл slapd.conf в новый ldif.

Останавливаем сервер:

# service slapd stop
Stopping slapd:                                            [  OK  ]

Создаём копию файла, на всякий случай:

# cp /etc/openldap/slapd.conf /etc/openldap/slapd.conf.bkp

Редактируем сам файл slapd.conf – добавляем такие строки:

# enable on-the-fly configuration (cn=config)
database config
rootdn "cn=root,cn=config"
rootpw root

Проверяем его:

# slaptest -f /etc/openldap/slapd.conf
config file testing succeeded

Создаём каталог:

# mkdir /etc/openldap/slapd.d

И запускаем конвертирование:

# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
config file testing succeeded

Теперь в каталоге создана новая база:

# ls -l /etc/openldap/slapd.d
total 8
drwxr-x--- 3 root root 4096 Mar 11 13:16 cn=config
-rw------- 1 root root  986 Mar 11 13:16 cn=config.ldif

Устанавливаем пользователя:

# chown -R ldap:ldap /etc/openldap/slapd.d/

Удаляем старый файл:

# mv /etc/openldap/slapd.conf /etc/openldap/slapd.conf-2014-03-11.bkp

И запускаем сервер:

# service slapd start
Starting slapd:                                            [  OK  ]

Проверяем:

# ldapsearch -x -D "cn=root,cn=config" -W -LLL -b "cn=config" -s base
Enter LDAP Password:
dn: cn=config
objectClass: olcGlobal
cn: config
olcConfigFile: /etc/openldap/slapd.conf
olcConfigDir: /etc/openldap/slapd.d
olcAllows: bind_v2
olcArgsFile: /var/run/openldap/slapd.args
olcAttributeOptions: lang-
olcAuthzPolicy: none
olcConcurrency: 0
olcConnMaxPending: 100
olcConnMaxPendingAuth: 1000
olcGentleHUP: FALSE
olcIdleTimeout: 0
olcIndexSubstrIfMaxLen: 4
olcIndexSubstrIfMinLen: 2
olcIndexSubstrAnyLen: 4
olcIndexSubstrAnyStep: 2
olcIndexIntLen: 4
olcLocalSSF: 71
olcPidFile: /var/run/openldap/slapd.pid
olcReadOnly: FALSE
olcReverseLookup: FALSE
olcSaslSecProps: noplain,noanonymous
olcSockbufMaxIncoming: 262143
olcSockbufMaxIncomingAuth: 16777215
olcThreads: 16
olcTLSVerifyClient: never
olcToolThreads: 1
olcWriteTimeout: 0

Добавление нового DIT при использовании cn=config.

Как и при использовании slapd.conf – перед добавлением базы необходимо создать директорию:

# mkdir /var/lib/ldap/testdb
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/testdb/DB_CONFIG
# chown -R ldap:ldap /var/lib/ldap/testdb

Создаём хеш пароля:

# slappasswd -s testdb -h {MD5}
{MD5}KlcSdEcAfLKgNO5sGZX83Q==

Создаём ldif-файл новой базы:

dn: olcDatabase=bdb,cn=config
objectClass: olcBdbConfig
olcDatabase: bdb
olcDbDirectory: /var/lib/ldap/testdb
olcSuffix: dc=testdb
olcRootDN: cn=root,dc=testdb
olcRootPW: {MD5}KlcSdEcAfLKgNO5sGZX83Q==

И добавляем её с помощью ldapadd:

$ ldapadd -x -D "cn=root,cn=config" -W -f olc_test.ldif
Enter LDAP Password:
adding new entry "olcDatabase=bdb,cn=config"

Проверяем:

$ ldapsearch -x -b '' -s base '(&)' namingContexts -LLL dn | grep test
namingContexts: dc=testdb

Отлично, база создана. Добавим в неё корневую запись:

$ cat testdb.ldif
dn: dc=testdb
objectClass: top
objectClass: dcObject
objectClass: organization
dc: testdb
o: OLC test db
$ ldapadd -x -D "cn=root,dc=testdb" -W -f testdb.ldif
Enter LDAP Password:
adding new entry "dc=testdb"

Пробуем подключиться к ней:

$ ldapsearch -x -D "cn=root,dc=testdb" -W -b "dc=testdb" -LLL
Enter LDAP Password:
dn: dc=testdb
objectClass: top
objectClass: dcObject
objectClass: organization
dc: testdb
o: OLC test db

Если посмотреть в каталог /etc/openldap/slapd.d/cn=config/ – то в нём можно увидеть новый ldif-файл, который описывает новую базу (в данном случае у неё номер 9):

# head /etc/openldap/slapd.d/cn=config/olcDatabase={9}bdb.ldif
dn: olcDatabase={9}bdb
objectClass: olcBdbConfig
olcDatabase: {9}bdb
olcDbDirectory: /var/lib/ldap/testdb
olcSuffix: dc=testdb
olcRootDN: cn=root,dc=testdb
olcRootPW:: e01ENX1LbGNTZEVjQWZMS2dOTzVzR1pYODNRPT0=
structuralObjectClass: olcBdbConfig
entryUUID: 20d09580-3d60-1033-8a86-6b84c9dbc234
creatorsName: cn=root,cn=config

Готово.

Ссылки по теме:

http://blog.suretecsystems.com
http://docs.cs.up.ac.za
русский вариант + дополнения:
http://pro-ldap.ru
http://apfelboymchen.net
https://wiki.debian.org