Страницы

Сохранить статью у себя в соцсети:

понедельник, 1 апреля 2013 г.

§ OpenLDAP: Quick start.

OpenLDAP: Введение.

ldap
В ходе работы над одной из задач мне пришлось столкнуться с 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-файл может содержать записи только одного типа, то есть только представление записей каталога или только представление изменений записей каталога.

Как работать со всем этим??
Сначала устанавливаем OpenLDAP. В моем случае установка выполняется в Gentoo Linux, в любом другом дистрибутиве установка лишь отличается командой пакетного менеджера и не несет в себе каких-либо трудностей.
# cave resolve openldap -x

Пока идет установка, есть время придумать простейшую схему. Столкнувшись с LDAP первый раз, после установки, мне было непонятно что делать дальше. А дальше все просто: нужно придумать структуру каталога и реализовать ее через загрузку LDIF файла. 

Представим такую тестовую структуру: Есть компания (или домен) steals-pixota.org, в компании есть команда (team), команда состоит из двух подразделений в которой есть как минимум по одному человеку. Для начала этого достаточно.

Теперь осталось описать эту структуру в LDIF. Структура описывается объектами, каждый из которых обладает уникальным именем, обладает атрибутами и объектными классами. Открываем текстовый редактор и начинаем описывать схему (приведенный вариант структуры содержит стандартные атрибуты и может легко адаптироваться под любые нужды):
# vi init.ldif
dn: 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"

Комментариев нет:

Отправить комментарий

Популярные сообщения

Профиль в Google+ Яндекс цитирования Яндекс.Метрика