вторник, 9 апреля 2019 г.

nginx ldap auth

Самый простой вариант ограничения доступа - через файл с паролями, как-то так
location / {
auth_basic "Restricted Area";
auth_basic_user_file auth/htpasswd;
proxy_pass ... }

Но порой требуется интеграция с ldap. Есть несколько вариантов
  1. https://github.com/nginxinc/nginx-ldap-auth - отдельный сервис, можно запустить в докере, обращение к сервису идёт по http
  2. Внешние модули:
    https://github.com/kvspb/nginx-auth-ldap
    https://github.com/sto/ngx_http_auth_pam_module
  3. Штатный модуль http://nginx.org/en/docs/http/ngx_http_auth_request_module.html, но общение с ldap надо реализовать самому
Плюсы и минусы каждого подхода вполне понятны. Модуль - надо собирать под ту же версию, а если оно не умеет динамическим модулем то потом собирать пакет и выкатывать нашу сборку. Нужно отслеживать процесс обновления пакетов, чтобы не поставилась другая версия (решается через опцию Requires в spec файле).

Соберём пакет по п.1, при этом обязательно актвировать модуль ngx_http_auth_request_module (включено в официальных сборках), спека в комплекте
https://github.com/nginxinc/nginx-ldap-auth/tree/master/rpm

Собирать примерно так (считаем что rpm-build и компиляторы стоят), от отдельного юзера, актуально для версии 0.0.5. Обращаем внимание что архив хочет nginx-ldap-auth-release-0.0.5.tar.gz, но внутри - папку nginx-ldap-auth-0.0.5

rpmdev-setuptree
git clone https://github.com/nginxinc/nginx-ldap-auth
cp nginx-ldap-auth/rpm/nginx-ldap-auth.spec rpmbuild/SPECS/
mv nginx-ldap-auth nginx-ldap-auth-0.0.5
tar -czf nginx-ldap-auth-release-0.0.5.tar.gz nginx-ldap-auth-0.0.5
mv *.gz rpmbuild/SOURCES/
cd rpmbuild/SPECS/
rpmbuild -bb nginx-ldap-auth.spec
ls -la ../RPMS/x86_64/

Раскидываем пакет по нужным серверам, а дальше yum localinstall или rpm -Uvh

Поскольку работает оно отдельным сервисом, нужно создать отдельный location с proxy_pass туда и установкой ряда заголовков.
Совсем просто - есть тут
https://lyalyuev.info/2016/06/28/nginx-ldap-avtorizatsiya/
Также читать эту доку
https://www.nginx.com/blog/nginx-plus-authenticate-users/

Обращаю внимание на нюанс, который отнял у меня много времени
https://www.python-ldap.org/en/latest/faq.html
Q: My script bound to MS Active Directory but a a search operation results in the exception ldap.OPERATIONS_ERROR with the diagnostic message text “In order to perform this operation a successful bind must be completed on the connection.”
Фикс: для AD необходимо добавить
proxy_set_header X-Ldap-DisableReferrals 'true';

Скрипт делает 2 бинда: первый от юзера в binddn и пароля в bindpass, делает search по пользователю с учётом template, и 2 бинд от юзера и пароля из запроса авторизации браузера.

proxy_set_header X-Ldap-BindDN "admin"; - так вполне работает, не обязательно писать полную форму.
proxy_set_header X-Ldap-BaseDN "dc=domain,dc=local"; - тоже (смотрим, это разные опции). Можно потом описать более полный путь, используя для проверки ldapsearch, суть в том что в скрипте берётся первая запись если их больше одной, и может так получиться что это будет не та запись что нам нужна.

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

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