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

В продолжение поста про авторизацию 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)

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

Реклама

комментария 2 to “Прозрачная авторизация LDAP.”

  1. va1e Says:

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

  2. Andrew Says:

    Хотя и давно автор написал эту статью, но проблему с SMB_Logon_Server: SMB_SessSetupAndX failed; errorclass = 1, Error Code = 5\n с тех пор, похоже, никто не исследовал.
    А она, оказывается, связана с тем, что в mod_ntlm.c:ntlm_check_response() (строчка примерно 600) есть проверка:
    if (ntlm_connection->auth_ok && ntlm_connection->user) {
    /* user has already valid credentials */
    if ((!strcmp(ntlm_connection->user, ntlmssp->user))
    && (!strcmp(ntlm_connection->domain, ntlmssp->domain))
    && (!memcmp(ntlm_connection->password, ntlmssp->nt, RESP_LEN))) {
    log(r, APLOG_INFO, «silent reauthentication»);
    /* silently accept login with same credentials */
    r->user = apr_pstrdup(r->connection->pool, ntlm_connection->user);
    r->ap_auth_type = apr_pstrdup(r->connection->pool, NTLM_AUTH_NAME);
    return OK;
    }

    В (!memcmp(ntlm_connection->password, ntlmssp->nt, RESP_LEN)) password и nt содержат разные значения. Как workaround я закомментарил эту проверку на совпадение пароля. После этого все стало хорошо.

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s


%d такие блоггеры, как: