Archive for the ‘ldap’ Category

Assertion failed: LDAP_VALID( ld ), file getentry.c, line 35.

Октябрь 31, 2007

Вот такими неприличными строками встретил меня мой сервер после перезагрузки. Ошибка из разряда «Ничего не менял. Только перезагрузил!»

После продолжительных поисков в гугле и нахождения ответов «Мы не знаем что это, но физическая перезагрузка сервера нам помогла», пришел к выводу, что это очень печально. Мне сервер перегрузить ну совсем никак. Это делается через RFC, а их выполняют долго.

Ошибка кроется в модуле ldap для php. Ошибка возникает, вроде, только под 64-битными SPARC’ами. На соляре. Вообщем редкая штука 😉

Решения проблемы я не нашел. Перекомпиляция с флагами оптимизации мне не помогла. Пришлось отрубать модуль ldap из конфигурации. Это мне ещё аукнется. Но в свете предстоящего на выходных внедрения, это малая кровь.

Реклама

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

Август 23, 2007

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

Июль 24, 2007

Начал работу над новым проектом. Он очень большой. И пока мной не охваченный. Т.е. я примерно знаю что это будет, но как это делать, ещё ясности нет.

Одной из текущих задач является разобраться с LDAP, т.к. проект будет крутится внутри локальной сети, а она использует домены для авторизации. Попадание извне на этот портал пока не предусмотрено.

На данный моменты было найдено несколько средств работы с этой службой каталогов.

  • Во-первых сам php довольно хорошо о ней осведомлён (мануал), если его предусмотрительно скомпилировать с поддержкой LDAP.
  • Во-вторых, есть модуль для Apache, mod_ntlm, который, вроде, поддерживает авторизацию по LDAP, но он для меня ещё тёмный лес. И преимущества, предоставляемые им для меня не очевидны. Кроме того, что он позволяет проводить авторизацию самостоятельно, т.е. без участия php, как Basic http authorization (или как-то так)
  • В-третьих есть обертка (wrapper) в виде класса, которая позволяет удобно и не нудно работать с LDAP

Однако, при поиске способов извлечения данных об авторизации пользователем в сети, я пришел к выводу, что сделать это можно только для IE. Т.к. он тесно интегрирован в Windows и умеет сам посылать заголовки о том, что он авторизован. Заодно, можно и имя пользователя извлекать (топик, faq). Не уверен, что этот способ приемлем, но всё же это лучше, чем ничего.

Пока вывод такой: сделать авторизацию, запрашивая LDAP можно. Выдрать имя пользователя, если используется не IE — нельзя.