Настройка LDAPS/StartTLS для OpenLDAP#
Введение#
В этом примере будет показана пошаговая настройка LDAP сервера на ОС Debian 10 "buster". Для других Linux дистрибутивов отличие может быть лишь в расположении конфигурационных файлов, а также в командах по установке необходимых пакетов.
В тексте используется следующее общепринятое соглашение перед листингом команд:
- команды после символа # выполняются от имени root.
- команды после символа $ выполняются от обычного пользователя.
Установка необходимых пакетов#
Установка всех пакетов производится на один сервер. Этот сервер объединяет в себе роли DNS и LDAP-сервера. Дополнительно на нем будет развернут Удостоверяющий Центр (УЦ) для выпуска сертификатов, используемых в TLS-соединении. В реальном применении рекомендуется разнесение каждой из этих ролей на отдельные серверы.
Список необходимых пакетов для установки представлен в таблице ниже:
| Название пакета | Описание |
|---|---|
| dnsmasq | Пакет, который позволяет настраивать DNS, DHCP и TFTP-сервера. В примере используется только DNS-сервер. |
| slapd | Демон, обеспечивающий функции LDAP-сервера, входящий в проект OpenLDAP. |
| ldap-utils | Набор утилит, используемых для взаимодействия с LDAP-сервером для конфигурации и просмотра информации. |
На свежеустановленной или обновленной системе, для установки с помощью пакетного менеджера apt, необходимо воспользоваться командой
В процессе установки будет предложено установить пароль администратора LDAP. В дальнейшем этот пароль будет изменен с помощью утилиты slappasswd.
Начальная конфигурация#
Настройка статического IP-адреса#
Перед настройкой сервисов необходимо задать статический IP-адрес на сервере. Для этого на интерфейсе, который подключен в локальную сеть, установите следующие настройки:
- IP address: 192.168.122.250
- Netmask: 255.255.255.0
- Default Gateway: 192.168.122.1
Настройка DNS-сервера#
Необходимость использования отдельного локального DNS-сервера связана с тем, что для проверки подлинности серверного сертификата при установлении TLS-соединения производится проверка подлинности сертификата.
В Numa Edge за проверку подлинности сертификата отвечает параметр
который по умолчанию установлен в значение enable. Отключение проверки подлинности сертификата строго не рекомендуется.
Проверка подлинности осуществляется путем поиска соответствия IP-адреса и DNS-имени LDAP-сервера со значениями полей subjectAltName и CN-сертификата, который сервер передает клиенту в сообщении Server Hello при установлении TLS-соединения.
Поскольку выпуск сертификата со значением CN равным IP-адресу LDAP-сервера существенно сокращает гибкость применения такой схемы, для CN рекомендуется задавать именно DNS-имя. Следующим соображением является то, что в случае масштабируемости схемы и добавлении нескольких LDAP-клиентов, на каждом из них необходимо будет поддерживать статические DNS-записи в актуальном состоянии.
Данные факты приводят к необходимости настройки отдельного локального DNS-сервера.
Конфигурация DNS-сервера представлена в листинге ниже. Хорошей идеей является создание отдельного конфигурационного файла в каталоге /etc/dnsmasq.d/, вместо редактирования стандартного /etc/dnsmasq.conf.
Создайте файл /etc/dnsmasq.d/dns.conf, в котором укажите следующие директивы:
Протестировать конфигурацию на наличие синтаксических ошибок перед запуском можно с помощью команды
Далее необходимо настроить обработку внутренних DNS-запросов через локальный DNS-сервер:
Теперь необходимо перезапустить службу dnsmasq:
Настройка LDAP-сервера#
Настройка LDAP-сервера будет осуществляться с помощью метода динамической конфигурации времени исполнения (OLC, On-Line Configuration). Данный метод позволяет изменять конфигурации без необходимости остановки и перезапуска демона slapd.
Изменения вносятся в специальное информационное дерево каталогов (directory information tree, DIT) с жестко привязанным значением cn=config. Необходимые изменения вносятся в специальный файл формата LDIF (LDAP Data Interchange Format), который затем добавляется на LDAP-сервер с помощью утилит из пакета ldap-utils.
После первоначальной настройки и во время эксплуатации более удобным способом для внесения небольших изменений является использование LDAP-браузеров (Apache Directory Studio, Kldap и др).
Инициализация конфигурации каталога#
Перед началом настройки будет удобно создать отдельный каталог, в котором будут храниться LDIF-файлы:
Сохраним содержимое стандартных каталогов slapd перед внесением изменений в каталог с тем же названием, добавив приписку .bcp:
Создадим пустой каталог для нашей новой конфигурации:
Создадим файл init-config.ldif с новой конфигурацией и запишем в него:
В этом файле для начала указывается корневая запись DIT, которая, как было сказано ранее, необходима для метода OLC. С помощью директив olcPidFile и olcArgsFile указывается куда необходимо записать ID процесса службы каталогов и аргументы его запуска соответственно.
Далее задается служебная база данных конфигурации cn=config. Также добавляется правило доступа (ACL, Access Control List), разрешающее манипулировать ей от имени пользователя root (uid=0, gid=0) с помощью механизма SASL EXTERNAL и идентификационной сущности IPC. Необходимо помнить, что в конце каждого ACL, если не задан модификатор break, подразумевается наличие правила by * none. То есть остальной доступ к объекту в условии to – запрещён.
Инициализируем конфигурацию с помощью команды:
Модификатор -n 0 говорит о том, что мы добавляем данные в базу данных с индексом 0, который зарезервирован для cn=config. Если его не указать, slapadd по умолчанию будет пытаться добавить данные в первую базу данных с индексом больше нуля (обычно это первая по списку пользовательская база данных).
Примечание
Утилиты slapadd и ldapadd выполняют одни и те же функции по добавлению новых записей в каталог LDAP, однако имеют два важных отличия: Все утилиты OpenLDAP, название которых начинается с slap, работают только локально на LDAP-сервере. Утилиты, начинающиеся с ldap, работают через протокол LDAP и могут работать по сети. Перед внесением изменений с помощью с утилит, начинающихся с slap, необходимо ОБЯЗАТЕЛЬНО остановить демон slapd.
Проверить на ошибки конфигурацию можно с помощью команды:
Последним этапом первоначальной настройки является изменения прав доступа для каталога slapd, который был создан ранее из-под пользователя root.
Запуск службы каталогов#
Теперь можно запустить демон slapd с помощью команды:
Убедимся, что запуск был успешен, воспользовавшись утилитой journalctl. В случае успешного запуска вы увидите примерно следующий результат:
Убедимся, что процесс slapd "слушает" порт TCP/389.
Убедимся, что UNIX-сокет тоже активен:
И проверим ранее добавленную конфигурацию OLC с помощью утилиты ldapsearch:
Краткое описание аргументов команды:
представлено ниже:
- -Q – не выводит служебную информацию режима SASL
- -LLL – не выводит служебную информацию LDIF
- -Y EXTERNAL вместе с аргументом -H ldapi:/// указывают на использование аутентификации с помощью механизма межпроцессорного взаимодействия (Unix IPC)
- -b 'cn=config' – где производится поиск
- dn – записи какого типа найти
Подключение динамических модулей#
Для корректной работы необходимо два модуля. Один – для механизма базы данных mdb (Memory-Mapped Database, отображаемая в памяти базы данных), который оптимизирован для выполнения операций чтения. Второй модуль – monitor, для создания и динамической поддержки ветки с информацией о текущем статусе демона slapd.
Чтобы их подключить создается LDIF-файл, в котором описываются изменения каталога cn=module,cn=config. Пусть файл будет назван add-modules.ldif со следующим содержимым:
В атрибуте olcModulePath указывается путь до модулей, хранящихся файловой системе. В атрибуте olcModuleLoad – название подключаемых модулей, относительно данного каталога.
Добавим наш LDIF-файл в конфигурацию:
Добавление наборов схем данных#
Схемы данных представляют собой коллекции атрибутов и объектных классов, которые будут использоваться при создании записей в каталогах LDAP. С пакетом OpenLDAP поставляется большой набор схем данных, которые хранятся в каталоге /etc/ldap/schema/, однако по умолчанию они не используются и их необходимо добавлять вручную. Для этого создадим LDIF-файл с необходимыми нам наборами схем данных. Порядок их следования в файле очень важен! Атрибуты наборов схем иерархически связаны и требуют их объявления с соблюдением иерархии.
Примечание
Если в результате добавления нового атрибута будет возвращена ошибка, описанная ниже:
то это значит, что производится попытка добавления атрибута, для которого отсутствует добавленная схема данных. В таком случае необходимо добавить требуемую схему данных для указанного атрибута.В таблице ниже приведена информация об используемых схемах данных.
| Файл схемы данных | Описание |
|---|---|
| core.ldif | Базовая схема данных, которая является обязательной для добавления. |
| cosine.ldif | Набор классов и атрибутов, использующий спецификацию Cosine и Internet X.500. Описан в RFC 4524. |
| nis.ldif | Применяется для отображения TCP/IP и UNIX атрибутов в формат X.500. Описан RFC 2307. |
| inetorgperson.ldif | Описывает расширенные пользовательские атрибуты, такие как uid, mail,display name и т.д. Описан в RFC 2798. |
Схемы данных, распространяемые с пакетом OpenLDAP, хранятся в каталоге /etc/ldap/schema. Создадим файл add-schemas.ldif и запишем в него абсолютные пути до требуемых схем данных:
Добавьте схемы данных:
И проверьте корректность их добавления:
Команде ldapsearch, помимо уже используемых ранее параметров, передаются -s one, для которого возвращает записи на один уровень ниже записи в параметре -b, а 1.1 указывает, что необходимо вернуть только записи без атрибутов.
Примечание
Обратите внимание, что после добавления схем, каждой из них был присвоен номер в формате cn={Z}xxx,cn=schema,cn=config, где {Z} — числовой счётчик, нумерация которого начинается с 0, а xxxx — имя набора схемы данных. Нумерация производится в порядке добавления, таким образом схема core имеет значение 0, cosine – 1 и т.д. Если вы захотите дополнительно добавить еще одну схему, ей будет присвоен следующий свободный номер. Если попытаться добавить новую схему, явно указав порядковый номер, то в зависимости от того, как сформирован LDIF-файл и какая утилита используется, возможна как и замена существующей записи, так и получение ошибки при добавлении. Подобный пример будет продемонстрирован в дальнейшем.
Инициализация базы данных#
После подготовки конфигурации произведите настройку самой базы данных LDAP.
Первоначально измените пароль администратора, который был задан при установке. Для этого воспользуйтесь утилитой slappasswd, которая генерирует посоленный хеш вводимого пароля, используя алгоритм SHA-1.
Полученный хеш необходимо добавить в атрибут olcRootPW конфигурационного LDIF-файл базы данных db.ldif.
Другими атрибутами, заслуживающими внимания, являются:
- olcDatabase – используется ранее добавленный модуль mdb;
- olcSuffix – корневая запись DIT, значением которой является имя домена DNS;
- olcDbDirectory – путь к каталогу базы данных в файловой системе. Данный атрибут является обязательным и требует существования каталога на момент загрузки конфигурации;
- olcDbMaxsize – еще один обязательный атрибут, требующий задания максимального размера базы данных. В файловой системе должно быть достаточно свободного места для размещения базы данных такого размера;
- olcRootDN – DN администратора базы данных. Этот пользователь обладает полным доступом ко всей базе данных, поэтому необходимо надежно хранить его пароль;
- olcAccess – атрибут описывающий правила доступа к базе данных:
- Доступ ко всей базе данных (to *):
- Разрешить доступ пользователю root с использованием механизма SASL EXTERNAL.
- Продолжить анализ ACL, если нет совпадений с субъектами доступа, указанными с помощью директивы by.
- Доступ к атрибуту userPassword (to attrs=userPassword):
- Разрешить доступ для смены пароля самим пользователем.
- Разрешить доступ для аутентификации.
- Доступ к остальной базе данных:
- Разрешить пользователям просматривать свои записи.
Далее через пустую строку описывается еще один ранее добавленный модуль monitor.
Для базы данных необходимо создать каталог и задать ему права доступа:
Загрузите конфигурацию базы данных:
Определите RootDN для доступа к конфигурации службы каталогов. Он будет ссылаться на RootDN, находящийся в данной БД. Эта запись желательна только при первоначальной настройке или в тестовой конфигурации. Не оставляйте её в "боевой" системе! Для {-1}frontend задайте минимально необходимые права для доступа к RootDSE. Создадим LDIF-файл acl-mod.ldif, модифицирующий права доступа:
Загрузите LDIF, изменяющий ACL:
Действия выше еще больше повысили значимость учётной записи администратора. С её помощью теперь можно получить полный доступ к службе каталогов.
Проверьте корректность всех ACL и, заодно, наличие всех добавленных данных (вывод отформатирован для наглядности):
Убедитесь, что учётная запись администратора имеет доступ службе каталогов:
Если полученный результат соответствует приведенному выше, то LDAP-сервер настроен корректно.
Отредактируйте файл /etc/ldap/ldap.conf. Это нужно только для того, чтобы немного упростить себе жизнь и меньше печатать в дальнейшем. В BASE подставьте свой суффикс, а в URI – FQDN Вашего сервера OpenLDAP:
Теперь необходимо наполнить базу данных LDAP-сервера полезной информацией, а именно задать пользователей и группы.
Добавление пользователей и групп в OpenLDAP#
Необходимо создать файл LDIF с именем add_content.ldif. Пожалуй, содержимое данного файла является самым большим во всей инструкции. Первая сущность описывает корневой суффикс базы данных (DIT), которая имеет значение dc=openldap,dc=local. Далее создаются две организационные единицы (Organizational Unit, OU) для хранения пользователей и групп.
Затем создаются три пользователя:
- uid=john, userPassword=test
- uid=oper, userPassword=oper
-
uid=test, userPassword=test#
Задается пароль для всех пользователей указывается в открытом виде, но в дальнейшем для пользователя oper будет изменен на хешированное значение с помощью утилиты ldappasswd.
Помимо этого, для каждого пользователя задаются атрибуты:
- sn
- givenName
- cn
- displayName
- uidNumber
- gidNumber
- gecos
- loginShell
-
homeDirectory#
Содержимое файла add_content.ldif представлено ниже.
Добавьте данную конфигурацию с помощью команды ldapadd следующим образом:
В случае успеха, будет получен следующий вывод на консоль:
Репозиторий NFS netgroup на основе OpenLDAP#
Для того чтобы проходить аутентификацию на Numa Edge, используя учетные данные LDAP-сервера, необходимо добавить еще одну сущность: netgroup.
В настоящий момент в Numa Edge существуют следующие ограничения:
- для пользователя обязательно должен быть указан домашний каталог (homeDirectory);
- значение uidNumber должно быть больше 10000;
- если пользователь принадлежит netgroup с названием edge-admin, после аутентификации данный пользователь будет иметь права администратора на Numa Edge;
-
если пользователь принадлежит netgroup с названием edge-op, после аутентификации данный пользователь будет иметь права оператора на Numa Edge.#
Перед добавлением, необходимо убедиться в наличии схемы NIS, внутри которой содержатся классы netgroup.
Проверим содержимое самой схемы для подтверждения утверждения, описанного выше.
Теперь необходимо создать LDIF-файл, в котором будет добавлен атрибут nisNetgroupTriple. Данный атрибут имеет следующий формат:
В данном примере не будет ограничена возможность пользователя подключаться только к определенным хостам или доменам, поэтому значения данных полей будут оставлены пустыми. Для добавления пользователя john в netgoup со значением edge-admin, создайте следующий LDIF-файл.
Теперь необходимо загрузить данную конфигурацию на LDAP-сервер.
В случае успеха будет следующий результат:
Настройка контроля доступа#
Следующим этапом конфигурации будет включение анонимного доступа для чтения базы пользователей и групп. Данный метод имеет как свои недостатки, так и достоинства. К минусам можно отнести то, что потенциально любой находящийся в сети предприятия пользователь может узнать полный перечень ее сотрудников, включая информацию о паролях. Для устранения этого недостатка рекомендуется настроить шифрование LDAP-трафика с помощью TLS. А вот отсутствие необходимости использовать учетные данные администратора LDAP для доступа к каталогу, и настройка этих учетных данных на Numa Edge – является большим плюсом. В целом же данная конфигурация является опциональной и решение о ее применении должно приниматься согласно политике безопасности внутри организации.
Первоначально, узнайте текущую конфигурацию доступа к базе LDAP с помощью данной команды:
На текущий момент администратор LDAP имеет полный доступ к системе, а остальные авторизированные пользователи могут только изменять свой пароль.
Файл anonimous-bind.ldif задает возможность чтения содержимого пользователей и групп без аутентификации. Поскольку каждой сущности olcAccess присваивается номер, согласно порядку ее добавления, необходимо удалить существующую под номером 1 и только после этого добавить новые.
Измените конфигурацию доступа к базе LDAP с помощью следующей команды:
И проверьте успешность применения конфигурации:
Включение поддержки StartTLS LDAP#
Удостоверяющий центр на основе самоподписанного сертификата с помощью OpenSSL#
Для шифрования данных с помощью TLS используется механизм StartTLS, который работает на порту TCP/389. Механизм LDAPS признан устаревшим в RFC2830, хоть и широко используется. Numa Edge не поддерживает механизм LDAPS.
В целом, для обеспечения шифрования данных можно использовать сертификаты, сгенерированные на стороннем сервере УЦ и импортированных на LDAP-сервер и Numa Edge. Но в данном примере рассмотрим генерацию сертификатов на самом LDAP-сервере.
Создание УЦ#
Первоначально необходимо сгенерировать ключ УЦ в формате RSA и размером 2048 бит.
Далее необходимо создать конфигурационный файл certCA.conf с описанием полей сертификата УЦ:
Теперь необходимо сгенерировать сам сертификат:
Создание сертификата сервера LDAP#
Теперь необходимо создать ключ сертификата, используемого LDAP-сервером:
Конфигурационный файл certLDAP.conf для сертификата будет следующий:
Первоначально необходимо создать запрос на выпуск сертификата. В реальном использовании генерация ключа должна производиться только на том сервере, где будет использоваться сертификат, а на УЦ передаваться только запрос на выпуск сертификата.
И выпустим конечный сертификат, согласно полученному запросу.
Теперь необходимо создать каталог, в котором будет храниться ключ и сертификат LDAP-сервера, и изменить права на данном каталоге.
Создание сертификата клиента для Numa Edge#
Поскольку ранее было отключено требование на аутентификацию для просмотра содержимого пользователя и групп, то необходимо обеспечить другой метод сохранности этих данных. Для этого сгенерируем сертификат клиента, который будет использоваться при установлении TLS-соединения. В настройках LDAP-сервера далее будет указан атрибут, который будет отвергать соединения без валидного сертификата. Аналогично предыдущему примеру генерируется закрытый ключ клиента:
Конфигурационный файл certLDAP_edge.conf для сертификата будет выглядеть следующим образом (основное отличие – это X509-расширения, необходимые для клиентской стороны).
Далее необходимо сгенерировать запрос на выпуск сертификата:
И на его основе выпустить сертификат:
Теперь данные файлы необходимо скопировать на Numa Edge любым удобным способом. Важно помнить, что при передаче закрытого ключа необходимо использовать только надежные каналы передачи данных. Созданные файлы необходимо импортировать на Numa Edge:
Далее создать конфигурационный файл tls-config.ldif, в котором будет описано расположение сертификатов и закрытого ключа, необходимое для работы StartTLS (Их нужно скопировать в папки как указано в конфигурационном файле ниже). Атрибут olcTLSVerifyClient описывает требования к клиентскому сертификату. В данном случае значение demand указывает, что если сертификат не был представлен или не прошел проверку, необходимо оборвать соединение.
Загрузите данную конфигурацию на LDAP-сервер:
Настройки Edge#
Конфигурация для подключения к LDAP-серверу и использования данных с LDAP для аутентификации на Numa Edge выглядит следующим образом:
Проверка аутентификации на Numa Edge: