OpenLDAP

Оригинал

OpenLDAP — открытая реализация сервера каталогов LDAP.

http://www.openldap.org

В OpenLDAP 2.3 и более новых версиях осуществлён переход к использованию механизма динамической конфигурации времени исполнения, этот механизм также называется cn=config (OLC).

При использовании этого механизма сервер хранит свои конфигурационные данные в базе данных LDIF, обычно в папке /etc/openldap/slapd.d и позволяет менять все настройки slapd на сразу, не требуя перезагрузки демона slapd для вступления изменений в силу.

Все приведённые ниже примеры и настройки даны для cn=config (OLC) и формата БД: MDB.

Примеры которые здесь приведены могут быть использованы для настройки следующих решений:

Примеры:

Установка

apt-get install slapd ldap-utils

При первоначальной настройке пакета потребуется ввести пароль администратора LDAP сервера (admin)

Если после установки пакета нужно задать имя домена, для этого нужно использовать следующие команды:

При изменение выполнении этой команды происходит удаление БД, будьте внимательны !

dpkg-reconfigure slapd

Запуск сервера:

service slapd start

Одиночный сервер

Репликация

Ниже описан пример с репликацией данных между серверами:

  • Один главный сервер, несколько подчиненных.
  • Изменение данных происходит только на главном сервере.
  • Подчиненные серверах предоставляют данные только для чтения.

Такое решение удобно использовать для распределения нагрузки между серверами.

Пример схемы репликации

Главный сервер

Подчинённый сервер

Подчинённый сервер для нескольких доменов

При выполнении процедур:

в файлах .ldif нужно установить соответствующий номер БД. В примерах используется {1}

Для большей безопасности на отдельных серверах можно использовать следующее решение: Пользователь для чтения всех данных кроме паролей

Инициализация

Эта последовательность команд полностью удаляет БД !

ldap_init.sh
#!/bin/bash
 
service slapd stop
rm -r /var/lib/ldap/*
dpkg-reconfigure slapd
service slapd start

Добавление схем

Команды выполняются от имени пользователя root

Qmail

Схема Qmail не совместима с схемой Misc

qmail.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/qmail.ldif

Misc

Схема Misc не совместима с схемами Postfix и Qmail

olcDbIndex_misc.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: mailLocalAddress eq
-
add: olcDbIndex
olcDbIndex: rfc822MailMember eq
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f olcDbIndex_misc.ldif

Создание пользователей

Во всех примерах пароль: ПАРОЛЬ

Создание хеша пароля

slappasswd -h '{SSHA}' -s 'ПАРОЛЬ'

repl

Пользователь для репликации.

repl.ldif
dn: cn=repl,dc=domain
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: repl
description: replicator
userPassword: {SSHA}8qlXsh1GzfvkLoOI8x19QF1/7KaN+Qo8
ldapadd -Y EXTERNAL -H ldapi:/// -f repl.ldif

srvs

Пользователь для чтения всех данных кроме паролей.

Если настройка прав доступа к серверу выполнена по описанию: Настройка прав доступа, то можно создать специального пользователя, например srvs, для выполнения репликации всех данных кроме паролей.

srvs.ldif
dn: cn=srvs,dc=domain
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: auth
description: services
userPassword: {SSHA}8qlXsh1GzfvkLoOI8x19QF1/7KaN+Qo8
ldapadd -Y EXTERNAL -H ldapi:/// -f srvs.ldif

addressbook

Пользователь для Адресной книги в Roundcube.

addressbook.ldif
dn: cn=addressbook,dc=domain
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: auth
description: addressbook user
userPassword: {SSHA}8qlXsh1GzfvkLoOI8x19QF1/7KaN+Qo8
ldapadd -Y EXTERNAL -H ldapi:/// -f addressbook.ldif

Изменение olcRootPW

Нужно создать хеш пароля и заменить значение olcRootPW на полученный в файле olcRootPW.ldif.

Пример:

olcRootPW.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
delete: olcRootPW
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}rxcXIxAZM40zRAIrwt1Q8l/KNlV7Br4a
ldapadd -Y EXTERNAL -H ldapi:/// -f olcRootPW.ldif

Настройка прав доступа

FIXME

В этом примере к стандартным полям добавлены права на:

Пользователи:

Файл olcAccess.ldif

Файл olcAccess.ldif

olcAccess.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
delete: olcAccess
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to dn.subtree="ou=addressbook,dc=domain" by dn="cn=addressbook,dc=domain" write by * read
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {1}to attrs=userPassword,shadowLastChange,sambaLMPassword,sambaNTPassword,sambaPwdLastSet by self write by anonymous auth by dn="cn=admin,dc=domain" write by dn="cn=repl,dc=domain" read by * none
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {2}to dn.one="ou=users,dc=domain" by self write by dn="cn=repl,dc=domain" read by dn="cn=srvs,dc=domain" read by anonymous read
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {3}to dn.one="ou=groups,dc=domain" by self write by dn="cn=repl,dc=domain" read by dn="cn=srvs,dc=domain" read by anonymous read
 
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {4}to dn.regex="(.+,)?(uid=[^,]+,ou=users,dc=domain)$" by dn.exact,expand="$2" write by dn="cn=repl,dc=domain" read by self write
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {5}to dn.subtree="ou=dhcp,dc=domain" by dn="cn=srvs,dc=domain" read by dn="cn=repl,dc=domain" read by * none
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {6}to dn.subtree="ou=dns,dc=domain" by dn="cn=srvs,dc=domain" read by dn="cn=repl,dc=domain" read by * none
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {7}to dn.subtree="ou=aliases,dc=domain" by dn="cn=srvs,dc=domain" read by dn="cn=repl,dc=domain" read by anonymous auth by * none
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {8}to dn.subtree="ou=computers,dc=domain" by dn="cn=srvs,dc=domain" read by dn="cn=repl,dc=domain" read by anonymous auth by * none
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {9}to dn.subtree="ou=idmap,dc=domain" by dn="cn=srvs,dc=domain" read by dn="cn=repl,dc=domain" read by anonymous auth by * none
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {10}to dn.base="cn=admin,dc=domain" by dn="cn=repl,dc=domain" read by anonymous auth by * none
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {11}to dn.base="cn=srvs,dc=domain" by dn="cn=repl,dc=domain" read  by anonymous auth by * none
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {12}to dn.base="cn=repl,dc=domain" by dn="cn=repl,dc=domain" read by anonymous auth by * none
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {13}to * by self write by dn="cn=admin,dc=domain" write by dn="cn=repl,dc=domain" read by * read
 
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {14}to dn.base="" by * none
ldapadd -Y EXTERNAL -H ldapi:/// -f olcAccess.ldif

Индексы

Для того, чтобы избежать ошибок:

slapd: <= bdb_equality_candidates: (mailLocalAddress) not indexed

Нужно выполнить Индексирование

Удаление всех индексов

При использовании MDB нельзя только удалить все индексы, нужно создать какие-то, поэтому в этот файл включено также создание индексов по умолчанию:

olcDbIndex_delete.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
delete: olcDbIndex
-
add: olcDbIndex
olcDbIndex: cn eq,pres,sub
-
add: olcDbIndex
olcDbIndex: sn eq,pres,sub
-
add: olcDbIndex
olcDbIndex: uid eq,pres,sub
-
add: olcDbIndex
olcDbIndex: objectClass eq
-
add: olcDbIndex
olcDbIndex: uidNumber,gidNumber eq
-
add: olcDbIndex
olcDbIndex: member,memberUid eq
ldapadd -Y EXTERNAL -H ldapi:/// -f olcDbIndex_delete.ldif

Создание общих индексов

Файл olcDbIndex_common.ldif

Файл olcDbIndex_common.ldif

olcDbIndex_common.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: default sub
-
add: olcDbIndex
olcDbIndex: ou eq,pres,sub
-
add: olcDbIndex
olcDbIndex: o eq,pres,sub
-
add: olcDbIndex
olcDbIndex: givenname eq,pres,sub
-
add: olcDbIndex
olcDbIndex: loginShell eq,pres
-
add: olcDbIndex
olcDbIndex: uniqueMember eq
-
add: olcDbIndex
olcDbIndex: entryUUID eq
-
add: olcDbIndex
olcDbIndex: entryCSN eq
-
add: olcDbIndex
olcDbIndex: displayName pres,sub,eq
-
add: olcDbIndex
olcDbIndex: telephoneNumber eq,pres,sub
-
add: olcDbIndex
olcDbIndex: mobile eq,pres,sub
-
add: olcDbIndex
olcDbIndex: homePhone eq,pres,sub
-
add: olcDbIndex
olcDbIndex: mail eq,pres,sub
-
add: olcDbIndex
olcDbIndex: maildrop eq,pres,sub
-
add: olcDbIndex
olcDbIndex: description eq,pres,sub
ldapadd -Y EXTERNAL -H ldapi:/// -f olcDbIndex_common.ldif

Индексирование

sudo -u openldap -g openldap slapindex -F /etc/ldap/slapd.d/

Наложение для реплики на главном сервере

replica_Master.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov
 
dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionlog: 100
ldapadd -Y EXTERNAL -H ldapi:/// -f replica_Master.ldif

Настройка лимитов

limit_Master.ldif
dn: olcDatabase={-1}frontend,cn=config
changetype: modify
delete: olcSizeLimit
 
dn: olcDatabase={-1}frontend,cn=config
changetype: modify
add: olcSizeLimit
olcSizeLimit: unlimited
ldapadd -Y EXTERNAL -H ldapi:/// -f limit_Master.ldif

Настройка соединения с главным сервером

Важно на каждом подчиненном сервере установить уникальный rid (Replica ID), это уникальное трехзначное число, идентифицирующее данную реплику.

Подробный пример описан в главе:Схема репликации

replica_Slave.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncrepl: rid=1 provider="ldap://ldap0.domain.ru:389/" type=refreshAndPersist retry="60 30 300 +" searchbase="dc=domain" bindmethod=simple binddn="cn=repl,dc=domain" credentials=ПАРОЛЬ
ldapadd -Y EXTERNAL -H ldapi:/// -f replica_Slave.ldif

Удаление соединения с главным сервером

replica_Slave_delete.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
delete: olcSyncRepl
ldapadd -Y EXTERNAL -H ldapi:/// -f replica_Slave_delete.ldif

Создание нового DIT

FIXME

Directory Information Tree, информационное дерево каталога (также известное как naming-context). DIT — это иерархия объектов, составляющих структуру локального каталога. Одним LDAP-сервером может поддерживаться более одного DIT. Эта информация предоставляется Root DSE. Дополнительная информация здесь.

https://pro-ldap.ru/tr/zytrax/apd/index.html#dit

Домен создаётся при инициализации пакета, здесь описано как создать новый домен в дополнение к существующим.

1. Сначала нужно создать папку для БД:

create_domain2.sh
#!/bin/bash
 
DIR=/var/lib/ldap/domain2
mkdir $DIR
chown openldap:openldap $DIR
chmod 755 $DIR

2. В файле domain2.ldif нужно установить соответствующий номер БД, в данном примере используется {2} нужно создать хеш пароля и заменить значение olcRootPW

domain2.ldif
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
olcDbCheckpoint: 512 30
olcDbMaxSize: 1073741824
olcDbIndex: objectClass eq
olcDbDirectory: /var/lib/ldap/domain2
olcSuffix: dc=domain2
olcRootDN: cn=admin,dc=domain2
olcRootPW:: {SSHA}rxcXIxAZM40zRAIrwt1Q8l/KNlV7Br4a
 
 
dn: dc=domain2
objectClass: top
objectClass: dcObject
objectClass: organization
o: Домен2
dc: domain2
ldapadd -Y EXTERNAL -H ldapi:/// -f domain2.ldif

Преобразование схем

Преобразование схем из формата schema в формат ldif

Извлечение схемы

Пример:

zcat /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema

Создание ldif файла

Сначала нужно создать фиктивный файл /tmp/dummy.conf, в нем должны быть перечислены все схемы, в том числе и новые:

dummy.conf
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/qmail.schema
include /etc/ldap/schema/postfix.schema
include /etc/ldap/schema/samba.schema

Затем нужно создать фиктивную папку: /tmp/dummy.d и выполнить преобразование:

mkdir /tmp/dummy.d
slaptest -F /tmp/dummy.d -f /tmp/dummy.conf

Изменение ldif файла

Нужно выполнить действия по образцу, на примере схемы qmail.

1. Копируем схему:

cp /tmp/dummy.d/cn=config/cn=schema/cn={5}qmail.ldif /etc/ldap/schema/qmail.ldif

2. Нужно заменить стоки:

cn={5}qmail.ldifqmail.ldif
dn: cn={5}qmail
objectClass: olcSchemaConfig
cn: {5}qmail
dn: cn=qmail,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: qmail

3. Нужно удалить из cn={5}qmail.ldif строки:

structuralObjectClass: olcSchemaConfig
entryUUID: a8f199bc-2bcf-1032-8ece-d70658724f78
creatorsName: cn=config
createTimestamp: 20130328084600Z
entryCSN: 20130328084600.309604Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20130328084600Z

Добавление схемы

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/qmail.ldif

Удаление схемы

Пример удаления схемы qmail:

OpenLDAP_schema_delete.sh
#!/bin/sh
 
service slapd stop
rm /etc/ldap/slapd.d/cn=config/cn=schema/*qmail*
service slapd start

Пустая группа groupOfNames

FIXME

Используется для использования групп адресов в RoundCube.

Если для создания группы нужно/можно ввести только имя тогда, нужно изменить свойства объекта groupOfNames в схеме core, в результата получится LDAP schema member-less group.

1. В исходной схеме нужно найти:

/etc/ldap/schema/core.schema
objectclass ( 2.5.6.9 NAME 'groupOfNames'
        DESC 'RFC2256: a group of names (DNs)'
        SUP top STRUCTURAL
        MUST ( member $ cn )
        MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) )

и заменить на:

/etc/ldap/schema/core.schema
objectclass ( 2.5.6.9 NAME 'groupOfNames'
        DESC 'RFC2256: a group of names (DNs)'
        SUP top STRUCTURAL
        MUST cn
        MAY ( member $ businessCategory $ seeAlso $ owner $ ou $ o $ description ) )

3. Выполнить для этой схемы действия описанные в разделе Преобразование схем

4. Установить правильные права на новый файл:

chown openldap:openldap cn=\{0\}core.ldif

3. Скопировать изменённый файл в папку /etc/ldap/slapd.d/cn=config/cn=schema

Перед применением изменений сервер ОpenLDAP должен быть остановлен командой:

service slapd stop

а затем запущен снова командой:

service slapd start

Архив с готовыми и исходными файлами

Резервное копирование

Простой вариант:

slapcat -l OpenLDAP_Backup.ldif

Скрипт для копирования в файл, в имени которого присутствует номер дня недели:

OpenLDAP_Backup.sh
#!/bin/bash
 
backup_path=/root/Backup/
 
wd=`date '+%u'`
slapcat -l /etc/ldap/OpenLDAP_$wd.ldif
tar -cvzf $backup_path`hostname`_OpenLDAP_$wd.tar.gz /etc/ldap

FIXME

Резервное копирование БД №2:

slapcat -n 2 -l OpenLDAP_Backup_2.ldif

Восстановление

Если восстановление выполняется после выполнении процедуры Инициализация и требуется восстановить настройки с другого сервера, то перед выполнением восстановления данных нужно сначала выполнить процедуры Одиночный сервер или Репликация соответственно.

FIXME

OpenLDAP_Restore.sh
#!/bin/bash
 
service slapd stop
slapadd -l ldap.ldif
chown -R openldap:openldap /var/lib/ldap
chown -R openldap:openldap /etc/ldap/slapd.d
service slapd start

Восстановление контрольной суммы CRC32 LDIF-файла в конфигурации cn=config

Ссылки

openldap/openldap.txt · Последние изменения: 2018-08-06 20:53 — GreyWolf
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki