OpenLDAP: Введение.
В ходе работы над одной из задач мне пришлось столкнуться с OpenLDAP. До этого момента я не сталкивался с LDAP вообще. В ходе чтения документации и освоения утилит OpenLDAP, появился небольшой список команд. А из этого списка появилась и статья, в которой вкратце описывается что такое LDAP и как начать с ним работать.
LDAP (Lightweight Directory Access Protocol) - протокол прикладного уровня для доступа к службе каталог X.500. Это относительно простой протокол, использующий TCP/IP и позволяющий проводить операции аутентификации, поиска, сравнения, добавления, изменения и удаления записей в каталоге. Здесь мы будем рассматривать OpenLDAP который состоит из трёх главных компонентов:
- slapd — независимый демон LDAP который организует и поддерживает каталог;
- библиотеки, реализующие протокол LDAP;
- утилиты, инструменты и вспомогательные клиенты.
Всякая запись в каталоге обладает уникальным именем (dn - distinguished name). Уникальное имя состоит из одного или нескольких относительных уникальных имен (rdn - relative distinguished name) разделенных запятой. Относительное уникальное имя имеет вид ИмяАтрибута=Значение. Таким образом, простым примером уникального имени может быть следующая запись:
uid=ivanov,cn=accounts,ou=people,dc=thislinux,dc=org
В данном примере, уникальное имя (dn) состоит из 5 относительных имен (rdn) разделенных запятой, в который левая часть (от знака =) это имя атрибута, правая - значение атрибута.
В силу такой структуры, каталог LDAP легко представить в виде дерева.
Помимо записей, структура LDAP предполагает наличие схем (schema). В схемах объединены объектные классы (object class) которые описывают атрибуты. Таким образом запись может состоять только из тех атрибутов, которые описаны в объектных классах схемы. Каждый атрибут может хранить несколько значений. Схема также определяет какие атрибуты обязательные для класса, а какие - необязательные.
Также следует упомянуть про LDIF (LDAP Data Interchange Format). LDIF это формат представления записей в каталоге или их изменений в текстовой форме. Записи каталога или их изменения представляются набором LDIF-записей, по одной на каждую запись каталога или изменение. LDIF-файл может содержать записи только одного типа, то есть только представление записей каталога или только представление изменений записей каталога.
Также следует упомянуть про LDIF (LDAP Data Interchange Format). LDIF это формат представления записей в каталоге или их изменений в текстовой форме. Записи каталога или их изменения представляются набором LDIF-записей, по одной на каждую запись каталога или изменение. LDIF-файл может содержать записи только одного типа, то есть только представление записей каталога или только представление изменений записей каталога.
Как работать со всем этим??
Сначала устанавливаем OpenLDAP. В моем случае установка выполняется в Gentoo Linux, в любом другом дистрибутиве установка лишь отличается командой пакетного менеджера и не несет в себе каких-либо трудностей.
# cave resolve openldap -xПока идет установка, есть время придумать простейшую схему. Столкнувшись с LDAP первый раз, после установки, мне было непонятно что делать дальше. А дальше все просто: нужно придумать структуру каталога и реализовать ее через загрузку LDIF файла.
Представим такую тестовую структуру: Есть компания (или домен) steals-pixota.org, в компании есть команда (team), команда состоит из двух подразделений в которой есть как минимум по одному человеку. Для начала этого достаточно.
Теперь осталось описать эту структуру в LDIF. Структура описывается объектами, каждый из которых обладает уникальным именем, обладает атрибутами и объектными классами. Открываем текстовый редактор и начинаем описывать схему (приведенный вариант структуры содержит стандартные атрибуты и может легко адаптироваться под любые нужды):
# vi init.ldifdn: dc=steals-pixota,dc=org
description: Freeraid Trash-Ugar-Xardkor Banda
objectClass: organization
objectClass: dcObject
dc: steals-pixota
o: Pixota, Inc.
dn: ou=team,dc=steals-pixota,dc=org
description: Our people
objectClass: organizationalUnit
ou: team
dn: ou=riders,ou=team,dc=steals-pixota,dc=org
description: Forest Riders
objectClass: organizationalUnit
ou: riders
dn: ou=carvers,ou=team,dc=steals-pixota,dc=org
description: Carving masters
objectClass: organizationalUnit
ou: carvers
dn: sn=ivanov,ou=riders,ou=team,dc=steals-pixota,dc=org
cn: Ivan Ivanov
givenName: Ivan
sn: Ivanov
mail: ivanov@steals-pixota.org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
dn: sn=petrov,ou=carvers,ou=team,dc=steals-pixota,dc=org
cn: Petr Petrov
givenName: Petr
sn: Petrov
mail: petrov@steals-pixota.org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
Вот, таким образом мы описали нашу небольшую структуру и описали входящих в нее людей.
OpenLDAP тем временем установился, переходим к его настройке и запуску. Сначала нам следует сгенерировать пароль который будет использоваться в административных целях:
# slappasswd New password:
Re-enter new password:
{SSHA}WSK7LBu93vuZtg6FYii0hft4FkdlNV5v
Полученную строку с хэшем сохраняем, она нам понадобится чуть позже. Теперь открываем файл конфигурации slapd.conf. Добавляем в него несколько полезных схем с описанием объектных классов и определяем параметры нашего каталога (suffix, rootdn, rootpw, directory). В качестве rootpw указываем сгенерированный хэш.
# vi /etc/openldap/slapd.conf
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/openldap.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
database hdb
suffix "dc=steals-pixota,dc=org"
checkpoint 32 30
rootdn "cn=Manager,dc=steals-pixota,dc=org"
rootpw {SSHA}WSK7LBu93vuZtg6FYii0hft4FkdlNV5v
directory /var/lib/openldap-data/steals-pixota.org/
index objectClass eq
После чего создаем каталог для нашего LDAP каталога и запускаем slapd
# mkdir /var/lib/openldap-data/steals-pixota.org/
# chown ldap: /var/lib/openldap-data/steals-pixota.org/
# chmod 700 /var/lib/openldap-data/steals-pixota.org/
# /etc/init.d/slapd start
Теперь нам нужно определить настройки для клиента LDAP. Настройка сводится к указанию базового уникального имени в котором будет выполняться поиск (BASE) и как минимум один идентификатор ресурса (URI) к которому нужно выполнять подключение.
# vi /etc/openldap/ldap.conf
BASE dc=steals-pixota,dc=org
URI ldap://ldap.steals-pixota.org ldap://localhost
Теперь все готово. Можно выполнить первую команду для проверки подключения. Вывод команды говорит о том что каталог у нас пустой.
# ldapsearch -x
# extended LDIF
#
# LDAPv3
# base <dc=steals-pixota,dc=org> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# search result
search: 2
result: 32 No such object
# numResponses: 1
Настало время импортировать в каталог нашу структуру. В качестве источника указываем файл с сохраненной структурой (у меня это init.ldif)
# ldapadd -x -W -D "cn=Manager,dc=steals-pixota,dc=org" -f init.ldif
Enter LDAP Password:
adding new entry "dc=steals-pixota,dc=org"
adding new entry "ou=team,dc=steals-pixota,dc=org"
adding new entry "ou=riders,ou=team,dc=steals-pixota,dc=org"
adding new entry "ou=carvers,ou=team,dc=steals-pixota,dc=org"
adding new entry "sn=ivanov,ou=riders,ou=team,dc=steals-pixota,dc=org"
adding new entry "sn=petrov,ou=carvers,ou=team,dc=steals-pixota,dc=org"
Вот и все, структура создана.
Основы работы со структурой. Для работы с каталогом существует несколько утилит: ldapmodify, ldapadd, ldapdelete, ldapsearch. Для подключения и выполнения задач в каталоге, в большинстве случаев, необходимо использовать то уникальное имя которое определено в slapd.conf (rootdn).
Добавление новой записи. Одним из простых способов добавления записи, является создание нового LDIF файла с описанием записи и ее последующий импорт в каталог.
# vi new-rider.ldif
dn: sn=sidorov,ou=riders,ou=team,dc=steals-pixota,dc=org
cn: Sid Sidorov
givenName: Sid
sn: Sidorov
mail: sidorov@steals-pixota.org
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
# ldapadd -x -W -D "cn=Manager,dc=steals-pixota,dc=org" -f new-rider.ldif
Enter LDAP Password:
adding new entry "sn=sidorov,ou=riders,ou=team,dc=steals-pixota,dc=org"
Модификация записи подразумевает добавление, изменение или удаление значений атрибутов записи. Операцию также можно выполнить через составление LDIF файла и его импорт в каталог. Ниже пример файла в котором мы добавляем новый атрибут, изменяем существующий и удаляем один из атрибутов. Пример охватывает три варианта модификации, хотя при необходимости можно выполнить лишь одно действие над записью.
# vi mod-carver.ldif
dn: sn=petrov,ou=carvers,ou=team,dc=steals-pixota,dc=org
changetype: modify
add: telephoneNumber
telephoneNumber: +79021759286
-
replace: mail
mail: petrov@vodk.in
-
delete: givenName
# ldapadd -x -W -D "cn=Manager,dc=steals-pixota,dc=org" -f mod-carver.ldif
Enter LDAP Password:
modifying entry "sn=petrov,ou=carvers,ou=team,dc=steals-pixota,dc=org"
Удаление записи выполняется командой ldapdelete, для успешного удаления команде нужно передать уникальное имя (dn) записи. Например удалим запись "sn=sidorov,ou=riders,ou=team,dc=steals-pixota,dc=org"
# ldapdelete -x -W -D "cn=Manager,dc=steals-pixota,dc=org" "sn=sidorov,ou=riders,ou=team,dc=steals-pixota,dc=org"
Поиск записей осуществляется через ldapsearch. Ниже несколько примеров поиска (-LLL используется для исключения некоторой информации из вывода, убираются коментарии, номер версии LDAP):
Вывести всю схему каталога
# ldapsearch -x -LLL
Выполнить поиск в конкретной "ветке" каталога
# ldapsearch -x -LLL -b "ou=carvers,ou=team,dc=steals-pixota,dc=org"
Искать записи c атрибутом sn=ivanov в конкретной ветке
# ldapsearch -x -LLL -b "ou=riders,ou=team,dc=steals-pixota,dc=org" "sn=ivanov"
Для тех кто дочитал до конца,.. для редактирования записей есть отличная консольная утилита ldapvi, устанавливается отдельным пакетом и предоставляет удобную возможность редактирования записей в формате текстового редактора (ldapvi -I -D "cn=Manager,dc=steals-pixota,dc=org").
Вот такое вот введение в OpenLDAP. В следующих статьях будет рассказано как построить систему хранения пользовательских аккаунтов и ssh ключей в LDAP и выполнение авторизации на серверах с помощью LDAP.
На главную "Virtualizing Linux"
Комментариев нет:
Отправить комментарий