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

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


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

Настройка

Файл настройки запуска сервера: /etc/default/slapd

Запуск на всех интерфейсах:

SLAPD_SERVICES="ldap:/// ldapi:///"

Только на localhost:

SLAPD_SERVICES="ldap://127.0.0.1:389/ ldapi:///"

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

Репликация

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

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

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

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

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

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

Это решение можно использовать и для нескольких 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

inetorgperson

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.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: srvs
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: addressbook
description: addressbook user
userPassword: {SSHA}8qlXsh1GzfvkLoOI8x19QF1/7KaN+Qo8
ldapadd -Y EXTERNAL -H ldapi:/// -f addressbook.ldif

olcRootPW

olcRootPW — пароль администратора LDAP сервера (admin).

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

Удаление 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

Используется для использования групп адресов в 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 ) )
  2. Выполнить для этой схемы действия описанные в разделе Преобразование схем
  3. Установить правильные права на новый файл:
    chown openldap:openldap cn=\{0\}core.ldif
  4. Скопировать изменённый файл в папку /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)

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

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

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

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

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

Использование атрибута c

Для использования атрибута c (country) нужно, чтобы у объекта был класс (objectClass): extensibleObject

Значение атрибута: двухбуквенный код страны.


java - LDAP - Not able to create a new person with country - Stack Overflow

autofs-ldap

FIXME

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.

http://www.kernel.org/pub/linux/daemons/autofs/v5/

https://wiki.debian.org/LDAP/AutoFSSetup

Ссылки

openldap/openldap.txt · Последние изменения: 2020-08-29 20:51 — GreyWolf