Как зашифровать соединения OpenLDAP с помощью STARTTLS

Вступление

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 позволяет вам проверить подлинность сервера, с которым вы соединяетесь. Это также защищает ваш трафик от промежуточных сторон. При подключении по открытой сети шифрование вашего трафика имеет важное значение.

Related