Product SiteDocumentation Site

11.7. LDAP каталог

OpenLDAP — это реализация протокола LDAP; другими словами, это база данных специального назначения, предназначенная для хранения каталогов. В наиболее распространённом случае использование сервера LDAP позволяет централизовать управление учётными записями пользователей и соответствующими разрешениями. Более того, база данных LDAP легко реплицируется, что позволяет настроить несколько синхронизированных серверов LDAP. Когда сеть и база пользователей быстро растут, нагрузку можно распределить между несколькими серверами.
Данные LDAP структурированы и иерархичны. Структура определяется «схемами», которые описывают типы объектов, которые может хранить база данных, со списком всех их возможных атрибутов. Синтаксис, используемый для ссылки на конкретный объект в базе данных, основан на этой структуре, что объясняет его сложность.

11.7.1. Установка

Пакет slapd содержит сервер OpenLDAP. Пакет ldap-utils включает инструменты командной строки для взаимодействия с серверами LDAP.
Установка slapd обычно запрашивает только пароль администратора, и полученная база данных вряд ли будет соответствовать вашим потребностям. К счастью, простой запуск dpkg-reconfigure slapd позволит вам перенастроить базу данных LDAP более детально:
  • Пропустить конфигурирование сервера OpenLDAP? Нет, конечно, мы хотим настроить этот сервис.
  • DNS имя домена: “falcot.com”.
  • Имя организации: “Falcot Corp”.
  • Необходимо ввести административные пароли.
  • Бэкенд базы данных использует: “MDB”.
  • Вы хотите, чтобы база данных была удалена, когда slapd очищается? Нет. Нет смысла рисковать потерей базы данных в случае ошибки.
  • Переместить старую базу данных? Этот вопрос задается только при попытке настройки, когда база данных уже существует. Отвечайте «да» только в том случае, если вы действительно хотите начать заново с чистой базы данных, например, если вы запустите dpkg-reconfigure slapd сразу после первоначальной установки.
Теперь настроена минимальная база данных, о чем свидетельствует следующий запрос:
$ ldapsearch -x -b dc=falcot,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=falcot,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# falcot.com
dn: dc=falcot,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Falcot Corp
dc: falcot

# admin, falcot.com
dn: cn=admin,dc=falcot,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
Запрос вернул два объекта: саму организацию и пользователя-администратора.

11.7.2. Filling in the Directory

Поскольку пустая база данных бесполезна, мы собираемся добавить в неё все существующие каталоги; сюда входят базы данных пользователей, групп, служб и хостов.
Пакет migrationtools предоставляет набор скриптов, предназначенных для извлечения данных из стандартных каталогов Unix (/etc/passwd, /etc/group, /etc/services, /etc/hosts и так далее), преобразования этих данных и внедрения их в базу данных LDAP.
Как только пакет будет установлен, /etc/migrationtools/migrate_common.ph необходимо редактировать; опции IGNORE_UID_BELOW и IGNORE_GID_BELOW должны быть включены (достаточно раскомментировать их), и DEFAULT_MAIL_DOMAIN/DEFAULT_BASE необходимо обновить.
Фактическая операция миграции выполняется командой migrate_all_online.sh как указано далее:
# cd /usr/share/migrationtools
# PERL5LIB="${PERL5LIB}:/etc/migrationtools" LDAPADD="/usr/bin/ldapadd -c" ETC_ALIASES=/dev/null ./migrate_all_online.sh
migrate_all_online.sh задаёт несколько вопросов о базе данных LDAP, в которую необходимо перенести данные. Таблица 11.1 суммирует ответы, данные в сценарии использования Falcot.

Таблица 11.1. Ответы на вопросы, заданные скриптом migrate_all_online.sh

ВопросОтвет
X.500 контекст именованияdc=falcot,dc=com
LDAP сервер имя хостаlocalhost
Manager DNcn=admin,dc=falcot,dc=com
Привязать учётные данныепароль администратора
Создать DUAConfigProfileнет
Вы могли заметить, что мы расширяем переменную PERL5LIB. Это связано с отчетом об ошибке Debian № 982666.
Как вы могли заметить, мы намеренно игнорируем миграцию файла /etc/aliases, поскольку стандартная схема, предоставляемая Debian, не включает структуры, которые этот сценарий использует для описания псевдонимов электронной почты. Если мы захотим интегрировать эти данные в каталог, файл /etc/ldap/schema/misc.schema следует добавить в стандартную схему.
Также обратите внимание на использование -c вариант для команды ldapadd; эта опция требует, чтобы обработка не останавливалась в случае ошибки. Использование этой опции необходимо, поскольку преобразование /etc/services часто генерирует несколько ошибок, которые можно безопасно игнорировать.

11.7.3. Управление учетными записями с помощью LDAP

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

11.7.3.1. Конфигурирование NSS

Система NSS (Name Service Switch, см. врезку УГЛУБЛЯЕМСЯ NSS и базы данных системы) представляет собой модульную систему, предназначенную для определения или получения информации для системных каталогов. Использование LDAP в качестве источника данных для NSS требует установки пакета libnss-ldap. Его установка вызывает несколько вопросов; ответы обобщены в Таблица 11.2.

Таблица 11.2. Конфигурирование пакета libnss-ldap:

ВопросОтвет
LDAP сервер URI (Uniform Resource Identifier)ldapi://ldap.falcot.com
Отличительное имя поисковой базыdc=falcot,dc=com
Версия LDAP для использования3
Учётная запись LDAP для rootcn=admin,dc=falcot,dc=com
LDAP root пароль учётной записипароль администратора
Разрешить учётной записи администратора LDAP вести себя как локальный root?yes
Требует ли база данных LDAP входа в систему?нет
Файл /etc/nsswitch.conf затем его необходимо изменить, чтобы настроить NSS для использования только что установленного модуля ldap. Вы можете использовать пример, приведённый в /usr/share/doc/libnss-ldap/examples/nsswitch.ldap или отредактируйте существующую конфигурацию.

Пример 11.23. Файл /etc/nsswitch.conf

#ident $Id: nsswitch.ldap,v 2.4 2003/10/02 02:36:25 lukeh Exp $
#
# Пример файла, который можно скопировать в /etc/nsswitch.conf; 
# он использует соединение LDAP с файлами.
#
# "hosts:" и "services:" в этом файлеиспользуются только если
# файл /etc/netconfig имеет "-" для nametoaddr_libs "inet" транспортов.

# следующие строки убирают "+" запись в /etc/passwd и /etc/group.
passwd:         files ldap
shadow:         files ldap
group:          files ldap

# вначале сверьтесь с DNS, это нужно для резолвинга LDAP хоста. 
# (Если резолвинг невозможен, возникнет бесконечная рекурсия, потому что 
# libldap вызывает gethostbyname(). Осторожно!)
hosts:          dns ldap

# LDAP is nominally authoritative for the following maps.
services:   ldap [NOTFOUND=return] files
networks:   ldap [NOTFOUND=return] files
protocols:  ldap [NOTFOUND=return] files
rpc:        ldap [NOTFOUND=return] files
ethers:     ldap [NOTFOUND=return] files

# пока нет поддержки сетевых масок, загрузочных параметров и открытого ключа.
netmasks:   files
bootparams: files
publickey:  files
automount:  files

# Я уверен nsswitch.conf справляется непосредственно у sendmail,
# поэтому мы мало что можем сделать здесь. Вместо этого, используйте 
# bbense's LDAP правила sendmail.
aliases:    files
sendmailvars:   files

# Примечание. В Solaris (пока) нет поддержки сетевых групп.
netgroup:   ldap [NOTFOUND=return] files
Модуль ldap обычно вставляется раньше других, и поэтому он будет запрошен первым. Заметным исключением является hosts служба, поскольку для связи с сервером LDAP требуется сначала обратиться к DNS (для разрешения ldap.falcot.com). Без этого исключения запрос имени хоста будет пытаться обратиться к серверу LDAP; это вызовет разрешение имени для сервера LDAP и так далее в бесконечном цикле.
Если сервер LDAP следует считать авторитетным (а локальные файлы, используемые модулем files не принимаются во внимание), службы можно настроить с помощью следующего синтаксиса:
service: ldap [NOTFOUND=return] files.
Если запрошенная запись не существует в базе данных LDAP, запрос вернёт ответ «не существует», даже если ресурс существует в одном из локальных файлов; эти локальные файлы будут использоваться только при отключенной службе LDAP.

11.7.3.2. Configuring PAM

В этом разделе описывается конфигурация PAM (см. врезку ЗА КУЛИСАМИ /etc/environment и /etc/default/locale), это позволит приложениям выполнять необходимую аутентификацию в базе данных LDAP.
Модуль LDAP для PAM предоставляется пакетом libpam-ldap. При установке этого пакета возникает несколько вопросов, очень похожих на те, которые приведены в libnss-ldap; некоторые параметры конфигурации (например, URI для сервера LDAP) даже фактически используются совместно с пакетом libnss-ldap. Ответы обобщены в Таблица 11.3.

Таблица 11.3. Configuration of libpam-ldap

ВопросОтвет
Разрешить учетной записи администратора LDAP вести себя как локальный root?Да. Это позволяет использовать обычную команду passwd для изменения паролей, хранящихся в базе данных LDAP.
Требуется ли вход в базу данных LDAP?нет
LDAP account for root:cn=admin,dc=falcot,dc=com
Пароль администратора LDAP:пароль администратора базы данных LDAP
Алгоритм локального шифрования, используемый для паролей:crypt
Профили PAM для включения:Аутентификация LDAP входит в число включённых профилей
Установка libpam-ldap автоматически адаптирует конфигурацию PAM по умолчанию, определённую в файлах /etc/pam.d/common-auth, /etc/pam.d/common-password и /etc/pam.d/common-account. Этот механизм использует выделенный инструмент pam-auth-update (обеспечиваемый пакетом libpam-runtime). Этот инструмент также может запустить администратор, если он хочет включить или отключить модули PAM.

11.7.3.3. Защита обмена данными LDAP

По умолчанию протокол LDAP передается по сети в виде открытого текста; сюда входят (зашифрованные) пароли. Поскольку зашифрованные пароли можно извлечь из сети, они могут быть уязвимы для атак по словарю. Этого можно избежать, используя дополнительный уровень шифрования; включение этого слоя является темой этого раздела.
11.7.3.3.1. Настройка сервера
Первым шагом является создание пары ключей (содержащей открытый ключ и закрытый ключ) для сервера LDAP. Администраторы Falcot повторно используют easy-rsa чтобы его сгенерировать (см.Раздел 10.2.2, «Инфраструктура открытых ключей: easy-rsa»). Запуск ./easyrsa build-server-full ldap.falcot.com nopass спросит вас об “common name”. Ответом на этот вопрос должно быть полное квалифицированное имя (fully-qualified hostname) LDAP сервера; в нашем случае ldap.falcot.com.
Эта команда создает сертификат в файле pki/issued/ldap.falcot.com.crt; соответствующий закрытый ключ хранится в pki/private/ldap.falcot.com.key.
Теперь эти ключи необходимо установить в стандартное расположение и убедиться, что приватный файл доступен для чтения LDAP-серверу, работающему под личностью пользователя openldap:
# adduser openldap ssl-cert
Adding user `openldap' to group `ssl-cert' ...
Adding user openldap to group ssl-cert
Done.
# mv pki/private/ldap.falcot.com.key /etc/ssl/private/ldap.falcot.com.key
# chown root.ssl-cert /etc/ssl/private/ldap.falcot.com.key
# chmod 0640 /etc/ssl/private/ldap.falcot.com.key
# mv pki/issued/ldap.falcot.com.crt /etc/ssl/certs/ldap.falcot.com.pem
# chown root.root /etc/ssl/certs/ldap.falcot.com.pem
# chmod 0644 /etc/ssl/certs/ldap.falcot.com.pem
Демону slapd также необходимо указать, что нужно использовать эти ключи для шифрования. Конфигурация сервера LDAP управляется динамически: конфигурацию можно обновлять с помощью обычных операций LDAP на иерархии объектов cn=config и обновлений сервера /etc/ldap/slapd.d в режиме реального времени, чтобы сделать конфигурацию постоянной. ldapmodify таким образом, это правильный инструмент для обновления конфигурации:

Пример 11.24. Configuring slapd for encryption

# cat >ssl.ldif <<END
dn: cn=config
changetype: modify
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.falcot.com.key
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
END
# ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
# systemctl restart slapd.service
# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config -s base | grep TLS
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
olcTLSCertificateKeyFile: /etc/ssl/certs/ldap.falcot.com.key
Последний шаг для включения шифрования включает изменение переменной SLAPD_SERVICES в файле /etc/default/slapd. Мы будем действовать осторожно и вообще отключим незащищённый LDAP.

Пример 11.25. Файл /etc/default/slapd

# Умолчальное местоположение slapd.conf file или slapd.d cn=config directory.
# Если пусто, используйте вкомпиленный умолчальный (/etc/ldap/slapd.d с возвратом к
# /etc/ldap/slapd.conf).
SLAPD_CONF=

# Системная учётная запись, под которой будет запущен сервер slapd. 
# Если пусто, сервер будет работать от имени пользователя root.
SLAPD_USER="openldap"

# Системная группа, под которой будет запущен сервер slapd.
# Если пусто, сервер будет работать от имени первичной группы этого пользователя.
SLAPD_GROUP="openldap"

# Путь к pid файлу slapd сервера. Если не установлен init.d скрипт
# попробовать выяснить из $SLAPD_CONF (/etc/ldap/slapd.d
# по умолчанию)
SLAPD_PIDFILE=

# slapd в норме обслуживает ldap только на всех TCP портах 389. slapd также может
# обслуживать запросы на TCP порту 636 (ldaps) и запросы через unix
# сокеты.
# Пример использования:
# SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
SLAPD_SERVICES="ldaps:/// ldapi:///"

# Если SLAPD_NO_START установлен, init скрипт не запустится или не перезапустится
# slapd (но стоп всё равно будет работать). Раскомментируйте это если вы
# запустили slapd с помощью каких-то других средств или если не хотите чтобы slapd
# нормально запускался при загрузке.
#SLAPD_NO_START=1

# Если в SLAPD_SENTINEL_FILE установлен путь к файлу, и этот файл существует,
# init скрипт не запустит или не перезапустит slapd (но стоп всё равно будет работать).
# Используйте это для временного отключения запуска slapd (при выполнении
# обслуживания, к примеру, или через систему управления конфигурацией)
# когда вы не хотите редактировать конфигурационный файл.
SLAPD_SENTINEL_FILE=/etc/ldap/noslapd

# Для Kerberos аутентификации (через SASL), slapd умолчально использует system
# keytab файл (/etc/krb5.keytab). Для использования другого keytab файла,
# раскомментируйте эту строку и измените путь к нему.
#export KRB5_KTNAME=/etc/krb5.keytab

# Дополнительные опции для передачи в slapd
SLAPD_OPTIONS=""
11.7.3.3.2. Настройка Клиента
На стороне клиента конфигурация для модулей libpam-ldap и libnss-ldap должна быть изменена, чтобы использовать ldaps:// URI.
Клиенты LDAP также должны иметь возможность аутентифицировать сервер. В инфраструктуре открытых ключей X.509 открытые сертификаты подписываются ключом центра сертификации (CA). С easy-rsa, Администраторы Falcot создали свой собственный центр сертификации, и теперь им необходимо настроить систему так, чтобы она доверяла подписям центра сертификации Falcot. Это можно сделать, поместив сертификат CA в /usr/local/share/ca-certificates и запустить update-ca-certificates.
# cp pki/ca.crt /usr/local/share/ca-certificates/falcot.crt
# update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

Adding debian:falcot.pem
done.
done.
И последнее, но не менее важное: URI LDAP по умолчанию и базовый DN по умолчанию, используемые различными инструментами командной строки, можно изменить в /etc/ldap/ldap.conf. Это позволит сэкономить немало времени на наборе текста.

Пример 11.26. Файл /etc/ldap/ldap.conf

#
# LDAP умолчания
#

# См. ldap.conf(5) для подробностей
# Этот файл должен быть доступен для чтения всем, но не доступен для записи.

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-provider.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

# TLS сертификаты (необходимо для GnuTLS)
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt