[Comm] Снова об авторизации через LDAP

Denis Kirienko =?iso-8859-1?q?kirienko_=CE=C1_mccme=2Eru?=
Ср Ноя 20 19:40:36 MSK 2002


On Thu, 14 Nov 2002, Igor Muratov wrote:

>>> Я не читаю список community и поэтому не знал что у кого-то
>>> LDAP-авторизация вызывает у кого-то проблемы. В дистрибутиве есть все
>>> необходимое и это реально работает. Напишите подробнее что вы делали
>>> и что не получилось.

Все-таки нашел время и решил попробовать насторить LDAP еще раз. Вот что
получилось. Копию письма отправляю в community на altlinux.ru

Устанавливаю Мастер из коробки:

Инсталяция: text mode, группы пакетов "Документация" и "Сетевой
сервер". Обнаружил забавный глюк - под пользователем
ряд программ (bash, mc, man) выдает сообщения по-французски
(наследие Mandrake, вероятно), хотя локаль установлена
русская.

Далее

$ apt-get install openldap openldap-clients openldap-guide openldap-servers

Правлю файл /etc/openldap/slapd.conf в соответствии с руководством
по Мастеру.
       Изменяю корень, имя администратора, пароль
       Снимаю комментарий со строки TLSCipherSuite
       	      (кстати, то, что эта строка закомментирована,
	      а три строки
	      TLSCertificate... - нет, не является багом?)
       password-hash {MD5}
       Добавляю списки прав доступа как в руководстве
       Исправляю в установки индексов surname на surName givenname на givenName

# service ldap start
Starting slapd:/etc/openldap/schema/nadf.schema: No such file or directory  [FAILED]

Комментирую строку с nadf.schema в slapd.conf - теперь запуск удачен
(зачем вообще включена это строка, нет же nadf.schema в Мастере?)

Проверяю отклик сервера:
# ldapsearch -H ldap://server.school179.ru
Есть ответ сервера

# ldapsearch -H ldaps://server.school179.ru
ldap_bind: Can't contact LDAP server

Естественно, поскольку ssl-ключи не сгенерированы.
В документации об этом написано:
"создадим пользователя ldap" (нужды в этом нет - зачем писать)
"... сертификат с помощью программы openssl"
А вот здесь надо гораздо подробней. Поскольку я могу прикинуться чайником
и запустить просто команду openssl. Что же я получаю?
# openssl
bash: openssl: command not found

Ладно, делаю
# apt-get install openssl

Теперь запускаю openssl. Получаю промпт OpenSSL>, с которым совершенно
непонятно, что делать дальше. После длительных поисков (в первый раз,
на пятый раз я уже гораздо быстрее вспоминаю, что надо делать)
догадываюсь запустить файл /usr/share/openldap/gencert.sh

Не без сомнений	отвечаю на некоторые вопросы. После чего обнаруживаю,
что сертификат был создан не в каталоге /etc/openldap,
а в текущем каталоге. Перемещаю его куда надо, перезапускаю сервер -
соединение по протоколу ldaps установить не могу.

Ковыряю файл slapd.conf на предмет настроек TLS.
Выясняю, что важно, стоят ли в начале строк в файле slapd.conf
пробелы или нет (в общем, неочевидная догадка).
В результате на команду

# ldapsearch -H ldaps://server.school179.ru

иногда получаю ответ

ldap_bind: Can't contact LDAP server

а иногда такой

ldap_bind: Can't contact LDAP server
additional info: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

Летом Алексей Чуйков писал на community на altlinux.ru,
насколько я понимаю по архиву community,
разрешить эту проблему ему не удалось.

Вспоминаю, про обещанные полчаса, необходимые
на настройку LDAP-авторизации.

Ладно, забываю пока про шифрование, в надежде
вернуться к нему позднее.

Создаю файл intial.ldif

При попытке добавить данные сталкиваюсь с очередной проблемой:
adding new entry "dc=school179,dc=ru"
ldap_add: Operations error

Вспоминаю, в чем дело: в /etc/openldap/slapd.conf написана
по умолчанию строка
directory	/var/lib/ldap/bases
которую я не стал изменять, в то время как такого каталога не существует!

Создаю каталог /var/lib/ldap/bases, не забыв поменять
ему группу и права доступа.

Добавляю данные при помощи ldapadd

Пытаюсь сделать анонимный запрос:

# ldapsearch -xLLL "(uid=denis)"
No such object (32)

После очередных мучений вспоминаю, в чем дело
(опять таки, я все это повторяю не в первый раз, в первый
раз на это уходило гораздо больше времени).
Нужно подправить файл /etc/openldap/ldap.conf, изменив в нем
параметр BASE (и не забыть при этом убрать пробел между двумя
dc=... ) и сделать символическую ссылку /etc/ldap.conf на
/etc/openldap/ldap.conf

Вот это большая тонкость: в пакете openldap есть файл
/etc/openldap/ldap.conf, а на самом деле клиентские
настройки LDAP должны лежать в /etc/ldap.conf.
В документации на Мастер написано, что это именно
/etc/ldap.conf, но когда перед глазами упорно маячит
/etc/openldap/ldap.conf с аналогичными настройками,
очень тяжело понять, что эти настройки нужно указывать
в другом файле - /etc/ldap.conf

Следует заметить, что информация о настройке клиента и файле
/etc/ldap.conf написана в документации на Мастер ПОСЛЕ
предложения выполнить анонимный запрос при помощи ldapsearch,
таким образом этот анонимный запрос выполнить не удастся.
Что будет казаться пользователю очень странным - данные
в базе LDAP лежат, соединение устанавливается, авторизация
проходится, а найти ничего не удается!

Ну вот теперь мне удалось сделать так, чтобы отработал запрос
$ ldapsearch -xLLL "(uid=denis)"

Переходим к разделу "Централизованная авторизация" документации
на Мастер.

Выполняю:

$ apt_get instal nss_ldap pam_ldap

Записываю пароль администратора LDAP в /etc/ldap.secret

Изменяю файл /etc/nsswitch.conf

passwd:     files ldap nisplus nis
shadow:     tcb files ldap nisplus nis
group:      files ldap nisplus nis

(а в документации на Мастер написано:
passwd: file ldap
то есть file, а не files. Такие ляпы в документации сильно
смущают пользователей).

Теперь проверяем, подключены ли пользователи из базы:
$ id denis
uid=1000(denis) gid=1000(luser) groupes=1000(luser)

Однако, войти в систему с консоли не удается.
В /var/log/syslog/messages написано:
Nov 15 21:11:11 server pam_tcb[2919]: login: Authentication failed for denis from (uid=0)

Дальнейшие события не являются каким-либо багом в Мастере,
но представляют интерес с точки зрения возможных грабель
на пути.

Я понимал (судя по community), что теперь надо править файлы /etc/pam.d/*
но в документации на Мастер об этом ничего не сказано!
В конце сентября sergey кидал на community свои конфигурационные файлы,
в том числе /etc/pam.d/system-auth и
/etc/pam.d/system-auth-use_first_pass.
В октябре я попробовал поставить себе эти конфигурационные файлы, это
привело к тому, что вообще невозможно стало войти в систему,
при этом у пользователя даже не запрашивался пароль.
Поскольку сил на LDAP к этому времени я потратил много,
то я решил сделать простое "временное" решение, отложив
настройку LDAP в длинный список TODO.

Теперь, вернувшись к настройке авторизации через LDAP, я снова
наткнулся на эти грабли. Опять скопировал примеры
/etc/pam.d/system-auth* от sergey, опять обнаружил, что пользователя
в систему не пускают. Но на этот раз каким-то наитием я догадался
взглянуть на эти файлы в шестнадцатеричном просмотрщике.
Как вы думаете, что я обнаружил? Естественно, \0x0D\0x0A
в качестве концов строк! После исправления этого недоразумения
авторизация заработала! К сожалению, сейчас я уже затрудняюсь
ответить на вопрос, каким образом я приносил на свою
машину, не подключенную к интернету, эти файлы и кто
виноват в возникновении этой досадной проблемы.

Итак, резюмирую:

0. На настройку авторизации мне понадобилось несколько
   часов, с учетом того, что на все грабли я натыкался
   не в первый раз и процесс их устранения занимал
   гораздо меньше времени, нежели при первом наступании.
1. Описание LDAP в документации на Мастер выполнено
   с рядом неточностей и нуждается в серьезном исправлении.
2. Хорошо бы исправить соответствующие пакеты
   в Мастере (отсутствие файлов /etc/openldap/schema/nadf.schema
   и /etc/ldap.conf)
3. В документации на Мастер не описан процесс настройки
   протокола ldaps, попытки самостоятельно выполнить настройку
   не увенчались успехом, а ставить авторизацию без шифрования -
   небезопасно.
4. В документации на Мастер не описаны изменения, которые необходимо
   сделать в файлах /etc/pam.d/*, без которых авторизация работать
   не будет.

                                          Денис



Подробная информация о списке рассылки community