LDAP: Установка и настройка LDAP-сервера

LDAP: Установка и настройка LDAP-сервераLDAP расшифровывается как Lightweight Directory Access Protocol, облегченный протокол доступа к каталогам. Это достаточно простой протокол, который позволяет производить операции аутентификации, поиска данных, сравнения, добавления, изменения и удаления записей. Сами каталоги используются для хранения структурированной информации. К сожалению, настройка LDAP для неподготовленного человека может быть сложна без предварительной подготовки. Поэтому давайте разберемся, что это такое и как это работает.

Установка OpenLDAP

Для всех современных дистрибутивов в официальных репозиториях есть уже готовые пакеты, поэтому установка обычно сводится к установке соответствующих пакетов:

apt-get install slapd ldap-utils

По зависимостям будет установлено еще несколько пакетов. При установке будет запрошен пароль пользователя admin. Задавайте любой, мы все равно будем после установки задавать собственную конфигурацию.

Если вам нужна самая свежая версия OpenLDAP, то исходные коды можно скачать на официальном сайте.

Схемы LDAP

По умолчанию OpenLDAP включает уже готовые схемы. Схемы — это структуры, определяющие объекты, используемые в системе каталогов. Схемы включают в себя классы объектов, у каждого класса есть определенный набор атрибутов. Каждая запись может относиться к одному или нескольким классам и, соответственно, иметь те наборы атрибутов, которые включены в соответствующие классы. В терминологии LDAP классы так и называются — ObjectClass. Вот несколько классов объектов, которые можно использовать:

top
organization
organizationalUnit
person
inetOrgPerson

При создании объекта вы указываете, к каким классам он относится и, исходя из этого, можно задавать соответствующие атрибуты. Примеры чуть ниже. Файлы схем хранятся в директории /etc/ldap/slapd.d/cn=config/cn=schema. В них хранятся описания классов объектов и атрибутов. Для просмотра объектов, которые используются в данный момент, используется команда

slapcat

Она выводит содержимое базы данных объектов.

# slapcat
dn: dc=nodomain
objectClass: top
objectClass: dcObject
objectClass: organization
o: nodomain
dc: nodomain
structuralObjectClass: organization
entryUUID: 353459a6-590e-1034-99e4-6b77cb057f89
creatorsName: cn=admin,dc=nodomain
createTimestamp: 20150307120702Z
entryCSN: 20150307120702.099143Z#000000#000#000000
modifiersName: cn=admin,dc=nodomain
modifyTimestamp: 20150307120702Z

dn: cn=admin,dc=nodomain
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9L3k1MTBJalk2WFRJMVBVY0t1NzVBSXBGVzFhSm9YTHM=
structuralObjectClass: organizationalRole
entryUUID: 3542135c-590e-1034-99e5-6b77cb057f89
creatorsName: cn=admin,dc=nodomain
createTimestamp: 20150307120702Z
entryCSN: 20150307120702.189090Z#000000#000#000000
modifiersName: cn=admin,dc=nodomain
modifyTimestamp: 20150307120702Z

Редактировать файлы схемы не рекомендуется. Хотя в интернете достаточно много статей по настройке LDAP, где рекомендуют отредактировать ldif-файлы схемы, это делать не нужно, более того, в самих файлах указан комментарий о том, что файлы нельзя редактировать вручную и необходимо для редактирования использовать команду ldapmodify. К сожалению, информации об использовании этой команды гораздо меньше, чем о ручном редактировании файлов .ldif, хотя ее использование в чем-то даже проще, чем редактирование файлов напрямую.

Настройка OpenLDAP

После установки пакетов надо переконфигурировать сервер, задать свои данные. Первое, что мы сделаем — создадим свой домен «mydomain.com». Для этого выполним команду

dpkg-reconfigure slapd

Вы увидите такой экран:

slapd01

Отвечаем No.

slapd02

Введем данные для нашего домена. У нас это будет «mydomain.com». Нажимаем OK.

slapd03

Вводим название организации «mydomain». Нажимаем OK.

slapd04

Вводим пароль администратора LDAP-сервера. Пароль желательно вводить сложный, это  как-никак пароль администратора. Нажимаем ОК.

slapd05

Повторяем пароль, нажимаем OK

slapd06

Выбираем «HDB» для типа сервера, нажимаем ОК.

slapd07

На вопрос удалять ли базу данных при вычистке slapd отвечаем утвердительно

slapd08

На вопрос о перемещении старой базы данных также отвечаем утвердительно

slapd09

На предложение включить старый протокол LDAPv2 отвечаем No/Нет

На этом первоначальная настройка завершена. Если сервис не стартовал, запускаем его вручную командой

service slapd start

Проверим, есть ли данные в базе:

# slapcat
dn: dc=mydomain,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: mydomain
dc: mydomain
structuralObjectClass: organization
entryUUID: 1ee47d10-5a0e-1034-91ab-1d2fe74d4d59
creatorsName: cn=admin,dc=mydomain,dc=com
createTimestamp: 20150308183855Z
entryCSN: 20150308183855.828659Z#000000#000#000000
modifiersName: cn=admin,dc=mydomain,dc=com
modifyTimestamp: 20150308183855Z

dn: cn=admin,dc=mydomain,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9ckhnNjlMNkt3MDFJVmNFUDNGTWdQZXlHcVF4Y0NPOG4=
structuralObjectClass: organizationalRole
entryUUID: 1ef22a64-5a0e-1034-91ac-1d2fe74d4d59
creatorsName: cn=admin,dc=mydomain,dc=com
createTimestamp: 20150308183855Z
entryCSN: 20150308183855.918294Z#000000#000#000000
modifiersName: cn=admin,dc=mydomain,dc=com
modifyTimestamp: 20150308183855Z

Можно сразу проверить, правильно ли работает сервер OpenLDAP. Это можно сделать следующей командой:

ldapsearch -D "cn=admin,dc=mydomain,dc=com" -W

После ввода команды будет запрошен пароль. Если вы не хотите вводить пароль в интерактивном режиме, вы можете использовать параметр -w:

ldapsearch -D "cn=admin,dc=mydomain,dc=com" -w ваш-пароль

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

# ldapsearch -D "cn=admin,dc=mydomain,dc=com" -W -b "dc=mydomain,dc=com" 
Enter LDAP Password: 
# extended LDIF 
# 
# LDAPv3 
# base <dc=mydomain,dc=com> with scope subtree 
# filter: (objectclass=*) 
# requesting: ALL 
# 
 
# mydomain.com 
dn: dc=mydomain,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: mydomain
dc: mydomain

# admin, mydomain.com
dn: cn=admin,dc=mydomain,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9ckhnNjlMNkt3MDFJVmNFUDNGTWdQZXlHcVF4Y0NPOG4=

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2

Параметр «-b» определяет поисковую базу, то есть тот узел дерева объектов, с которого будет начинаться поиск.

Можно продолжать настройку

Создадим группу пользователей с названием «users» при помощи команды ldapmodify

# ldapmodify -D "cn=admin,dc=mydomain,dc=com" -W
Enter LDAP Password: 
dn: ou=users,dc=mydomain,dc=com
changetype: add
objectClass: top
objectClass: organizationalUnit
ou: users
description: Domain Users

Всё, начиная с «dn: » вводим руками точно так, как написано выше. После ввода строки описания («description: Domain Users») нажимаем Enter два раза. Если всё введено без ошибок, вы должны увидеть такое сообщение:

adding new entry "ou=Users,dc=mydomain,dc=com"

Нажимаем Ctrl+C для выхода

Теперь надо проверить, внесены ли данные:

# ldapsearch -D "cn=admin,dc=mydomain,dc=com" -W -b "dc=mydomain,dc=com"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=mydomain,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# mydomain.com
dn: dc=mydomain,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: mydomain
dc: mydomain

# admin, mydomain.com
dn: cn=admin,dc=mydomain,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9T1ZtbWxpTGI2aGNXd1ltQ0RiMjlXOGhFR2FSaGo2Ujc=

# users, mydomain.com
dn: ou=users,dc=mydomain,dc=com
objectClass: top
objectClass: organizationalUnit
ou: users
description: Domain Users

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3

Всё верно, и теперь можно внести первого пользователя. Сначала сгенерируем хэш пароля для пользователя.

# slappasswd
New password: 
Re-enter new password: 
{SSHA}OdfUh9z71wKbHxb2dQodbaqEvlqHmhwa

Этот хэш нам понадобится при создании пользователя

Снова запускаем ldapmodify и создаем пользователя. По окончании ввода значений полей дважды нажимаем Enter

# ldapmodify -D "cn=admin,dc=mydomain,dc=com" -W
Enter LDAP Password: 
dn: cn=John Doe,ou=users,dc=mydomain,dc=com
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: John Doe
ou: users
uid: jdoe
givenName: John
sn: Doe
userPassword: {SSHA}OdfUh9z71wKbHxb2dQodbaqEvlqHmhwa

adding new entry "cn=John Doe,ou=Users,dc=mydomain,dc=com"

После ввода нажимаем Ctrl+C и выходим

Проверяем, есть ли запись с uid=jdoe:

# ldapsearch -D "cn=admin,dc=mydomain,dc=com" -b "dc=mydomain,dc=com" -W "(uid=jdoe)"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=mydomain,dc=com> with scope subtree
# filter: (uid=jdoe)
# requesting: ALL
#

# John Doe, users, mydomain.com
dn: cn=John Doe,ou=users,dc=mydomain,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: John Doe
ou: users
uid: jdoe
givenName: John
sn: Doe
userPassword:: e1NTSEF9T2RmVWg5ejcxd0tiSHhiMmRRb2RiYXFFdmxxSG1od2E=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Запись есть, отлично. Теперь надо проверить аутентификацию:

# ldapsearch -D "cn=John Doe,ou=users,dc=mydomain,dc=com" -b "dc=mydomain,dc=com" -W "(uid=jdoe)"
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=mydomain,dc=com> with scope subtree
# filter: (uid=jdoe)
# requesting: ALL
#

# John Doe, users, mydomain.com
dn: cn=John Doe,ou=Users,dc=mydomain,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: John Doe
ou: users
uid: jdoe
givenName: John
sn: Doe
userPassword:: e1NTSEF9T2RmVWg5ejcxd0tiSHhiMmRRb2RiYXFFdmxxSG1od2E=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

После ввода правильного пароля получаем запрошенную информацию

Обратите внимание на то, что даже если для записи указан uid, представляющий собой логин пользователя, вы не сможете использовать его для логина. Причина этого в том, что само поле не является первичным ключом записи. Если вы хотите использовать именно jdoe, то вам придется создать запись

dn: uid=jdoe,ou=users,dc=mydomain,dc=com

И задать для этой записи пароль. Эти две записи будут существовать в одно и то же время, поэтому вам нужно заранее подумать о том, какое поле вы будете использовать для аутентификации.

LDAP: Установка и настройка LDAP-сервера: 13 комментариев

  1. ivan

    Будет ли описание, как использовать этот сервер для авторизации ssh и др.?

    1. mnorin Автор записи

      Свежая статья про использование LDAP для входа по SSH — https://mnorin.com/autentifikatsiya-po-ssh-cherez-klient-ldap.html

  2. OverDriven

    после команды «ldapsearch -D «cn=admin,dc=mydomain,dc=com» -W»
    имею:

    # extended LDIF
    #
    # LDAPv3
    # base (default) with scope subtree
    # filter: (objectclass=*)
    # requesting: ALL
    #

    # search result
    search: 2
    result: 32 No such object

    хотя : slapcat дает результат:

    dn: dc=mydomain,dc=com
    objectClass: top
    objectClass: dcObject
    objectClass: organization
    o: mydomain
    dc: mydomain
    structuralObjectClass: organization
    entryUUID: 5086ad0c-6624-1035-9168-b1f8a077e573
    creatorsName: cn=admin,dc=mydomain,dc=com
    createTimestamp: 20160212223259Z
    entryCSN: 20160212223259.652393Z#000000#000#000000
    modifiersName: cn=admin,dc=mydomain,dc=com
    modifyTimestamp: 20160212223259Z

    dn: cn=admin,dc=mydomain,dc=com
    objectClass: simpleSecurityObject
    objectClass: organizationalRole
    cn: admin
    description: LDAP administrator
    userPassword:: e1NTSEF9U2czZUlEZ3BoeXJwUzZMbS9pVXAramJmV3lTNHJHU2o=
    structuralObjectClass: organizationalRole
    entryUUID: 508730c4-6624-1035-9169-b1f8a077e573
    creatorsName: cn=admin,dc=mydomain,dc=com
    createTimestamp: 20160212223259Z
    entryCSN: 20160212223259.655759Z#000000#000#000000
    modifiersName: cn=admin,dc=mydomain,dc=com
    modifyTimestamp: 20160212223259Z

    Подскажите новичку, что не так?

    1. mnorin Автор записи

      Похоже, при использовании base (default) используется не та база, которая у вас реально есть, поэтому попробуйте один из этих вариантов:
      1) Использовать параметр -b «your-base»:

      ldapsearch -D "cn=admin,dc=mydomain,dc=com" -W -b "dc=mydomain,dc=com"

      2) Указать BASE в файле /etc/ldap/ldap.conf

  3. Виктор

    День добрый! При инсталяции из всех настроек возможно было задать толко пароль админа, а все остальные настройки подхватились из кофигурации сервера (например, базовый DN определился из доменного имени сервера). В чем может быть причина?

    1. mnorin Автор записи

      Не могли бы вы уточнить, какая операционная система (название, версия), чтобы более детально посмотреть?
      Как один из вариантов — на машине ранее уже стояли соответствующие пакеты, их удалили, а настройки остались. И сейчас была повторная установка.

  4. Никита

    Хоть убейте, не могу понять. LDAP почему-то не видит заголовки, и принимает {SSHA}пароль как пароль в чистом виде «{SSHA}пароль». Что делать? :(

    1. mnorin Автор записи

      Для начала скопировать сюда то, что в терминале, чтобы понятно было, что значит «не видит заголовки».

      1. Никита

        Все в порядке, извините за глупый вопрос) Думал, что у меня шифрование не работает в LDAP, а оказывается просто при использовании LDAP для хранения пользователей и использования другим серивсом он передает пароли только в чистом виде)

  5. Дмитрий

    Спасибо большое за статью!!! Все коротко и ясно!!! Но хотелось бы продолжения!)

  6. Павел

    А если я хочу не com, а, например, net? Или loc, для эксперимента? Что мне делать тогда?

    1. Maxim Norin Автор записи

      Заменить com на net или loc, и делать всё то же самое

Обсуждение закрыто.