пятница, 14 октября 2016 г.

Django аутентификация через NGINX kerberos (Active Directory)

В корпоративном сегменте часто используют 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).

Реализации прозрачной 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 проекта автоматически.

Комментариев нет:

Отправить комментарий

django-oscar tinymce 4 filebrowser

Задача: в дашборде django-oscar загружать изображения 1. Установка django-filebrowser-no-grappelli - Открываем проект, загружаем виртуа...