В крупных организациях увеличение числа пользователей неизбежно ведет к проблемам администрирования их учетных записей. В этом случае возникает необходимость внедрения единой системы аутентификации. Один из вариантов такой системы может быть основан на использовании сервера 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 будем настраивать 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
Для обеспечения функционирования сетевых служб на 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