null

Организация разграничения доступа к web-ресурсу через LDAP в nginx

Начнём с того, что nginx "из коробки" не поддерживает аутентификацию через LDAP. В интернете можно найти самописный модуль, но разработчики не дают гарантии, что всё не посыпится после первого обновления. Что же делать? Не трогать сам nginx. На официальном сайте предлагают решение для nginx+(которое так же отлично работает и с бесплатной версией), которое заключается в перенаправлении запросов на аутентификацию другому маленькому серверу, написанному на питоне.

Схемы работы с официального сайта(https://www.nginx.com/blog/nginx-plus-authenticate-users/)

In the NGINX Plus reference implementation for LDAP authentication, the ldap-auth daemon is the intermediary between NGINX Plus and the LDAP server

Итак, давайте попробуем это поставить.

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 под свои нужды.