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

The NSS system (Name Service Switch, see sidebar УГЛУБЛЯЕМСЯ NSS и базы данных системы) is a modular system designed to define or fetch information for system directories. Using LDAP as a source of data for NSS requires installing the libnss-ldapd package.
The /etc/nsswitch.conf file then needs to be modified, so as to configure NSS to use the freshly-installed ldap module.

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

# /etc/nsswitch.conf
#
# An example file that could be copied over to /etc/nsswitch.conf; it
# uses LDAP conjunction with files.
#
# "hosts:" and "services:" in this file are used only if the
# /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports.

# the following lines obviate the "+" entry in /etc/passwd and /etc/group.
passwd:         files ldap
shadow:         files ldap
group:          files ldap

# consult DNS first, we will need it to resolve the LDAP host. (If we
# can't resolve it, we're in infinite recursion, because libldap calls
# gethostbyname(). Careful!)
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

# no support for netmasks, bootparams, publickey yet.
netmasks:   files
bootparams: files
publickey:  files
automount:  files

# I'm pretty sure nsswitch.conf is consulted directly by sendmail,
# here, so we can't do much here. Instead, use bbense's LDAP
# rules ofr sendmail.
aliases:    files
sendmailvars:   files

# Note: there is no support for netgroups on Solaris (yet)
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.
The LDAP module for PAM is provided by the libpam-ldapd package. Installing this package asks a few questions very similar to those in libnss-ldapd; some configuration parameters (such as the URI for the LDAP server) are even actually shared with the libnss-ldapd package.
Installing libpam-ldapd automatically adapts the default PAM configuration defined in the /etc/pam.d/common-auth, /etc/pam.d/common-password and /etc/pam.d/common-account files. This mechanism uses the dedicated pam-auth-update tool (provided by the libpam-runtime package). This tool can also be run by the administrator should they wish to enable or disable PAM modules.

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. Настройка Клиента
On the client side, the configuration for the libpam-ldapd and libnss-ldapd modules needs to be modified to use an 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