dc=example и dc=com.ou=sale, dc=example, dc=com может представлять отдел продаж в домене example.com. Обратите внимание: организационные единицы могут быть вложенными друг в друга. Например, ou=Developers,ou=IT,ou=Staff.cn=John Doe, ou=marketing, dc=example, dc=com общее имя — это cn=John Doe.cn=John Smith,ou=Developers,ou=IT,dc=example,dc=com. Порядок компонентов в полном пути имеет значение. Ещё важно знать, что DN всегда уникален в рамках дерева — такой полный путь один на всю директорию.dc=example эквивалентно DC=example.
Список атрибутов, которые используют чаще всего:JAVA
Идентификация
uid: уникальный идентификатор
cn: общее имя
sn: фамилия
givenName: имя
displayName: отображаемое имя
Контактная информация:
mail: email адрес
telephoneNumber: телефон
mobile: мобильный телефон
postalAddress: почтовый адрес
Организационная информация:
title: должность
manager: DN руководителя
departmentNumber: номер отдела
employeeNumber: табельный номер
employeeType: тип сотрудника JAVA
Например, основные объектные классы:
person:
- обязательные: cn, sn
- опциональные: userPassword, telephoneNumber, seeAlso, description
organizationalPerson (наследует person):
+ title, street, postalCode, postOfficeBox
inetOrgPerson (наследует organizationalPerson):
+ mail, givenName, uid, manager, departmentNumber
groupOfNames:
- обязательные: cn, member
- опциональные: description, owner
organization:
- обязательные: o
- опциональные: description, postalAddress, telephoneNumber example.com:cn, ou и dc.PYTHON
# python-ldap
import ldap
conn = ldap.initialize('ldap://localhost:389')
conn.simple_bind_s('cn=admin,dc=example,dc=com', 'admin_password')
# Поиск пользователей
base_dn = 'ou=people,dc=example,dc=com'
search_filter = '(objectClass=person)'
results = conn.search_s(base_dn, ldap.SCOPE_SUBTREE, search_filter)
# Данные для добавления
user_dn = 'uid=newuser,ou=People,dc=example,dc=com'
user_attrs = {
'objectClass': [b'inetOrgPerson'],
'uid': [b'newuser'],
'cn': [b'New User'],
'sn': [b'User'],
'mail': [b'newuser@example.com']
}
# Добавление записи
l.add_s(user_dn, ldap.modlist.addModlist(user_attrs))
-----
Аутентификация пользователя, как если бы это бэкенд для нашего самописного SSO
try:
# Пытаемся аутентифицироваться
conn.simple_bind_s('uid=john,ou=People,dc=example,dc=com', 'password123')
print("Успешная аутентификация")
except ldap.INVALID_CREDENTIALS:
print("Неверные учётные данные")
JAVA
# Чистый LDAP
dn: uid=john,ou=People,dc=example,dc=com
# Active Directory
dn: CN=John Smith,OU=Users,DC=company,DC=com
# Чистый LDAP
dn: uid=john,ou=People,dc=example,dc=com
# Active Directory
dn: CN=John Smith,OU=Users,DC=company,DC=com JSX
# AD-специфичные атрибуты
sAMAccountName: jsmith
userPrincipalName: john.smith@company.com
memberOf: CN=Sales,OU=Groups,DC=company,DC=com
userAccountControl: 512 Способы аутентификации, которые используются в LDAP
JSX
import ldap
# Подключение к AD через LDAP
conn = ldap.initialize('ldap://dc.company.com')
conn.set_option(ldap.OPT_REFERRALS, 0)
conn.simple_bind_s(
'CN=John Smith,OU=Users,DC=company,DC=com',
'password'
)
# Поиск пользователя
result = conn.search_s(
'DC=company,DC=com',
ldap.SCOPE_SUBTREE,
'(&(objectClass=user)(sAMAccountName=jsmith))'
) JSX
dn: uid=john,ou=People,dc=example,dc=com
userPassword: {SSHA}DkMTwBl+a/3DQTxCYEApdUtNXGgdUac3 {SSHA} — Salted SHA.{SHA} — SHA-1.{MD5} — MD5 (устаревший и небезопасный вариант).{CRYPT} — Unix crypt.{BCRYPT} — BCrypt.JSX
# Типичные права доступа
ls -l /var/lib/ldap/
-rw------- 1 ldap ldap data.mdb
-rw------- 1 ldap ldap lock.mdb | IAM 1 | Ваша IAM |
|---|---|
| Обычный сотрудник | Обычный пользователь |
| Привилегированный сотрудник | Обычный пользователь |
| Линейный руководитель | Обычный пользователь |
| Руководитель | Администратор |
| IAM 2 | Ваша IAM |
|---|---|
| Первая группа | Обычный пользователь |
| Бухгалтерия | Не имеет доступа к приложению |
| Поддержка | Обычный пользователь |