Что такое LDAP?
LDAP (Lightweight Directory Access Protocol) — это протокол для доступа к службам каталогов, который обеспечивает централизованное хранение и управление информацией о пользователях, группах, компьютерах и других ресурсах в сетевой среде. LDAP широко используется для аутентификации и авторизации в корпоративных системах.
Основные возможности LDAP
- Централизованное управление — единый каталог пользователей и ресурсов
- Иерархическая структура — древовидная организация данных (DIT)
- Стандартизация — открытый стандарт с широкой поддержкой
- Масштабируемость — поддержка репликации и кластеризации
- Безопасность — поддержка SSL/TLS и различных методов аутентификации
- Гибкость — настраиваемые схемы данных
Когда использовать LDAP
LDAP идеально подходит для:
- Централизованной аутентификации в корпоративной среде
- Управления пользователями и группами в организации
- Интеграции различных систем с единым каталогом
- Хранения конфигурационной информации
- Создания адресных книг и справочников
Установка OpenLDAP
Установка на Ubuntu/Debian:
Установка через Docker:
1# Запуск OpenLDAP в Docker
2docker run -d \
3 --name openldap \
4 -p 389:1389 \
5 -p 636:1636 \
6 -e LDAP_ORGANISATION="My Company" \
7 -e LDAP_DOMAIN="company.com" \
8 -e LDAP_ADMIN_PASSWORD="admin" \
9 -e LDAP_CONFIG_PASSWORD="config" \
10 -e LDAP_TLS_VERIFY_CLIENT="never" \
11 osixia/openldap:latest
Docker Compose конфигурация
1version: '3.8'
2services:
3 openldap:
4 image: osixia/openldap:latest
5 container_name: openldap
6 environment:
7 LDAP_ORGANISATION: "My Company"
8 LDAP_DOMAIN: "company.com"
9 LDAP_ADMIN_PASSWORD: "admin"
10 LDAP_CONFIG_PASSWORD: "config"
11 LDAP_BASE_DN: "dc=company,dc=com"
12 LDAP_TLS_VERIFY_CLIENT: "never"
13 ports:
14 - "389:389"
15 - "636:636"
16 volumes:
17 - ldap_data:/var/lib/ldap
18 - ldap_config:/etc/ldap/slapd.d
19 restart: unless-stopped
20
21 phpldapadmin:
22 image: osixia/phpldapadmin:latest
23 container_name: phpldapadmin
24 environment:
25 PHPLDAPADMIN_LDAP_HOSTS: openldap
26 PHPLDAPADMIN_HTTPS: "false"
27 ports:
28 - "8080:80"
29 depends_on:
30 - openldap
31 restart: unless-stopped
32
33volumes:
34 ldap_data:
35 ldap_config:
Базовая структура LDAP
Пример создания организационной структуры:
1# base.ldif
2dn: ou=users,dc=company,dc=com
3objectClass: organizationalUnit
4ou: users
5
6dn: ou=groups,dc=company,dc=com
7objectClass: organizationalUnit
8ou: groups
9
10dn: cn=developers,ou=groups,dc=company,dc=com
11objectClass: groupOfNames
12cn: developers
13member: cn=john.doe,ou=users,dc=company,dc=com
14
15dn: cn=john.doe,ou=users,dc=company,dc=com
16objectClass: inetOrgPerson
17cn: john.doe
18sn: Doe
19givenName: John
20mail: john.doe@company.com
21uid: john.doe
22userPassword: {SSHA}hashed-password
Добавление записей в LDAP:
Работа с LDAP через командную строку
1# Поиск всех пользователей
2ldapsearch -x -H ldap://localhost:389 \
3 -D "cn=admin,dc=company,dc=com" -W \
4 -b "ou=users,dc=company,dc=com" \
5 "(objectClass=inetOrgPerson)"
6
7# Поиск конкретного пользователя
8ldapsearch -x -H ldap://localhost:389 \
9 -D "cn=admin,dc=company,dc=com" -W \
10 -b "dc=company,dc=com" \
11 "(uid=john.doe)"
12
13# Изменение пароля пользователя
14ldappasswd -x -H ldap://localhost:389 \
15 -D "cn=admin,dc=company,dc=com" -W \
16 "cn=john.doe,ou=users,dc=company,dc=com" -S
17
18# Удаление записи
19ldapdelete -x -H ldap://localhost:389 \
20 -D "cn=admin,dc=company,dc=com" -W \
21 "cn=john.doe,ou=users,dc=company,dc=com"
Интеграция с Python
Установка библиотеки:
Пример работы с LDAP:
1from ldap3 import Server, Connection, ALL, SUBTREE
2
3# Подключение к LDAP серверу
4server = Server('localhost', port=389, get_info=ALL)
5conn = Connection(
6 server,
7 user='cn=admin,dc=company,dc=com',
8 password='admin',
9 auto_bind=True
10)
11
12# Поиск пользователей
13conn.search(
14 search_base='ou=users,dc=company,dc=com',
15 search_filter='(objectClass=inetOrgPerson)',
16 search_scope=SUBTREE,
17 attributes=['cn', 'mail', 'uid']
18)
19
20for entry in conn.entries:
21 print(f"User: {entry.cn}, Email: {entry.mail}")
22
23# Аутентификация пользователя
24def authenticate_user(username, password):
25 user_dn = f"cn={username},ou=users,dc=company,dc=com"
26 try:
27 user_conn = Connection(server, user=user_dn, password=password)
28 return user_conn.bind()
29 except:
30 return False
31
32# Добавление нового пользователя
33user_dn = 'cn=jane.smith,ou=users,dc=company,dc=com'
34user_attrs = {
35 'objectClass': ['inetOrgPerson'],
36 'cn': 'jane.smith',
37 'sn': 'Smith',
38 'givenName': 'Jane',
39 'mail': 'jane.smith@company.com',
40 'uid': 'jane.smith',
41 'userPassword': 'password123'
42}
43
44conn.add(user_dn, attributes=user_attrs)
45
46conn.unbind()
Интеграция с Django
Настройка в settings.py:
1# settings.py
2import ldap
3from django_auth_ldap.config import LDAPSearch, GroupOfNamesType
4
5AUTHENTICATION_BACKENDS = [
6 'django_auth_ldap.backend.LDAPBackend',
7 'django.contrib.auth.backends.ModelBackend',
8]
9
10AUTH_LDAP_SERVER_URI = "ldap://localhost:389"
11AUTH_LDAP_BIND_DN = "cn=admin,dc=company,dc=com"
12AUTH_LDAP_BIND_PASSWORD = "admin"
13
14AUTH_LDAP_USER_SEARCH = LDAPSearch(
15 "ou=users,dc=company,dc=com",
16 ldap.SCOPE_SUBTREE,
17 "(uid=%(user)s)"
18)
19
20AUTH_LDAP_USER_ATTR_MAP = {
21 "first_name": "givenName",
22 "last_name": "sn",
23 "email": "mail"
24}
25
26AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
27 "ou=groups,dc=company,dc=com",
28 ldap.SCOPE_SUBTREE,
29 "(objectClass=groupOfNames)"
30)
31
32AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
33AUTH_LDAP_REQUIRE_GROUP = None
34AUTH_LDAP_DENY_GROUP = None
35
36AUTH_LDAP_USER_FLAGS_BY_GROUP = {
37 "is_active": "cn=active,ou=groups,dc=company,dc=com",
38 "is_staff": "cn=staff,ou=groups,dc=company,dc=com",
39 "is_superuser": "cn=superuser,ou=groups,dc=company,dc=com"
40}
Настройка репликации
Конфигурация master-slave репликации:
1# syncprov.ldif для master сервера
2dn: cn=module,cn=config
3objectClass: olcModuleList
4cn: module
5olcModulePath: /usr/lib/ldap
6olcModuleLoad: syncprov.la
7
8dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
9objectClass: olcOverlayConfig
10objectClass: olcSyncProvConfig
11olcOverlay: syncprov
Мониторинг LDAP
1# Проверка статуса сервера
2ldapsearch -x -H ldap://localhost:389 -s base -b "" \
3 "(objectclass=*)" namingContexts
4
5# Мониторинг производительности
6ldapsearch -x -H ldap://localhost:389 \
7 -D "cn=admin,dc=company,dc=com" -W \
8 -b "cn=monitor" \
9 "(objectclass=*)"
10
11# Проверка подключений
12netstat -an | grep :389
Безопасность LDAP
Настройка SSL/TLS:
Best Practices
- Используй SSL/TLS для защиты передачи данных
- Настраивай правильные ACL (Access Control Lists)
- Регулярно создавай резервные копии каталога
- Мониторь производительность и размер базы данных
- Используй репликацию для высокой доступности
FAQ
Подходит ли LDAP для продакшена?
Да, LDAP является стандартом для корпоративных каталогов и широко используется в production средах. OpenLDAP и Microsoft Active Directory основаны на LDAP протоколе.
Какие требования к инфраструктуре?
Минимальные требования: 1 ГБ RAM, 1 CPU core, 10 ГБ дискового пространства. Для production рекомендуется репликация и мониторинг.
В чем разница между LDAP и Active Directory?
Active Directory — это реализация LDAP от Microsoft с дополнительными функциями для Windows сред. OpenLDAP — это open source реализация LDAP стандарта.