Инструменты пользователя

Инструменты сайта


openldap:openldap

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)

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

  1. :!: При выполнении этой команды происходит удаление БД, будьте внимательны !
    dpkg-reconfigure slapd
  2. Запуск сервера:
    service slapd start

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

Репликация

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

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

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

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

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

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

Это решение можно использовать и для нескольких DIT

Порядок настройки:

Перед выполнением перечисленных ниже процедур, в файлах .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

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

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

Пример:

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 на полученный в файле 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

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

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

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

Файл 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

Индексы

:!: Нужно выполнить Индексирование, чтобы избежать ошибок типа:

/var/log/syslog
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

3. Создать olcRootPW для нового DIT

Удаление DIT

:!: Этот способ удаления предусматривает перезагрузку slapd
К сожалению нам известен только такой способ удаления.

Пример удаления DIT с номером {2}

delete-domain2.sh
#!/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

Создание 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

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

Готовый скрипт для выполнения всех перечисленных выше действий:

change-core_ldif.sh
#/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

core.schema

slapd_2.4.44+dfsg-5+deb9u2_amd64.deb
deb://CONTENTS/etc/ldap/schema/core.schema

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

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

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

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

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

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 · Последние изменения: 2019-05-08 12:10 — GreyWolf