Вступление
OpenLDAP предоставляет службу каталогов LDAP, которая является гибкой и хорошо поддерживается. Однако из коробки сам сервер обменивается данными через незашифрованное веб-соединение. В этом руководстве мы продемонстрируем, как зашифровать соединения с OpenLDAP с помощью STARTTLS для обновления обычных соединений до TLS. Мы будем использовать Ubuntu 14.04 в качестве нашего сервера LDAP.
Предпосылки
Прежде чем вы начнете работу с этим руководством, у вас должен быть пользователь без полномочий root сsudo
, установленным на вашем сервере. Чтобы настроить пользователя этого типа, следуйте нашимUbuntu 14.04 initial setup guide.
В этом руководстве мы расскажем, как установить OpenLDAP на сервер Ubuntu 14.04. Если на вашем сервере уже установлен OpenLDAP, вы можете пропустить соответствующие этапы установки и настройки.
LDAP через SSL против LDAP с STARTTLS
Существует два способа шифрования соединений LDAP с помощью SSL / TLS.
Традиционно соединения LDAP, которые необходимо было зашифровать, обрабатывались через отдельный порт, обычно636
. Все соединение будет обернуто с SSL / TLS. Этот процесс, называемый LDAP через SSL, использует протоколldaps://
. Этот метод шифрования теперь устарел.
STARTTLS - это альтернативный подход, который сейчас является предпочтительным методом шифрования соединения LDAP. STARTTLS «обновляет» незашифрованное соединение, оборачивая его SSL / TLS после / во время процесса соединения. Это позволяет обрабатывать незашифрованные и зашифрованные соединения одним и тем же портом. Это руководство будет использовать STARTTLS для шифрования соединений.
Установка имени хоста и полного доменного имени
Прежде чем начать, мы должны настроить наш сервер так, чтобы он правильно определял свое имя хоста и полное доменное имя (FQDN). Это будет необходимо для того, чтобы наши сертификаты были проверены клиентами. Предположим, что наш сервер LDAP будет размещен на машине с полным доменным именемldap.example.com
.
Чтобы установить имя хоста во всех соответствующих местах на вашем сервере, используйте командуhostnamectl
с параметромset-hostname
. Установите для имени хоста короткое имя хоста (не включайте компонент имени домена):
sudo hostnamectl set-hostname ldap
Затем нам нужно установить полное доменное имя нашего сервера, убедившись, что наш файл/etc/hosts
содержит правильную информацию:
sudo nano /etc/hosts
Найдите строку, которая отображает IP-адрес127.0.1.1
. Измените первое поле после IP-адреса на полное доменное имя сервера, а второе поле на короткое имя хоста. Для нашего примера это будет выглядеть примерно так:
/etc/hosts
. . .
127.0.1.1 ldap.example.com ldap
127.0.0.1 localhost
. . .
Сохраните и закройте файл, когда вы закончите.
Вы можете проверить правильность настройки этих значений, набрав:
hostname
Это должно вернуть ваше короткое имя хоста:
короткое имя хоста
ldap
Проверьте полное доменное имя, набрав:
hostname -f
Это должно вернуть полное доменное имя:
Настройка полного доменного имени
ldap.example.com
Установка сервера LDAP и программного обеспечения GnuTLS
Убедившись, что ваше имя хоста установлено правильно, мы можем установить необходимое нам программное обеспечение. Если у вас уже установлен и настроен OpenLDAP, вы можете пропустить первый подраздел.
Установите сервер OpenLDAP
Если у вас еще не установлен OpenLDAP, сейчас самое время это исправить. Обновите локальный индекс пакетов вашего сервера и установите программное обеспечение, набрав:
sudo apt-get update
sudo apt-get install slapd ldap-utils
Вас попросят предоставить административный пароль LDAP. Не стесняйтесь пропустить приглашение, так как мы будем перенастраивать сразу после.
Чтобы получить доступ к некоторым дополнительным запросам, которые нам нужны, мы переконфигурируем пакет после установки. Для этого введите:
sudo dpkg-reconfigure slapd
Ответьте на соответствующие запросы, используя приведенную ниже информацию в качестве отправной точки:
-
Пропустить конфигурацию сервера OpenLDAP? No (нам нужна исходная база данных и конфигурация)
-
Доменное имя DNS:
example.com
(используйте доменное имя сервера без имени хоста. Это будет использоваться для создания базовой записи для информационного дерева) -
Название организации:Example Inc (это просто будет добавлено в базовую запись как название вашей организации)
-
Пароль администратора: [что бы вы ни хотели]
-
Подтвердите пароль: [должен соответствовать указанному выше]
-
Бэкэнд базы данных для использования:HDB (из двух вариантов наиболее функциональный)
-
Вы хотите удалить базу данных при удалении slapd? (твой выбор. Выберите «Да», чтобы разрешить полное удаление, выберите «Нет», чтобы сохранить ваши данные даже после удаления программного обеспечения).
-
Переместить старую базу данных? Yesс
-
Разрешить протокол LDAPv2? Noс
Установите компоненты SSL
Как только ваш сервер OpenLDAP настроен, мы можем продолжить и установить пакеты, которые мы будем использовать для шифрования нашего соединения. Пакет Ubuntu OpenLDAP скомпилирован с библиотеками SSL GnuTLS, поэтому мы будем использовать GnuTLS для генерации наших учетных данных SSL:
sudo apt-get install gnutls-bin ssl-cert
Установив все наши инструменты, мы можем начать создавать сертификаты и ключи, необходимые для шифрования наших соединений.
Создайте шаблоны сертификатов
Чтобы зашифровать наши соединения, нам нужно настроить центр сертификации и использовать его для подписи ключей для серверов LDAP в нашей инфраструктуре. Поэтому для настройки нашего отдельного сервера нам понадобятся два набора пар ключ / сертификат: один для самого центра сертификации и один, связанный со службой LDAP.
Чтобы создать сертификаты, необходимые для представления этих объектов, мы создадим несколько файлов шаблонов. Они будут содержать информацию, которая необходима утилитеcerttool
для создания сертификатов с соответствующими свойствами.
Начните с создания каталога для хранения файлов шаблонов:
sudo mkdir /etc/ssl/templates
Создать шаблон CA
Сначала создайте шаблон для центра сертификации. Назовем файлca_server.conf
. Создайте и откройте файл в вашем текстовом редакторе:
sudo nano /etc/ssl/templates/ca_server.conf
Нам нужно только предоставить несколько частей информации, чтобы успешно создать центр сертификации. Нам нужно указать, что сертификат будет для CA (центра сертификации), добавив опциюca
. Нам также нужна опцияcert_signing_key
, чтобы дать сгенерированному сертификату возможность подписывать дополнительные сертификаты. Мы можем установитьcn
на любое описательное имя, которое мы хотим для нашего центра сертификации:
caserver.conf
cn = LDAP Server CA
ca
cert_signing_key
Сохраните и закройте файл.
Создайте шаблон службы LDAP
Затем мы можем создать шаблон для нашего сертификата сервера LDAP с именемldap_server.conf
. Создайте и откройте файл в текстовом редакторе с правамиsudo
:
sudo nano /etc/ssl/templates/ldap_server.conf
Здесь мы предоставим несколько разных частей информации. Мы предоставим название нашей организации и зададим параметрыtls_www_server
,encryption_key
иsigning_key
, чтобы наш сертификат имел базовые функции, которые ему необходимы.
cn
в этом шаблонеmust соответствует FQDN сервера LDAP. Если это значение не совпадает, клиент отклонит сертификат сервера. Мы также установим срок действия сертификата. Мы создадим 10-летний сертификат, чтобы избежать необходимости частых продлений:
ldapserver.conf
organization = "Example Inc"
cn = ldap.example.com
tls_www_server
encryption_key
signing_key
expiration_days = 3652
Сохраните и закройте файл, когда вы закончите.
Создать CA ключ и сертификат
Теперь, когда у нас есть наши шаблоны, мы можем создать две наши пары ключ / сертификат. Сначала нужно создать набор центра сертификации.
Используйте утилитуcerttool
, чтобы сгенерировать закрытый ключ. Каталог/etc/ssl/private
защищен от пользователей без полномочий root и является подходящим местом для размещения секретных ключей, которые мы будем генерировать. Мы можем сгенерировать закрытый ключ и записать его в файл с именемca_server.key
в этом каталоге, набрав:
sudo certtool -p --outfile /etc/ssl/private/ca_server.key
Теперь мы можем использовать только что сгенерированный закрытый ключ и файл шаблона, который мы создали в последнем разделе, для создания сертификата центра сертификации. Мы запишем это в файл в каталоге/etc/ssl/certs
с именемca_server.pem
:
sudo certtool -s --load-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ca_server.conf --outfile /etc/ssl/certs/ca_server.pem
Теперь у нас есть личный ключ и пара сертификатов для нашего центра сертификации. Мы можем использовать это для подписи ключа, который будет использоваться для фактического шифрования сеанса LDAP.
Создать сервисный ключ и сертификат LDAP
Далее нам нужно сгенерировать закрытый ключ для нашего сервера LDAP. Мы снова поместим сгенерированный ключ в каталог/etc/ssl/private
в целях безопасности и назовем файлldap_server.key
для ясности.
Мы можем сгенерировать соответствующий ключ, набрав:
sudo certtool -p --sec-param high --outfile /etc/ssl/private/ldap_server.key
Когда у нас есть закрытый ключ для сервера LDAP, у нас есть все, что нам нужно для генерации сертификата для сервера. Нам нужно будет включить почти все созданные нами компоненты (сертификат и ключ CA, ключ сервера LDAP и шаблон сервера LDAP).
Мы поместим сертификат в каталог/etc/ssl/certs
и назовем егоldap_server.pem
. Команда нам нужна:
sudo certtool -c --load-privkey /etc/ssl/private/ldap_server.key --load-ca-certificate /etc/ssl/certs/ca_server.pem --load-ca-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ldap_server.conf --outfile /etc/ssl/certs/ldap_server.pem
Предоставьте OpenLDAP доступ к ключу сервера LDAP
Теперь у нас есть все необходимые сертификаты и ключи. Однако в настоящее время наш процесс OpenLDAP не сможет получить доступ к своему собственному ключу.
Группа с именемssl-cert
уже существует как владелец группы каталога/etc/ssl/private
. Мы можем добавить пользователя, под которым работает наш процесс OpenLDAP (openldap
), в эту группу:
sudo usermod -aG ssl-cert openldap
Теперь наш пользователь OpenLDAP имеет доступ к каталогу. Тем не менее, нам все еще нужно предоставить этой группе право собственности на файлldap_server.key
, чтобы мы могли разрешить доступ для чтения. Предоставьте группеssl-cert
право собственности на этот файл, набрав:
sudo chown :ssl-cert /etc/ssl/private/ldap_server.key
Теперь предоставьте группеssl-cert
доступ для чтения к файлу:
sudo chmod 640 /etc/ssl/private/ldap_server.key
Наш процесс OpenSSL теперь может правильно обращаться к файлу ключа.
Настройте OpenLDAP для использования сертификата и ключей
У нас есть наши файлы, и мы правильно настроили доступ к компонентам. Теперь нам нужно изменить нашу конфигурацию OpenLDAP, чтобы использовать созданные нами файлы. Мы сделаем это, создав файл LDIF с нашими изменениями конфигурации и загрузив его в наш экземпляр LDAP.
Перейдите в свой домашний каталог и откройте файл с именемaddcerts.ldif
. Мы поместим наши изменения конфигурации в этот файл:
cd ~
nano addcerts.ldif
Чтобы внести изменения в конфигурацию, нам нужно нацелить записьcn=config
конфигурационного DIT. Нам нужно указать, что мы хотим изменить атрибуты записи. После этого нам нужно добавить атрибутыolcTLSCACertificateFile
,olcCertificateFile
иolcCertificateKeyFile
и установить их в правильные местоположения файлов.
Конечный результат будет выглядеть так:
addcerts.ldif
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key
Сохраните и закройте файл, когда вы закончите. Примените изменения к вашей системе OpenLDAP с помощью командыldapmodify
:
sudo ldapmodify -H ldapi:// -Y EXTERNAL -f addcerts.ldif
Мы можем перезагрузить OpenLDAP, чтобы применить изменения:
sudo service slapd force-reload
Теперь наши клиенты могут шифровать свои подключения к серверу через обычный портldap://
с помощью STARTTLS.
Настройка клиентских машин
Чтобы подключиться к серверу LDAP и инициировать обновление STARTTLS, клиенты должны иметь доступ к сертификату центра сертификации и должны запросить обновление.
На сервере OpenLDAP
Если вы взаимодействуете с сервером OpenLDAP с самого сервера, вы можете настроить клиентские утилиты, скопировав сертификат CA и настроив файл конфигурации клиента.
Сначала скопируйте сертификат CA из каталога/etc/ssl/certs
в файл в каталоге/etc/ldap
. Назовем этот файлca_certs.pem
. Этот файл может использоваться для хранения всех сертификатов CA, к которым клиенты на этом компьютере могут захотеть получить доступ. Для наших целей это будет содержать только один сертификат:
sudo cp /etc/ssl/certs/ca_server.pem /etc/ldap/ca_certs.pem
Теперь мы можем настроить общесистемный файл конфигурации для утилит OpenLDAP. Откройте файл конфигурации в текстовом редакторе с правамиsudo
:
sudo nano /etc/ldap/ldap.conf
Измените значение параметраTLS_CACERT
, чтобы оно указывало на только что созданный файл:
/etc/ldap/ldap.conf
. . .
TLS_CACERT /etc/ldap/ca_certs.pem
. . .
Сохраните и закройте файл.
Теперь у вас должна быть возможность обновить свои соединения для использования STARTTLS, передав параметр-Z
при использовании утилит OpenLDAP. Вы можете принудительно обновить STARTTLS, пройдя его дважды. Проверьте это, набрав:
ldapwhoami -H ldap:// -x -ZZ
Это форсирует обновление STARTTLS. Если это успешно, вы должны увидеть:
STARTTLS успех
anonymous
Если вы что-то неправильно настроили, вы, скорее всего, увидите такую ошибку:
Ошибка STARTTLS
ldap_start_tls: Connect error (-11)
additional info: (unknown error code)
Настройка удаленных клиентов
Если вы подключаетесь к серверу OpenLDAP с удаленных серверов, вам необходимо выполнить аналогичный процесс. Сначала вы должны скопировать сертификат CA на клиентский компьютер. Вы можете легко сделать это с помощью утилитыscp
.
Пересылка ключей SSH клиенту
Если вы подключаетесь к своему серверу OpenLDAP с использованием ключей SSH, а ваш клиентский компьютер также является удаленным, вам необходимо добавить их в агент и переслать их при подключении к вашему клиентскому компьютеру.
Для этого запустите на своем локальном компьютере агент SSH:
eval $(ssh-agent)
Добавьте ключ SSH к агенту, набрав:
ssh-add
Теперь вы можете пересылать свои SSH-ключи при подключении к клиентскому компьютеру LDAP, добавив флаг-A
:
ssh -A user@ldap_client
Копирование сертификата CA
Подключившись к клиенту OpenLDAP, вы можете скопировать сертификат CA, набрав:
scp [email protected]:/etc/ssl/certs/ca_server.pem ~/
Теперь добавьте скопированный сертификат в список сертификатов CA, о которых клиент знает. Это добавит сертификат к файлу, если он уже существует, и создаст файл, если он не:
cat ~/ca_server.pem | sudo tee -a /etc/ldap/ca_certs.pem
Настройте конфигурацию клиента
Затем мы можем настроить файл глобальной конфигурации для утилит LDAP, чтобы он указывал на наш файлca_certs.pem
. Откройте файл с правамиsudo
:
sudo nano /etc/ldap/ldap.conf
Найдите параметрTLS_CACERT
и установите его для файлаca_certs.pem
:
/etc/ldap/ldap.conf
. . .
TLS_CACERT /etc/ldap/ca_certs.pem
. . .
Сохраните и закройте файл, когда вы закончите.
Проверьте обновление STARTTLS, введя это:
ldapwhoami -H ldap://ldap.example.com -x -ZZ
Если обновление STARTTLS прошло успешно, вы должны увидеть:
STARTTLS успех
anonymous
Принудительное подключение для использования TLS (необязательно)
Мы успешно настроили наш сервер OpenLDAP таким образом, чтобы он мог беспрепятственно обновлять обычные соединения LDAP до TLS через процесс STARTTLS. Тем не менее, это все еще позволяет незашифрованные сеансы, которые могут быть не тем, что вы хотите.
Если вы хотите принудительно обновлять STARTTLS для каждого соединения, вы можете настроить параметры вашего сервера. Мы будем применять это требование только к обычному DIT, а не к конфигурационному DIT, доступному под записьюcn=config
.
Во-первых, вам нужно найти соответствующую запись для изменения. Мы напечатаем список всех DIT (информационных деревьев каталогов: иерархии записей, которые обрабатывает сервер LDAP), о которых имеет информацию сервер OpenLDAP, а также записи, которая настраивает каждый DIT.
На вашем сервере OpenLDAP введите:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q "(olcSuffix=*)" dn olcSuffix
Ответ должен выглядеть примерно так:
DIT, обслуживаемые OpenLDAP
dn: olcDatabase={1}hdb,cn=config
olcSuffix: dc=example,dc=com
У вас может быть больше пар DIT и базы данных, если ваш сервер настроен для обработки более одного DIT. Здесь у нас есть одно DIT с базовой записьюdc=example,dc=com
, которая будет записью, созданной для доменаexample.com
. Конфигурация этого DIT обрабатывается записьюolcDatabase={1}hdb,cn=config
. Запишите DN тех DIT, для которых вы хотите включить шифрование.
Мы будем использовать файл LDIF для внесения изменений. Создайте файл LDIF в вашем домашнем каталоге. Назовем егоforcetls.ldif
:
nano ~/forcetls.ldif
Внутри нацельтесь на DN, на котором хотите включить TLS. В нашем случае это будетdn: olcDatabase={1}hdb,cn=config
. Мы установимchangetype
на «изменить» и добавим атрибутolcSecurity
. Установите значение атрибута в «tls = 1», чтобы заставить TLS для этого DIT:
forcetls.ldif
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSecurity
olcSecurity: tls=1
Сохраните и закройте файл, когда вы закончите.
Чтобы применить изменение, введите:
sudo ldapmodify -H ldapi:// -Y EXTERNAL -f forcetls.ldif
Перезагрузите сервис OpenLDAP, набрав:
sudo service slapd force-reload
Теперь, если вы выполните поиск в DITdc=example,dc=com
, вам будет отказано, если вы не используете опцию-Z
для запуска обновления STARTTLS:
ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL dn
TLS требуется сбой
Confidentiality required (13)
Additional information: TLS confidentiality required
Мы можем продемонстрировать, что соединения STARTTLS по-прежнему функционируют правильно:
ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL -Z dn
TLS требует успеха
dn: dc=example,dc=com
dn: cn=admin,dc=example,dc=com
Заключение
Теперь у вас должен быть сервер OpenLDAP, настроенный с шифрованием STARTTLS. Шифрование вашего соединения с сервером OpenLDAP с помощью TLS позволяет вам проверить подлинность сервера, с которым вы соединяетесь. Это также защищает ваш трафик от промежуточных сторон. При подключении по открытой сети шифрование вашего трафика имеет важное значение.