Аутентификация в 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...
Скрипты состоят всего из трех функций:
Follow to GitHub repository: Authentication in Active Directory over LDAP. Sample code on PHP, Perl and Python.
Заметка про авторизацию на Go будет в скоро будущем, но не в чистом виде, а в виде хелпера для Squid, который может авторизоваться в нескольких доменах сразу :)
Наверное, не только мне приходилось порой, решая задачу, приходить к неутешительному выводу, что то, что мне надо, еще никем не сделано так, как мне надо :) В такой ситуации есть три пути: плюнуть и заняться чем-нибудь другим, попытаться допилить чужое до состояния "годности" или сделать самому ;)
Итак, лет 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...
Скрипты состоят всего из трех функций:
- Собственно бинд к LDAP серверу с логином и паролем авторизующегося юзера. На основе удачности или неудачности этого шага делается вывод о прохождении авторизации или её провале. Данная функция у меня оформлена как функция только в Perl скрипте, в остальных это "main" :) Если авторизация успешна, то смотрим, надо ли искать юзера в группе. Если не надо, то возвращаем "true", а если надо, идём в пункт (2).
- Поиск DN для юзера и для группы.
- Собственно, проверка на вхождения юзера в группу. Если входит - "Успех",а если нет - "уж извините" :)
Follow to GitHub repository: Authentication in Active Directory over LDAP. Sample code on PHP, Perl and Python.
Заметка про авторизацию на Go будет в скоро будущем, но не в чистом виде, а в виде хелпера для Squid, который может авторизоваться в нескольких доменах сразу :)
No comments :
Post a Comment