Tuesday, December 8, 2015

Аутентификация в Active Directory через LDAP на Perl, php и python "своими руками"... :)


     Наверное, не только мне приходилось порой, решая задачу, приходить к неутешительному выводу, что то, что мне надо, еще никем не сделано так, как мне надо :) В такой ситуации есть три пути: плюнуть и заняться чем-нибудь другим, попытаться допилить чужое до состояния "годности" или сделать самому ;)
     Итак, лет 10 назад я уже 3 года как был сисадмином с программистскими наклонностями, и появилась у меня задача авторизовать пользователей squid-прокси в Active Directory. В общем, ничего лучше, чем ввести samba в домен и авторизовать пользователей при помощи самодельного perl скрипта через WinBind мне в голову не пришло. И в общем-то, эта связка работала безотказно на протяжении нескольких лет. Да, мой интернето-раздающий сервер был настроен на FreeBSD, а с обновлением ПО во FreeBSD тогда все было еще хуже чем сейчас... Обновлять только через portupgrade, т.е. сносить все, хоть вроде и на автомате, собирать все, половина повалится с ошибками совместимости библиотек и т.д. и т.п. в общем проще обновлять только ядро и мир, и переставлять систему раз в 5 лет. Конечно, ПО в портах FreeBSD изначально гораздо более свежее, чем в любом линуксе, но оно стремительно старело, и самба с винбиндом в том числе. Однажды настал момент, когда старый винбинд не смог авторизоваться на вновь установленном контроллере домена под управлением Windows 2008,  и тогда я понял, что от самбы с винбиндом надо уходить... :)
     Потратил я немного времени на поиски более правильного способа, и так как NTLM у нас внедрять не хотели по некоторым соображениям, я остановился на способе авторизации в AD через LDAP... Да, просто, кроссплатформенно, на любом языке программирования. Из заготовок я нашёл вот это: php.net ref.ldap.php почти то, что мне надо, только "не на том языке" ;) В итоге данный код на PHP я доработал, собрал проверку членства в группе в одну функцию, плюс встроил защиту от бесконечного цикла если группы вдруг входят друг в друга "по кругу", ну и переписал на нужные мне языки: perl и python, а недавно и на Go...

     Скрипты состоят всего из трех функций:
  1. Собственно бинд к LDAP серверу с логином и паролем авторизующегося юзера. На основе удачности или неудачности этого шага делается вывод о прохождении авторизации или её провале. Данная функция у меня оформлена как функция только в Perl скрипте, в остальных это "main" :) Если авторизация успешна, то смотрим, надо ли искать юзера в группе. Если не надо, то возвращаем "true", а если надо, идём в пункт (2).
  2. Поиск DN для юзера и для группы.
  3. Собственно, проверка на вхождения юзера в группу. Если входит - "Успех",а если нет - "уж извините" :)   
     Это не библиотеки, а примеры кода. Авось кому-то они помогут, хотя и написаны уже очень давно ;)

Follow to GitHub repository: Authentication in Active Directory over LDAP. Sample code on PHP, Perl and Python.

     Заметка про авторизацию на Go будет в скоро будущем, но не в чистом виде, а в виде хелпера для Squid, который может авторизоваться в нескольких доменах сразу :)

No comments :

Post a Comment