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 Кента Тонга из личных рассуждений Кента Тонга о блоге по информационным технологиям .