Статьи

Основные понятия OpenLDAP

LDAP

  • LDAP — это просто тип базы данных, специально предназначенной для поиска. Чтение происходит быстро, а запись поддерживается, но относительно медленно. Вот почему LDAP обычно используется для хранения централизованных учетных записей пользователей.
  • В LDAP данные хранятся узлами (очень похоже на запись в реляционной БД). Каждый узел имеет несколько именованных атрибутов. Например, узел, представляющий пользователя, может иметь следующие атрибуты (cn обозначает «общее имя», тогда как sn обозначает «фамилия»):

1
2
3
4
cn: Kent Tong
sn: Tong
givenName: Kent
email: kent@ttdev.com
  • Как и запись в БД или объект в Java, атрибуты, которые может иметь узел, являются фиксированными. Это указывается атрибутом с именем objectClass. Например, существует объектный класс с именем «person», который говорит, что он может иметь cn, sn и email, а затем узел, принадлежащий этому классу «person», который может иметь такие атрибуты:
1
2
3
4
cn: Kent Tong
sn: Tong
email: kent@ttdev.com
objectClass: person
  • Узел может принадлежать нескольким классам объектов. Например, может существовать объектный класс с именем «securityObject», который говорит, что он может иметь атрибут пароля, а затем, если вам нужно ввести пароль в узел, вы можете сделать это следующим образом:
1
2
3
4
5
6
cn: Kent Tong
sn: Tong
email: kent@ttdev.com
objectClass: person
objectClass: securityObject
password: abc123
  • Как использовать узел, чтобы представить отдел или компанию? Это делается с помощью objectClass «organizUnit» («ou» означает «организационная единица»):
1
2
3
4
5
ou: Foo Ltd.
objectClass: organizationalUnit
 
ou: Finance dept
objectClass: organizationalUnit
  • В отличие от относительной БД, где такие отношения представлены внешними ключами, в LDAP один узел может быть размещен под другим как дочерний узел. Например, давайте поместим личный узел в качестве дочернего узла финансового отдела, который является дочерним узлом корпоративного узла:
01
02
03
04
05
06
07
08
09
10
11
12
13
dn: ou=Foo Ltd.
ou: Foo Ltd.
objectClass: organizationalUnit
 
dn: ou=Finance dept,ou=Foo Ltd.
ou: Finance dept
objectClass: organizationalUnit
 
dn: cn=Kent Tong,ou=Finance dept,ou=Foo Ltd.
cn: Kent Tong
sn: Tong
email: kent@ttdev.com
objectClass: person
  • Это родительско-дочернее отношение представлено атрибутом dn (отличительное имя, как полный путь к файлу). То есть вы можете определить dn родительского узла из dn этого узла.
  • Обычно вы добавляете cn к dn родителя, чтобы получить dn самого узла. Однако вам не нужно использовать cn. Вы можете использовать любой атрибут для этой цели (так называемый «относительный dn»), если он уникален среди братьев и сестер. Например, cn хорошо, если нет двух человек с одинаковыми значениями cn в отделе. Это так, что при наличии dn очень быстро найти узел.
  • Когда вы создаете верхний узел каталога, вам нужно указать его dn. Обычно вы используете DNS-имя вашей компании (скажем, это foo.com):
01
02
03
04
05
06
07
08
09
10
11
12
13
dn:dc=foo,dc=com
ou: Foo Ltd.
objectClass: organizationalUnit
 
dn: ou=Finance dept,dc=foo,dc=com
ou: Finance dept
objectClass: organizationalUnit
 
dn: cn=Kent Tong,ou=Finance dept,dc=foo,dc=com
cn: Kent Tong
sn: Tong
email: kent@ttdev.com
objectClass: person
  • в котором dc означает «компонент домена», просто метка в имени домена.
  • Некоторые классы объектов, такие как person или organizUnit, предназначены для использования в качестве «основного» класса объектов для узлов, в то время как некоторые другие классы объектов, такие как securityObject (официально он называется «simpleSecurityObject»), предназначены для «вспомогательных» и быть добавленным к узлам. Первый называется «структурным классом объектов», а второй — «классом вспомогательных объектов».
  • Для каждого узла он должен иметь ровно один класс структурных объектов . Он может иметь ноль или несколько классов вспомогательных объектов.

схема

  • Атрибуты и классы объектов определяются вместо жестко заданных. Для OpenLDAP в Debian вы можете найти схемы в / etc / ldap / schema. Например, вы можете найти следующий класс объектов в core.schema:
1
2
3
4
5
objectclass ( 2.5.6.6 NAME 'person'
        DESC 'RFC2256: a person'
        SUP top STRUCTURAL
        MUST ( sn $ cn )
        MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )
  • Он говорит, что он должен иметь атрибуты «sn» и «cn» и может иметь атрибут «userPassword» и т. Д. Он говорит, что его суперкласс — это «top», который является встроенным классом объектов, представляющим класс объектов самого верхнего уровня. , В нем также говорится, что объектный класс person является структурным классом.
  • Вы можете найти наиболее часто используемые классы объектов и атрибуты здесь .

Аутентификация с помощью LDAP

  • Простой способ — извлечь узел по имени пользователя, получить пароль и сравнить его с паролем, введенным пользователем.
  • Однако это позволяет извлекать конфиденциальную информацию (пароль) любого пользователя по сети службами. Поэтому существует другой способ: вы отправляете dn и пароль службе LDAP и позволяете ей выполнить проверку. Это называется «привязка» к этому дн. По сути, вы входите в систему как отдельный узел.
  • Оба метода выше передают пароль в открытом виде. Таким образом, вы, вероятно, должны использовать TLS при доступе к службе LDAP (используя ldaps: //)
  • Вышеуказанные методы чаще всего используются другими службами, такими как почта, Samba или Apache, для проверки паролей пользователей.
  • При выполнении администрирования с OpenLDAP вы можете использовать описанный выше подход «связывание», чтобы войти в систему как узел, представляющий администратора. Это называется «простая аутентификация»:
1
# ldapsearch -x -W -D cn=admin,dc=foo,dc=com ...
  • Однако иногда удобнее проходить проверку подлинности не как узел в каталоге, а как администратор. Например, если ваш сайт использует Kerberos, вы можете выполнить единый вход в OpenLDAP. Это сделано с его поддержкой SASL. SASL, в свою очередь, поддерживает множество механизмов, таких как PLAIN (простой текст), GSSAPI (Kerberos), EXTERNAL (с использованием транспорта, такого как сертификат клиента с TLS). Когда SASL аутентифицируется, OpenLDAP составит dn для представления вашей личности. Например, для пользователя Kent в домене Kerberos foo.com составленный dn будет иметь вид uid = kent, cn = foo.com, cn = gssapi, cn = auth. Это необходимо для предоставления разрешений.

Настройка и запуск OpenLDAP в Debian

  • При настройке OpenLDAP в Debian вам необходимо перенастроить пакет так, чтобы он создавал для вас начальный каталог, а также узел, представляющий администратора:
1
# dpkg-reconfigure -p low openldap
  • Затем, чтобы проверить, работает ли он, вы можете использовать механизм SASL EXTERNAL и использовать сокет домена Unix (ldapi: ///) в качестве пользователя root для подключения к нему:
1
# ldapsearch -b cn=config -H ldapi:/// -Y external

запрос

  • Как и в случае с базой данных отношений, вы можете выполнять запросы для извлечения узлов и их атрибутов.
1
# ldapsearch -b dc=foo,dc=com -H ldapi:/// -Y external 'cn=Kent Tong'
  • Вы можете попытаться найти все узлы, у которых objectClass равен ‘person’, а cn содержит слово ‘Kent’:
1
# ldapsearch -b dc=foo,dc=com ... "(&(objectClass=person)(cn=*Kent*))"
  • Вы можете сказать ему, чтобы получить только определенные атрибуты:
1
# ldapsearch -b dc=foo,dc=com ... "(&(objectClass=person)(cn=*Kent*))" dn sn

Обновление данных

  • Чтобы добавить новый узел, убедитесь, что родительский элемент уже существует, затем укажите dn и другие атрибуты в текстовом файле (называемом файлом LDIF) и пометьте его как запрос на добавление:
1
2
3
4
5
6
dn: cn=Paul Chan,ou=Finance dept,dc=foo,dc=com
changetype: add
cn: Paul Chan
sn: Chan
email: paul@ttdev.com
objectClass: person
  • Затем введите файл LDIF для ldapmodify:
1
# ldapmodify < myfile.ldif
  • Чтобы изменить (добавить, изменить или удалить) атрибуты существующего узла, сначала укажите узел, а затем перечислите каждое изменение атрибута и разделите их строкой, содержащей один дефис. Наконец, завершите узел пустой строкой:
1
2
3
4
5
6
7
8
9
dn: cn=Kent Tong,ou=Finance dept,dc=foo,dc=com
changetype: modify
add: givenName
givenName: Kent
-
replace: email
email: kent@foo.com
-
delete: phoneNumber
  • Чтобы удалить узел:
1
2
dn: cn=Paul Chan,ou=Finance dept,dc=foo,dc=com
changetype: delete

Ссылка: Основные понятия OpenLDAP от нашего партнера JCG Кента Тонга из личных рассуждений Кента Тонга о блоге по информационным технологиям .