MNorin.com
Блог про Linux, Bash и другие информационные технологии
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 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». Для этого выполним команду
Введем данные для нашего домена. У нас это будет «mydomain.com». Нажимаем OK.
Вводим название организации «mydomain». Нажимаем OK.
Вводим пароль администратора LDAP-сервера. Пароль желательно вводить сложный, это как-никак пароль администратора. Нажимаем ОК.
Повторяем пароль, нажимаем OK
Выбираем «HDB» для типа сервера, нажимаем ОК.
На вопрос удалять ли базу данных при вычистке slapd отвечаем утвердительно
На вопрос о перемещении старой базы данных также отвечаем утвердительно
На предложение включить старый протокол LDAPv2 отвечаем No/Нет
На этом первоначальная настройка завершена. Если сервис не стартовал, запускаем его вручную командой
Проверим, есть ли данные в базе:
# 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 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 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: 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: 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 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 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
И задать для этой записи пароль. Эти две записи будут существовать в одно и то же время, поэтому вам нужно заранее подумать о том, какое поле вы будете использовать для аутентификации.