Прозрачная авторизация LDAP.

By bthemad

В продолжение поста про авторизацию LDAP, опишу своё решение этой проблемы. Если сервер крутится на Win, то существует mod_auth_sspi.so для Apache, который позволяет делать прозрачный вход для пользователя, авторизованного в домене. Но у меня сервер под Solaris 9, следовательно этот модуль мне не подошёл.

Остается 2 варианта:

  1. mod_auth_ntlm_winbind
  2. mod_ntlm

Причем mod_auth_ntlm_winbind считается намного лучше, чем mod_ntlm, который особо и не развивается и не поддерживается. А mod_auth_ntlm_winbind вышел из проекта Samba, и соответственно он жив. Т.е. по логике вещей надо ставить его. Есть только одно «НО»…зависимости. И список их впечатляет:

  • Samba 3 с Winbind
  • Kerberos
  • SSL

Вот этот список с моими неАдминскими правами и отсутствием времени мне и не захотелось поднимать. Причем это всё надо не просто установить…но и настроить. Соответственно, разбираться в этом пришлось бы. А времени не было. Поэтому было принято решение устанавливать mod_ntlm

С mod_ntlm тоже были проблемы. Он не хотел собираться и инсталлироваться. Никак не хотел. Длительный поиск по инету привел меня вот на эту страницу, где я прочёл что надо поправить в source, чтобы всё нормально собиралось. Рекомендую.

Дальше, подключаем mod_ntlm в httpd.conf, и пишем в дирректории, где у нас будет происходить авторизация в .htaccess (ну или прямо в httpd.conf прописываем):

AuthType NTLM
AuthName «NTLM authentication»
NTLMAuth On
NTLMAuthoritative Off
NTLMDomain DOMAIN_NAME
NTLMServer SERVER_ALIAS
require valid-user

Вроде работает. Если скрестить со скриптом из топика, то вытаскивается логин пользователя в домене. Если почистить его от непечатных (не ASCII) символов со помощью регулярки:

$login = preg_replace(‘/[\x00-\x0d]/i’, », $login);

то получим читабельный логин. И под FireFox (который правда не отсылает заголовки по умолчанию, так что с ним прозрачности нет) и под IE.

Ну а релогин пользователю выполняется просто. Если файлик, выполняющий аутентификацию у нас лежит в папочке, которая проверяется mod_ntlm, то после того, как они поговорят с браузером о логинах и хэшах автоматически, надо отправить клиенту заголовок 401, тем самым вынудив браузер выкинуть формочку для ввода логина и пароля. Т.е. мы имитируем неправильную аутентификацию.

Правда есть один неприятный момент, который я не решил. Баг. Он проявляется, если несколько раз подряд пытаться выполнить релогин. То в логах Apache появится вот такая ошибка:

[error] 11762 – SMB_Logon_Server: SMB_SessSetupAndX failed; errorclass = 1, Error Code = 5\n
2905896 12224 /login/tmp.php – PDC connection already closed
[notice] child pid 11762 exit signal Segmentation fault (11)

А вот если делать его аккуратно и не часто, то всё ок. Мне кажется это проблема самого модуля, и способа её устранить я не нашел.

Один ответ на “Прозрачная авторизация LDAP.”

  1. va1e:

    Интересный блог. В избранное.

Ответить