В корпоративном сегменте часто используют Windows Active Directory. В Active Directory имеются учетные данные пользователей (логин, пароль) и почему бы не использовать эти учетные данные для аутентификации в Django? Как модно сейчас выражаться - Single Sign On (SSO) - один раз прошел аутентификацию и пользуйся сервисами, т.е пользователь прошел доменную аутентификацию при входе в систему Windows и может пользоваться ресурсами сети без повторного ввода логина и пароля. Django поддерживает эту возможность - метод аутентификации с использованием REMOTE_USER, который описан в официальной документации Django - https://docs.djangoproject.com/en/dev/howto/auth-remote-user/
Если просто описать Windows аутентификацию пользователя в Django, то получится следующее:
- пользователь под доменным именем входит в Windows, открывает браузер, вводит адрес сайта example.com и нажимает Enter;
- NGINX получает запрос на выдачу сайта example.com, распознает пользователя через модуль керберос, создает переменную REMOTE_USER и передает Django проекту;
- Django проект видит в запросе REMOTE_USER и использует его для аутентификации. Если django не обнаруживает REMOTE_USER, то аутентификация не состоялась.
Windows аутентификация работает по умолчанию для браузера Internet Explorer, для Firefox и Chrom надо настраивать (ключевые слова для поиска - chrome kerberos authentication windows).
- Настроить NGINX с поддержкой kerberos. Как это реализуется, можно посмотреть здесь - Установка NGINX kerberos на centos 7.
- Настроить запуск Django через NGINX. Как это реализуется, можно посмотреть здесь - Запуск NGINX Django python3 на сервере Centos 7
- Добавить удаленную аутентификацию для Django. Как это реализовать смотрите ниже.
Использую:
- django проект - /home/example/Projects/example.com/back
- сокет - /run/uwsgi/example.sock, который запускается конфигурацией вассала /etc/uwsgi/vassals/enabled/example.ini
- Изменяю конфигурация nginx для сервера example.com:
$ sudo vi /etc/nginx/conf.d/example.com.conf
# Конфигурация для сервера example.com,
# с uwsgi сокетом для django проекта /home/example/Projects/example.com/back
server {
listen 8888;
server_name example.com;
location /static/ {
root /home/example/Projects/example.com;
}
location /media/ {
root /home/example/Projects/example.com;
}
location / {
# подгружаю django сайт
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/example.sock;
# передаю для django REMOTE_USER
uwsgi_param REMOTE_USER $remote_user;
# аутентификация kerberos
auth_gss on;
auth_gss_realm EXAMPLE.COM;
auth_gss_keytab /etc/example.keytab;
auth_gss_service_name HTTP/example.com;
# выключает basic аутентификация
# auth_gss_allow_basic_fallback off;
}
}
Я оставил basic аутентификацию для того чтобы заходить с компьютеров не включенных в домен. Но обязательно нужно сделать https подключение, потому что логин и пароль передаются в открытом виде.
- Проверяю конфигурацию nginx:
$ sudo nginx -t
Если ошибок нет, то
- Перезапускаю сервис nginx
$ sudo service nginx restart
- Смотрю с Windows компьютера под доменным пользователем через Internet Explorer на http://example.com:8888/ , страница django проекта загружается, в логах /etc/nginx/access.log имеется запись с аутентификацией под доменным пользователем
- Для аутентификации через REMOTE_USER, который будет браться после аутентификации пользователя при входе на сайт (nginx), вношу изменения в /home/example/Projects/example.com/back/back/settings.py
MIDDLEWARE = [
'...',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.RemoteUserMiddleware',
'...',
]
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.RemoteUserBackend',
]
!!! Строка 'django.contrib.auth.middleware.RemoteUserMiddleware' должна обязательно следовать после 'django.contrib.auth.middleware.AuthenticationMiddleware'
- Если по какой то причине nginx аутентификация не пойдет (например, не доступен контроллер домена), то django проект не получит REMOTE_USER и аутентификация не пройдет и все попытки войти в админку сайта будут безрезультатны (даже под superuser). Поэтому, на всякий случай, надо добавить стандартную Django аутентификацию в settings.py
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.RemoteUserBackend',
'django.contrib.auth.backends.ModelBackend',
]
- Перезапускаю сервис uwsgi
$ sudo service uwsgi restart
- Захожу через браузер http://example.com:8888/admin с Windows компьютера под доменным пользователем и ... не надо вводить логин и пароль, прозрачная аутентификация сработала.
Теперь при входе на сайт доменного пользователя учетная запись пользователя будет создана в базе Django проекта автоматически.
Если просто описать Windows аутентификацию пользователя в Django, то получится следующее:
- пользователь под доменным именем входит в Windows, открывает браузер, вводит адрес сайта example.com и нажимает Enter;
- NGINX получает запрос на выдачу сайта example.com, распознает пользователя через модуль керберос, создает переменную REMOTE_USER и передает Django проекту;
- Django проект видит в запросе REMOTE_USER и использует его для аутентификации. Если django не обнаруживает REMOTE_USER, то аутентификация не состоялась.
Windows аутентификация работает по умолчанию для браузера Internet Explorer, для Firefox и Chrom надо настраивать (ключевые слова для поиска - chrome kerberos authentication windows).
Реализации прозрачной Django аутентификации в домене Windows
Нужно выполнить следующие шаги:- Настроить NGINX с поддержкой kerberos. Как это реализуется, можно посмотреть здесь - Установка NGINX kerberos на centos 7.
- Настроить запуск Django через NGINX. Как это реализуется, можно посмотреть здесь - Запуск NGINX Django python3 на сервере Centos 7
- Добавить удаленную аутентификацию для Django. Как это реализовать смотрите ниже.
1. Аутентификация kerberos для сайта example.com
Использую:
- django проект - /home/example/Projects/example.com/back
- сокет - /run/uwsgi/example.sock, который запускается конфигурацией вассала /etc/uwsgi/vassals/enabled/example.ini
- Изменяю конфигурация nginx для сервера example.com:
$ sudo vi /etc/nginx/conf.d/example.com.conf
# Конфигурация для сервера example.com,
# с uwsgi сокетом для django проекта /home/example/Projects/example.com/back
server {
listen 8888;
server_name example.com;
location /static/ {
root /home/example/Projects/example.com;
}
location /media/ {
root /home/example/Projects/example.com;
}
location / {
# подгружаю django сайт
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/example.sock;
# передаю для django REMOTE_USER
uwsgi_param REMOTE_USER $remote_user;
# аутентификация kerberos
auth_gss on;
auth_gss_realm EXAMPLE.COM;
auth_gss_keytab /etc/example.keytab;
auth_gss_service_name HTTP/example.com;
# выключает basic аутентификация
# auth_gss_allow_basic_fallback off;
}
}
Я оставил basic аутентификацию для того чтобы заходить с компьютеров не включенных в домен. Но обязательно нужно сделать https подключение, потому что логин и пароль передаются в открытом виде.
- Проверяю конфигурацию nginx:
$ sudo nginx -t
Если ошибок нет, то
- Перезапускаю сервис nginx
$ sudo service nginx restart
- Смотрю с Windows компьютера под доменным пользователем через Internet Explorer на http://example.com:8888/ , страница django проекта загружается, в логах /etc/nginx/access.log имеется запись с аутентификацией под доменным пользователем
2. Аутентификация в Django через NGINX
- Для аутентификации через REMOTE_USER, который будет браться после аутентификации пользователя при входе на сайт (nginx), вношу изменения в /home/example/Projects/example.com/back/back/settings.py
MIDDLEWARE = [
'...',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.RemoteUserMiddleware',
'...',
]
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.RemoteUserBackend',
]
!!! Строка 'django.contrib.auth.middleware.RemoteUserMiddleware' должна обязательно следовать после 'django.contrib.auth.middleware.AuthenticationMiddleware'
- Если по какой то причине nginx аутентификация не пойдет (например, не доступен контроллер домена), то django проект не получит REMOTE_USER и аутентификация не пройдет и все попытки войти в админку сайта будут безрезультатны (даже под superuser). Поэтому, на всякий случай, надо добавить стандартную Django аутентификацию в settings.py
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.RemoteUserBackend',
'django.contrib.auth.backends.ModelBackend',
]
- Перезапускаю сервис uwsgi
$ sudo service uwsgi restart
- Захожу через браузер http://example.com:8888/admin с Windows компьютера под доменным пользователем и ... не надо вводить логин и пароль, прозрачная аутентификация сработала.
Теперь при входе на сайт доменного пользователя учетная запись пользователя будет создана в базе Django проекта автоматически.
Комментариев нет:
Отправить комментарий