8.9 KiB
Конфигурация LDAP в системе EUSRR
Обзор
Система EUSRR поддерживает два режима работы:
- С интеграцией LDAP/Active Directory (по умолчанию)
- Без LDAP (автономный режим с аутентификацией через БД)
Переключение между режимами осуществляется через переменную окружения LDAP_ENABLED.
Режимы работы
Режим с LDAP (LDAP_ENABLED=true)
Аутентификация:
- Пользователи аутентифицируются через Active Directory/LDAP
- Пароли проверяются в LDAP, не хранятся в БД
- Автоматическая синхронизация профилей при входе
Создание пользователей:
- Пользователи создаются сначала в LDAP, затем в БД
- Устанавливается флаг
is_ldap_managed=True - DN и GUID пользователя сохраняются в
LdapSyncState
Обновление пользователей:
- Изменения применяются сначала к LDAP, затем к БД
- Поддерживается двусторонняя синхронизация (LWW - Last Writer Wins)
Бэкенды аутентификации (в порядке приоритета):
LDAP3Backend- основной LDAP-бэкендEmailOrPhoneBackend- пропускается (так как LDAP активен)SuperuserOnlyBackend- экстренный доступ для суперюзераPositionRoleBackend- расчёт правModelBackend- стандартный Django (как фоллбэк)
Требуемые настройки в .env:
LDAP_ENABLED=true
LDAP_URI=ldaps://dcii.robotail.local:636
LDAP_BIND_DN=corp@robotail.local
LDAP_BIND_PASSWORD=your_password
LDAP_USER_BASE="OU=company,DC=robotail,DC=local"
LDAP_USERS_BASE="OU=Users,OU=company,DC=robotail,DC=local"
LDAP_USER_UPN_SUFFIX=@robotail.local
LDAP_WRITE_ENABLED=true
Режим без LDAP (LDAP_ENABLED=false)
Аутентификация:
- Пользователи аутентифицируются через БД Django
- Пароли хешируются и хранятся в таблице
employees_employee - Используется стандартная система паролей Django
Создание пользователей:
- Пользователи создаются напрямую в БД
- Флаг
is_ldap_managed=False - Пароль устанавливается через
user.set_password()
Обновление пользователей:
- Все изменения применяются только к БД
- Синхронизация с LDAP не выполняется
Бэкенды аутентификации (в порядке приоритета):
LDAP3Backend- пропускает запрос (LDAP_ENABLED=false)EmailOrPhoneBackend- основной бэкенд в этом режимеSuperuserOnlyBackend- экстренный доступ для суперюзераPositionRoleBackend- расчёт правModelBackend- стандартный Django
Требуемые настройки в .env:
LDAP_ENABLED=false
Переключение между режимами
Включение LDAP
-
В
.envустановите:LDAP_ENABLED=true -
Настройте параметры подключения к LDAP (см. выше)
-
Перезапустите Django:
python manage.py runserver -
Важно: Существующие пользователи с
is_ldap_managed=Falseпродолжат работать через БД до тех пор, пока не будут мигрированы в LDAP
Отключение LDAP
-
В
.envустановите:LDAP_ENABLED=false -
Перезапустите Django
-
Важно: Пользователи с
is_ldap_managed=TrueНЕ СМОГУТ войти в систему, так как их пароли хранятся в LDAP. Для восстановления доступа необходимо:- Установить пароль вручную:
user.set_password('new_password') - Изменить флаг:
user.is_ldap_managed = False - Сохранить:
user.save()
- Установить пароль вручную:
Миграция пользователей
Из БД в LDAP
from employees.ldap.directory_service import DirectoryService
from employees.ldap.domain.dtos import DirectoryUserDTO
# Для каждого пользователя
dto = DirectoryUserDTO(
first_name=user.first_name,
last_name=user.last_name,
email=user.email,
phone_e164=user.phone_number,
initial_password="temporary_password",
is_active=user.is_active,
)
service = DirectoryService()
service.create_user(dto)
# Пользователь будет создан в LDAP и помечен как is_ldap_managed=True
Из LDAP в БД
# Для каждого LDAP-пользователя
user.set_password('new_password') # Устанавливаем пароль в БД
user.is_ldap_managed = False
user.save()
Проверка текущего режима
В коде Django:
from django.conf import settings
if settings.LDAP_ENABLED:
print("Режим: с LDAP")
else:
print("Режим: без LDAP")
В Django shell:
python manage.py shell
>>> from django.conf import settings
>>> settings.LDAP_ENABLED
True # или False
Рекомендации по безопасности
-
Для продакшена с LDAP:
- Используйте LDAPS (порт 636)
- Проверяйте сертификат CA
- Используйте отдельную сервисную учётку с минимальными правами
- Включите
LDAP_WRITE_ENABLEDтолько если нужна запись в LDAP
-
Для продакшена без LDAP:
- Настройте строгие требования к паролям в Django
- Включите двухфакторную аутентификацию
- Регулярно аудитируйте доступы
- Используйте
PASSWORD_HASHERSс современными алгоритмами
-
Для разработки:
- Можно отключить LDAP для упрощения разработки
- Создавайте тестовых пользователей напрямую в БД
- Не храните реальные LDAP-креды в репозитории
Поддерживаемые операции
| Операция | С LDAP | Без LDAP |
|---|---|---|
| Создание пользователя | LDAP → БД | БД |
| Аутентификация | LDAP | БД (Django) |
| Обновление профиля | LDAP → БД | БД |
| Смена пароля | LDAP | БД |
| Удаление пользователя | LDAP → БД | БД |
| Синхронизация групп | Да | Нет |
| Синхронизация отделов | Да | Нет |
Устранение неполадок
Ошибка: "LDAP_BASE_DN must be set"
Причина: Не настроены переменные LDAP в settings.py или .env
Решение:
- Проверьте наличие в
.env:LDAP_USERS_BASE="OU=Users,OU=company,DC=robotail,DC=local" - Или отключите LDAP:
LDAP_ENABLED=false
Ошибка: "LDAP create failed: ..."
Причина: Проблема подключения или прав в LDAP
Решение:
- Проверьте сетевое подключение к LDAP-серверу
- Проверьте права сервисной учётки
- Временно отключите LDAP для продолжения работы
Пользователи не могут войти после отключения LDAP
Причина: У пользователей установлен is_ldap_managed=True, но LDAP недоступен
Решение:
# В Django shell
from employees.models import Employee
# Для конкретного пользователя
user = Employee.objects.get(email='user@example.com')
user.set_password('new_password')
user.is_ldap_managed = False
user.save()
# Или массово
Employee.objects.filter(is_ldap_managed=True).update(is_ldap_managed=False)
# Затем установить пароли вручную каждому
Контакты
При возникновении проблем с интеграцией LDAP обращайтесь к системному администратору.