Руководство по настройке аутентификации пользователей посредством LDAP.

Михаил Захаров (zakharov@ipb.redline.ru)

Введение.

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

Для построения такой системы на FreeBSD (FreeBSD-4.4-Release) мною было использовано следующее свободно-распространяемое программное обеспечение:

Перед началом заранее хочу сделать несколько важных замечаний и предостережений. Во-первых, предлагаемое руководство относится к жанру quick start , и приведенные здесь варианты конфигурации не являются идеальным решением проблемы аутентификации, это лишь модель работы системы аутентификации, построенной на LDAP. Во-вторых, проводить изменения в pam.conf нужно осторожно, поскольку возможна ситуация при которой ни один пользователь просто не сможет пройти аутентификацию ни одним методом. И, наконец, в-третьих, после установки сервера LDAP, следует убедиться, что библиотеки liblber .* и libldap.* находятся в каталогах /usr/lib, а файлы disptmpl.h, lber*.h, ldap*.h и srchpref.h располагаются в каталоге /usr/include. Это избавит вас от ошибок компиляции и линкования клиентского программного обеспечения.


Настройка сервера LDAP.

В качестве сервера LDAP будем настраивать OpenLDAP-2.0.23. Все конфигурационные файлы OpenLDAP находятся в каталоге /usr/local/etc/openldap. Здесь, прежде всего, интересен файл slapd.conf, в котором указываются настройки сервера. В нашем случае этот файл должен состоять как минимум из следующих 8-ми строк:

include /usr/local/etc/openldap/schema/core.schema

include /usr/local/etc/openldap/schema/cosine.schema

include /usr/local/etc/openldap/schema/nis.schema

database ldbm

suffix "dc=testdomain,dc=ru"

rootdn "cn=Admin,dc=testdomain,dc=ru"

rootpw adminpassword

directory /usr/local/var/openldap-ldbm

Первые три строки подключают схемы LDAP. Формат и структура данных, хранимые в LDAP, определяются схемами. Порядок подключения схем важен, поскольку схема может использовать значения, определенные в другой схеме.

Далее указывается тип базы данных, в которой по-настоящему и хранится информация, в нашем случае это ldbm.

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

Затем следует запись об администраторе (rootdn) и его пароль (rootpw). Необходимо заметить, что учетная запись администратора действует даже в тех случаях, когда в самой базе данных административная запись отсутствует или содержит пароль, отличающийся от указанного в rootpw.

Последняя строка определяет каталог, в котором будут находиться файлы базы данных LDBM.

В завершении, в slapd.conf полезно добавить правила, разграничивающие доступ к ресурсам LDAP, например такие:

access to dn=".*,dc=testdomain,dc=ru" attr=userPassword

by dn="cn=Admin,dc=testdomain,dc=ru" write

by self write

by * auth

access to dn=".*,dc=testdomain,dc=ru"

by dn="cn=Admin,dc=testdomain,dc=ru" write

by self write

by * read

Запускаем сервер LDAP:

/usr/local/libexec/slapd

Теперь можно заполнять базу данных сервера LDAP. Для этого создадим текстовый файл, например, testdomain.ldif, содержащий записи о нашей организации, администраторе, группе пользователей и, собственно, одном из пользователей:

dn: dc=testdomain,dc=ru

objectclass: dcObject

objectclass: organization

o: testdomain

dc: testdomain

dn: cn=Admin,dc=testdomain,dc=ru

objectclass: organizationalRole

cn: Admin

dn: ou=Users,dc=testdomain,dc=ru

ou: Users

objectclass: top

objectclass: organizationalUnit

dn: uid=zmey,ou=Users,dc=testdomain,dc=ru

uid: zmey

cn: Mikhail E. Zakharov

objectclass: account

objectclass: posixAccount

objectclass: top

objectclass: uidObject

loginshell: /bin/tcsh

uidnumber: 1000

gidnumber: 1000

homedirectory: /home/zmey

gecos: Mikhail E. Zakharov,,,,

userpassword: topsecret

Итак, OpenLDAP настроен. Удостоверимся, что все работает правильно, проверим записи, находящиеся на сервере:

ldapsearch -x -b "dc=testdomain,dc=ru" "(objectclass=*)"

Ответ сервера должен быть следующим:

version: 2

#

# filter: (objectclass=*)

# requesting: ALL

#

# Admin, testdomain, ru

dn: cn=Admin,dc=testdomain,dc=ru

objectClass: organizationalRole

cn: Admin

# Users, testdomain, ru

dn: ou=Users,dc=testdomain,dc=ru

ou: Users

objectClass: top

objectClass: organizationalUnit

# zmey, Users, testdomain, ru

dn: uid=zmey,ou=Users,dc=testdomain,dc=ru

uid: zmey

cn: Mikhail E. Zakharov

objectClass: account

objectClass: posixAccount

objectClass: top

objectClass: uidObject

loginShell: /bin/tcsh

uidNumber: 1000

gidNumber: 1000

homeDirectory: /home/zmey

gecos: Mikhail E. Zakharov,,,,

# search result

search: 2

result: 0 Success

# numResponses: 4

# numEntries: 3

 

Клиенты LDAP.

Для обеспечения функционирования сетевых служб на FreeBSD обычно устанавливаются свободно-распространяемые варианты программного обеспечения. Большинство этих программ не могут напрямую взаимодействовать с LDAP, зато поддерживают возможность проведения аутентификации через модули PAM. Поскольку в нашем случае, таких программ большинство, с них и начнем.

Прежде всего, модуль PAM, которым мы будем пользоваться, называется pam_ldap. В дистрибутив FreeBSD этот модуль не входит, поэтому его необходимо установить, используя систему портов или скомпилировать вручную, забрав с сервера www.padl.com.

Модуль pam_ldap ищет конфигурационный файл ldap.conf. Обычно этот файл должен располагается в каталоге /etc, но иногда, в зависимости от опций, указанных при компиляции, может находиться и в /usr/local/etc/.

Наш /etc/ldap.conf будет содержать лишь 3 строки:

BASE dc=testdomain,dc=ru

HOST ldap_server

pam_password clear

Здесь BASE база для поиска в дереве LDAP;

HOST IP-адрес или имя хоста, на котором работает LDAP-сервер;

pam_password указывает, что будут использоваться незашифрованные пароли. Это сделано для простоты, на практике разумнее пользоваться шифрованными паролями. Однако, в этом случае необходимо, чтобы пароли, хранимые в LDAP, тоже были шифрованы. Разумеется, и запись rootpw в файле /usr/local/etc/slapd.conf, тоже рекомендуется зашифровать. Для генерации паролей, в том числе и шифрованных, можно воспользоваться утилитой ldappasswd из комплекта OpenLDAP.

Основной конфигурационный файл PAM находится в каталоге /etc и называется pam.conf. Он состоит из правил описывающих методы проведения аутентификации для различных сервисов. Для наших сервисов записи в pam.conf могут быть такими:

Первое, что мы хотим, это организовать доступ по login:

login auth sufficient pam_ldap.so

login auth sufficient pam_skey.so

login auth requisite pam_cleartext_pass_ok.so

login auth required pam_unix.so try_first_pass

login account required pam_unix.so

login password required pam_permit.so

login session required pam_permit.so

Для FTP записи выглядят проще:

ftpd auth sufficient pam_ldap.so

ftpd auth sufficient pam_skey.so

ftpd auth requisite pam_cleartext_pass_ok.so

ftpd auth required pam_unix.so try_first_pass

OpenSSH потребуются следующие правила:

sshd auth sufficient pam_ldap.so

sshd auth sufficient pam_skey.so

sshd auth required pam_unix.so try_first_pass

sshd account required pam_unix.so

sshd password required pam_permit.so

sshd session required pam_permit.so

Конфигурация Samba (в нашем случае Samba 2.2.4) требует дополнительных комментариев. Во-первых, хотя Samba и имеет возможность работать с LDAP-серверами напрямую, но этот механизм еще не отработан, и поэтому мы будем использовать PAM. Во-вторых, исходные тексты должны быть скомпилированы с поддержкой PAM. По умолчанию, эта опция отключена, поэтому компилируем и устанавливаем программу так:

./configure --with-pam

make

make install

В /etc/pam.conf требуется наличие следующих строк:

samba auth required pam_ldap.so

samba session required pam_ldap.so

Самая простая конфигурация у Qpopper 4.4. В /etc/pam.conf добавляем:

pop3 auth sufficient pam_ldap.so

Кроме того, Qpopper тоже должен быть скомпилирован с поддержкой PAM:

./configure --with-pam

make

make install

Единственный продукт, который работает серверами с LDAP без помощи PAM, это SQUID. Для аутентификации через LDAP Squid используется собственный модуль squid_ldap_auth, представляющий собой внешнюю программу. В дистрибутиве Squid, его исходные тексты находится в каталоге auth_modules/LDAP.

Скомпилировав и установив squid_ldap_auth, можно приступать к настройке Squid.

В squid.conf указываем, что необходимо использовать наш модуль аутентификации:

authenticate_program /usr/local/squid/libexec/squid/squid_ldap_auth -b dc=testdomain,dc=ru ldap_server

Здесь b dc=testdomain,dc=ru - суффикс LDAP, ldap_server IP-адрес или DNS- имя сервера LDAP. Путь usr/local/squid/libexec/squid/ взят по умолчанию.

Далее для проверки, добавим в squid.conf простейший ACL:

acl password proxy_auth REQUIRED

http_access allow password

http_access deny all