OpenLDAP — открытая реализация сервера каталогов LDAP.
В 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
Статус сервера и список активных соединений:
#!/bin/bash echo "Статус:" netstat -tulpn |grep slapd echo "Активные соединения:" sockstat|grep :389
Файл настройки запуска сервера: /etc/default/slapd
Запуск на всех интерфейсах:
SLAPD_SERVICES="ldap:/// ldapi:///"
Только на localhost
:
SLAPD_SERVICES="ldap://127.0.0.1:389/ ldapi:///"
Ниже описан пример с репликацией данных между серверами:
Такое решение удобно использовать для распределения нагрузки между серверами.
Это решение можно использовать и для нескольких DIT
Порядок настройки:
Перед выполнением перечисленных ниже процедур, в файлах .ldif
нужно установить соответствующий номер БД. (в примерах используется {1}
):
Для большей безопасности на отдельных серверах можно использовать следующее решение: Пользователь для чтения всех данных кроме паролей
При необходимости реплику можно удалить: Удаление соединения с главным сервером
Эта последовательность команд полностью удаляет БД !
#!/bin/bash service slapd stop rm -r /var/lib/ldap/* dpkg-reconfigure slapd service slapd start
Команды выполняются от имени пользователя root
Схема Qmail не совместима с схемой Misc
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/qmail.ldif
Схема Misc не совместима с схемами Postfix и Qmail
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
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
Во всех примерах пароль: ПАРОЛЬ
slappasswd -h '{SSHA}' -s 'ПАРОЛЬ'
Пользователь для репликации.
Фактически этому пользователю доступны все поля в режиме «только чтение».
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
, для выполнения репликации всех данных кроме паролей.
dn: cn=srvs,dc=domain objectClass: simpleSecurityObject objectClass: organizationalRole cn: srvs description: services userPassword: {SSHA}8qlXsh1GzfvkLoOI8x19QF1/7KaN+Qo8
ldapadd -Y EXTERNAL -H ldapi:/// -f srvs.ldif
Пользователь для Адресной книги в Roundcube.
dn: cn=addressbook,dc=domain objectClass: simpleSecurityObject objectClass: organizationalRole cn: addressbook description: addressbook user userPassword: {SSHA}8qlXsh1GzfvkLoOI8x19QF1/7KaN+Qo8
ldapadd -Y EXTERNAL -H ldapi:/// -f addressbook.ldif
olcRootPW — пароль администратора LDAP сервера (admin).
Используется при создании нового DIT
Нужно создать хеш пароля и заменить значение olcRootPW
на полученный в файле olcRootPW.ldif
.
Пример:
dn: olcDatabase={1}mdb,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}rxcXIxAZM40zRAIrwt1Q8l/KNlV7Br4a
ldapadd -Y EXTERNAL -H ldapi:/// -f olcRootPW.ldif
Нужно создать хеш пароля и заменить значение olcRootPW
на полученный в файле 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
В этом примере к стандартным полям добавлены права на:
Пользователи:
admin
— все права. Первоначально пароль задаётся при выполнении инициализации, возможно Изменение olcRootPWrepl
— Репликатор (все объекты только для чтения)srvs
— Пользователь для чтения всех данных кроме паролей, используется для служб DNS, DHCPldapadd -Y EXTERNAL -H ldapi:/// -f olcAccess.ldif
Нужно выполнить Индексирование, чтобы избежать ошибок типа:
slapd: <= bdb_equality_candidates: (mailLocalAddress) not indexed
При использовании MDB нельзя только удалить все индексы, нужно создать какие-то, поэтому в этот файл включено также создание индексов по умолчанию:
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
ldapadd -Y EXTERNAL -H ldapi:/// -f olcDbIndex_common.ldif
sudo -u openldap -g openldap slapindex -F /etc/ldap/slapd.d/
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
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), это уникальное трёхзначное число, идентифицирующее данную реплику.
Подробный пример описан в главе:Схема репликации
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
dn: olcDatabase={1}mdb,cn=config changetype: modify delete: olcSyncRepl
ldapadd -Y EXTERNAL -H ldapi:/// -f replica_Slave_delete.ldif
Directory Information Tree, информационное дерево каталога (также известное как naming-context). DIT — это иерархия объектов, составляющих структуру локального каталога. Одним LDAP-сервером может поддерживаться более одного DIT. Эта информация предоставляется Root DSE. Дополнительная информация здесь.
https://pro-ldap.ru/tr/zytrax/apd/index.html#dit
Домен создаётся при инициализации пакета. Далее описано как создать новый домен в дополнение к существующим:
#!/bin/bash DIR=/var/lib/ldap/domain2 mkdir $DIR chown openldap:openldap $DIR chmod 755 $DIR
В файле domain2.ldif
нужно установить соответствующий номер БД, в данном примере используется {2}
Также нужно создать хеш пароля и заменить значение olcRootPW
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
Этот способ удаления предусматривает перезагрузку slapd
К сожалению нам известен только такой способ удаления.
Пример удаления DIT с номером {2}
#!/bin/bash service slapd stop rm /etc/ldap/slapd.d/cn=config/olcDatabase={2}mdb.ldif rm -r /var/lib/ldap/domain2 service slapd start
Преобразование схем из формата schema
в формат ldif
Пример:
zcat /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema
Сначала нужно создать фиктивный файл /tmp/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
Нужно выполнить действия по образцу, на примере схемы qmail:
cp /tmp/dummy.d/cn=config/cn=schema/cn={5}qmail.ldif /etc/ldap/schema/qmail.ldif
Заменить стоки:
cn={5}qmail.ldif | qmail.ldif |
---|---|
dn: cn={5}qmail objectClass: olcSchemaConfig cn: {5}qmail | dn: cn=qmail,cn=schema,cn=config objectClass: olcSchemaConfig cn: qmail |
Удалить из 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:
#!/bin/sh service slapd stop rm /etc/ldap/slapd.d/cn=config/cn=schema/*qmail* service slapd start
Используется для использования групп адресов в RoundCube.
Если для создания группы нужно/можно ввести только имя тогда, нужно изменить свойства объекта groupOfNames
в схеме core
, в результата получится LDAP schema member-less group.
Порядок действий:
В исходной схеме нужно найти:
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 ) )
и заменить на:
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 ) )
chown openldap:openldap cn=\{0\}core.ldif
Скопировать изменённый файл в папку /etc/ldap/slapd.d/cn=config/cn=schema
Перед применением изменений сервер ОpenLDAP нужно остановить
service slapd stop
а затем запустить
service slapd start
Архив с готовыми и исходными файлами (источник core.schema
— файл slapd_2.4.44+dfsg-5+deb9u2_amd64.deb
)
Готовый скрипт для выполнения всех перечисленных выше действий:
#/bin/bash service slapd stop chown openldap:openldap cn=\{0\}core.ldif cp -f cn=\{0\}core.ldif /etc/ldap/slapd.d/cn=config/cn=schema/ service slapd start
Простой вариант:
slapcat -l OpenLDAP_Backup.ldif
Скрипт для копирования в файл, в имени которого присутствует номер дня недели:
#!/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
Резервное копирование БД №2:
slapcat -n 2 -l OpenLDAP_Backup_2.ldif
Если восстановление выполняется после выполнении процедуры Инициализация и требуется восстановить настройки с другого сервера, то перед выполнением восстановления данных нужно сначала выполнить процедуры Одиночный сервер или Репликация соответственно.
#!/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
Для использования атрибута c
(country
) нужно, чтобы у объекта был класс (objectClass): extensibleObject
Значение атрибута: двухбуквенный код страны.
java - LDAP - Not able to create a new person with country - Stack Overflow
LDAP map support for autofs
Autofs controls the operation of the automount daemons. The automount daemons automatically mount filesystems when they are used and unmount them after a period of inactivity. This is done based on a set of pre-configured maps.
The kernel automounter implements an almost complete SunOS style automounter under Linux. A recent version of the kernel autofs4 module (builtin or separate) is required.
HOWTO solve OpenLDAP bdb_equality_candidates errors
Re: ldapsearch and sambaAcctFlags
pro-ldap.ru: slapcat - утилита генерации LDIF из базы данных SLAPD
pro-ldap.ru: OpenLDAP и Ubuntu на практике > Резервное копирование и восстановление сервера OpenLDAP
pro-ldap.ru: OpenLDAP и Ubuntu на практике > Репликация сервера OpenLDAP