Начнём с того, что nginx “из коробки” не поддерживает аутентификацию через LDAP. В интернете можно найти самописный модуль, но разработчики не дают гарантии, что всё не посыпится после первого обновления. Что же делать? Не трогать сам nginx. На официальном сайте предлагают решение для nginx+(которое так же отлично работает и с бесплатной версией), которое заключается в перенаправлении запросов на аутентификацию другому маленькому серверу, написанному на питоне.
Схемы работы с официального сайта(https://www.nginx.com/blog/nginx-plus-authenticate-users/)
Итак, давайте попробуем это поставить.
1. Вам потребуется python версии 2. На версии 3 работоспособность не проверялась и не гарантируется.
2. Нужно установить пакет python-ldap и несколько других требуемых пакетов.
sudo apt-get install libsasl2-dev python-dev libldap2-dev libssl-dev |
3. Если у вас ещё нет nginx, ставим его
apt-get install nginx |
4. Клонируем репозиторий с нашим маленьким сервером аутентификации
git clone https: //github .com /nginxinc/nginx-ldap-auth |
5. В репозитории мы найдём следующие нужные нам файлы:
nginx-ldap-auth.conf — пример конфигурационного файла nginx для работы с данным решением.
backend-sample-app.py — backend, содержащий форму для ввода имени и пароля, который работает с сервером аутентификации.
nginx-ldap-auth-daemon.py — собственно, код самого сервера аутентификации.
Также вы найдёте файл nginx-ldap-auth-daemon-ctl.sh. Это скрипт, который вы можете использовать для запуска сервера и backend’а в качестве демонов. Использование этого скпирта остаётся на ваше усмотрение.
6. Изменяем конфигурацию nginx, которую можно найти в /etc/nginx/nginx.conf
Вот пример моей конфигурации(с пояснениями):
error_log logs/error.log debug; events { } http { proxy_cache_path cache/ keys_zone=auth_cache:10m; upstream backend { server 127.0.0.1:9000; # указываем адрес и порт, где слушает backend # указан стандартный, где сервер стартует по умолчанию } server { listen 443; # nginx слушает на 443 порту и работает через https. Безопасность -- наше всё ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; ssl_session_timeout 5m; location / { auth_request /auth-proxy; error_page 401 403 =200 /login; root /var/www/resource; # указываем где на нашей системе лежит ресурс, # к которому мы делаем доступ index index.html index.htm; # соответственно, индекс нашего ресурса } location /login { proxy_pass http://backend/login; proxy_set_header X-Target $request_uri; } location = /auth-proxy { internal; proxy_pass http://127.0.0.1:8888; # адрес и порт сервера аутентификации # указан стандартный, где сервер стартует по умолчанию proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_cache auth_cache; proxy_cache_valid 200 403 10m; proxy_cache_key "$http_authorization$cookie_nginxauth"; proxy_set_header X-Ldap-URL "ldap://ldapserver:389"; # тут указываем адрес # и порт LDAP сервера proxy_set_header X-Ldap-BaseDN "dc=smth,dc=com"; # указываем BaseDN proxy_set_header X-Ldap-BindDN "CN=nginx,DC=smth,DC=com"; # указываем BindDN. # и не забываем предварительно создать соответствующего пользователя в LDAP! proxy_set_header X-Ldap-BindPass "password"; # пароль пользователя nginx proxy_set_header X-CookieName "nginxauth"; proxy_set_header Cookie nginxauth=$cookie_nginxauth; proxy_set_header X-Ldap-Template "(SAMAccountName=%(username)s)"; # тут пишем наш запрос в LDAP. В данном случае проверяется наличие пользователя в Microsoft AD } } }
7. Сохраняем эту конфигурацию в /etc/nginx/nginx.conf и проверяем её корректность
nginx -t |
8. Если всё прошло успешно, запускаем.Пока что из shell.
service nginx start . /nginx-ldap-auth-daemon .py > /dev/null 2> /dev/null & . /backend-sample-app .py > /dev/null 2> /dev/null & |
9. Пробуем войти!
Вводим имя пользователя, пароль, радуемся.
В конце стоит не забыть сделать backend-sample-app.py и nginx-ldap-auth-daemon.py демонами и настроить зависимость nginx от них. И, конечно же, переделать backend под свои нужды.