Поиск по сайту:

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


Введение

OpenLDAP предоставляет гибкую и хорошо поддерживаемую службу каталогов LDAP. Однако по умолчанию сам сервер обменивается данными через незашифрованное веб-соединение. В этом руководстве мы покажем, как шифровать подключения к OpenLDAP с помощью STARTTLS для обновления обычных подключений до TLS. Мы будем использовать Ubuntu 14.04 в качестве сервера LDAP.

Предпосылки

Прежде чем приступить к работе с этим руководством, на вашем сервере должен быть настроен пользователь без полномочий root с sudo. Чтобы настроить пользователя этого типа, следуйте нашему руководству по первоначальной настройке Ubuntu 14.04.

В этом руководстве мы расскажем, как установить 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. Установите имя хоста на короткое имя хоста (не включайте компонент имени домена):

  1. sudo hostnamectl set-hostname ldap

Затем нам нужно установить полное доменное имя нашего сервера, убедившись, что наш файл /etc/hosts содержит правильную информацию:

  1. sudo nano /etc/hosts

Найдите строку, которая сопоставляет IP-адрес 127.0.1.1. Измените первое поле после IP-адреса на полное доменное имя сервера, а второе поле — на короткое имя хоста. Для нашего примера это будет выглядеть примерно так:

. . .

127.0.1.1 ldap.example.com ldap
127.0.0.1 localhost

. . .

Сохраните и закройте файл, когда закончите.

Вы можете проверить правильность настройки этих значений, набрав:

  1. hostname

Это должно вернуть ваше короткое имя хоста:

ldap

Проверьте полное доменное имя, набрав:

  1. hostname -f

Это должно вернуть полное доменное имя:

ldap.example.com

Установка сервера LDAP и программного обеспечения GnuTLS

Убедившись, что ваше имя хоста установлено правильно, мы можем установить необходимое нам программное обеспечение. Если у вас уже установлен и настроен OpenLDAP, вы можете пропустить первый подраздел.

Установите сервер OpenLDAP

Если у вас еще не установлен OpenLDAP, самое время это исправить. Обновите локальный индекс пакетов вашего сервера и установите программное обеспечение, набрав:

  1. sudo apt-get update
  2. sudo apt-get install slapd ldap-utils

Вам будет предложено ввести административный пароль LDAP. Не стесняйтесь пропустить подсказку, так как мы будем перенастраивать сразу после этого.

Чтобы получить доступ к некоторым дополнительным подсказкам, которые нам нужны, мы перенастроим пакет после установки. Для этого введите:

  1. sudo dpkg-reconfigure slapd

Ответьте на подсказки соответствующим образом, используя приведенную ниже информацию в качестве отправной точки:

  • Пропустить конфигурацию сервера OpenLDAP? Нет (нам нужна исходная база данных и конфигурация)
  • DNS-имя домена: example.com (используйте доменное имя сервера без имени хоста. Оно будет использоваться для создания базовой записи для информационного дерева)< /li>
  • Название организации: Example Inc (это будет просто добавлено в базовую запись как название вашей организации)
  • Пароль администратора: [любой]
  • Подтвердите пароль: [должен совпадать с указанным выше]
  • Используемая серверная часть базы данных: HDB (из двух вариантов этот вариант обладает наибольшей функциональностью)
  • Вы хотите, чтобы база данных удалялась при очистке slapd? (на ваш выбор. Выберите \Да, чтобы разрешить полное удаление, выберите \Нет, чтобы сохранить ваши данные даже после удаления программного обеспечения)
  • Переместить старую базу данных? Да
  • Разрешить протокол LDAPv2? Нет

Установите компоненты SSL

Как только ваш сервер OpenLDAP настроен, мы можем продолжить и установить пакеты, которые мы будем использовать для шифрования нашего соединения. Пакет Ubuntu OpenLDAP скомпилирован с библиотеками SSL GnuTLS, поэтому мы будем использовать GnuTLS для создания наших учетных данных SSL:

  1. sudo apt-get install gnutls-bin ssl-cert

Установив все наши инструменты, мы можем приступить к созданию сертификатов и ключей, необходимых для шифрования наших соединений.

Создайте шаблоны сертификатов

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

Чтобы создать сертификаты, необходимые для представления этих сущностей, мы создадим несколько файлов шаблонов. Они будут содержать информацию, необходимую утилите certtool для создания сертификатов с соответствующими свойствами.

Начните с создания каталога для хранения файлов шаблона:

  1. sudo mkdir /etc/ssl/templates

Создайте шаблон ЦС

Сначала создайте шаблон для центра сертификации. Мы назовем файл ca_server.conf. Создайте и откройте файл в текстовом редакторе:

  1. sudo nano /etc/ssl/templates/ca_server.conf

Нам нужно только предоставить несколько фрагментов информации, чтобы успешно создать центр сертификации. Нам нужно указать, что сертификат будет для CA (центр сертификации), добавив опцию ca. Нам также нужна опция cert_signing_key, чтобы дать сгенерированному сертификату возможность подписывать дополнительные сертификаты. Мы можем установить cn любое описательное имя, которое мы хотели бы для нашего центра сертификации:

cn = LDAP Server CA
ca
cert_signing_key

Сохраните и закройте файл.

Создайте шаблон службы LDAP

Затем мы можем создать шаблон для нашего сертификата сервера LDAP с именем ldap_server.conf. Создайте и откройте файл в текстовом редакторе с правами sudo:

  1. sudo nano /etc/ssl/templates/ldap_server.conf

Здесь мы предоставим несколько различных фрагментов информации. Мы укажем название нашей организации и настроим параметры tls_www_server, encryption_key и signing_key, чтобы наш сертификат обладал необходимыми базовыми функциями. .

cn в этом шаблоне должен соответствовать полному доменному имени сервера LDAP. Если это значение не совпадает, клиент отклонит сертификат сервера. Мы также установим дату истечения срока действия сертификата. Мы создадим 10-летний сертификат, чтобы избежать частых обновлений:

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 в этом каталоге, набрав:

  1. sudo certtool -p --outfile /etc/ssl/private/ca_server.key

Теперь мы можем использовать закрытый ключ, который мы только что сгенерировали, и файл шаблона, который мы создали в предыдущем разделе, для создания сертификата центра сертификации. Мы запишем это в файл в каталоге /etc/ssl/certs с именем ca_server.pem:

  1. 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 для ясности.

Мы можем сгенерировать соответствующий ключ, набрав:

  1. sudo certtool -p --sec-param high --outfile /etc/ssl/private/ldap_server.key

Когда у нас есть закрытый ключ для сервера LDAP, у нас есть все необходимое для создания сертификата для сервера. Нам нужно будет извлечь почти все компоненты, которые мы создали до сих пор (сертификат и ключ ЦС, ключ сервера LDAP и шаблон сервера LDAP).

Мы поместим сертификат в каталог /etc/ssl/certs и назовем его ldap_server.pem. Команда, которая нам нужна:

  1. 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), в эту группу:

  1. sudo usermod -aG ssl-cert openldap

Теперь у нашего пользователя OpenLDAP есть доступ к каталогу. Нам по-прежнему нужно предоставить этой группе право собственности на файл ldap_server.key, чтобы мы могли разрешить доступ для чтения. Передайте группе ssl-cert право собственности на этот файл, набрав:

  1. sudo chown :ssl-cert /etc/ssl/private/ldap_server.key

Теперь предоставьте группе ssl-cert доступ на чтение к файлу:

  1. sudo chmod 640 /etc/ssl/private/ldap_server.key

Наш процесс OpenSSL теперь может правильно обращаться к файлу ключа.

Настройте OpenLDAP для использования сертификата и ключей

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

Перейдите в свой домашний каталог и откройте файл с именем addcerts.ldif. Мы поместим наши изменения конфигурации в этот файл:

  1. cd ~
  2. nano addcerts.ldif

Чтобы внести изменения в конфигурацию, нам нужно настроить таргетинг на запись cn=config в DIT конфигурации. Нам нужно указать, что мы хотим изменить атрибуты записи. После этого нам нужно добавить атрибуты olcTLSCACertificateFile, olcCertificateFile и olcCertificateKeyFile и установить для них правильные местоположения файлов.

Конечный результат будет выглядеть так:

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:

  1. sudo ldapmodify -H ldapi:// -Y EXTERNAL -f addcerts.ldif

Мы можем перезагрузить OpenLDAP, чтобы применить изменения:

  1. sudo service slapd force-reload

Теперь наши клиенты могут шифровать свои подключения к серверу через обычный порт ldap:// с помощью STARTTLS.

Настройка клиентских машин

Чтобы подключиться к серверу LDAP и инициировать обновление STARTTLS, клиенты должны иметь доступ к сертификату центра сертификации и запросить обновление.

На сервере OpenLDAP

Если вы взаимодействуете с сервером OpenLDAP с самого сервера, вы можете настроить клиентские утилиты, скопировав сертификат ЦС и настроив файл конфигурации клиента.

Сначала скопируйте сертификат ЦС из каталога /etc/ssl/certs в файл в каталоге /etc/ldap. Мы назовем этот файл ca_certs.pem. Этот файл можно использовать для хранения всех сертификатов ЦС, к которым клиенты на этом компьютере могут захотеть получить доступ. Для наших целей он будет содержать только один сертификат:

  1. sudo cp /etc/ssl/certs/ca_server.pem /etc/ldap/ca_certs.pem

Теперь мы можем настроить общесистемный файл конфигурации для утилит OpenLDAP. Откройте файл конфигурации в текстовом редакторе с правами sudo:

  1. sudo nano /etc/ldap/ldap.conf

Измените значение параметра TLS_CACERT, чтобы оно указывало на только что созданный файл:

. . .

TLS_CACERT /etc/ldap/ca_certs.pem

. . .

Сохраните и закройте файл.

Теперь вы сможете обновить свои соединения для использования STARTTLS, передав параметр -Z при использовании утилит OpenLDAP. Вы можете принудительно обновить STARTTLS, пройдя его дважды. Проверьте это, набрав:

  1. ldapwhoami -H ldap:// -x -ZZ

Это приводит к обновлению STARTTLS. В случае успеха вы должны увидеть:

anonymous

Если вы что-то неправильно настроили, вы, скорее всего, увидите такую ошибку:

ldap_start_tls: Connect error (-11)
	additional info: (unknown error code)

Настройка удаленных клиентов

Если вы подключаетесь к своему серверу OpenLDAP с удаленных серверов, вам нужно будет выполнить аналогичный процесс. Во-первых, вы должны скопировать сертификат ЦС на клиентский компьютер. Это легко сделать с помощью утилиты scp.

Пересылка ключей SSH клиенту

Если вы подключаетесь к серверу OpenLDAP с помощью ключей SSH, а ваш клиентский компьютер также является удаленным, вам нужно будет добавить их к агенту и перенаправить при подключении к вашему клиентскому компьютеру.

Для этого на локальном компьютере запустите агент SSH, набрав:

  1. eval $(ssh-agent)

Добавьте свой ключ SSH в агент, набрав:

  1. ssh-add

Теперь вы можете перенаправлять свои SSH-ключи при подключении к клиентскому компьютеру LDAP, добавив флаг -A:

  1. ssh -A user@ldap_client

Копирование сертификата ЦС

Как только вы подключитесь к клиенту OpenLDAP, вы можете скопировать сертификат ЦС, набрав:

  1. scp user@ldap.example.com:/etc/ssl/certs/ca_server.pem ~/

Теперь добавьте скопированный сертификат в список сертификатов ЦС, о которых знает клиент. Это добавит сертификат в файл, если он уже существует, и создаст файл, если он не существует:

  1. cat ~/ca_server.pem | sudo tee -a /etc/ldap/ca_certs.pem

Настройте конфигурацию клиента

Затем мы можем настроить файл глобальной конфигурации для утилит LDAP, чтобы он указывал на наш файл ca_certs.pem. Откройте файл с привилегиями sudo:

  1. sudo nano /etc/ldap/ldap.conf

Найдите параметр TLS_CACERT и установите его в файле ca_certs.pem:

. . .

TLS_CACERT /etc/ldap/ca_certs.pem

. . .

Сохраните и закройте файл, когда закончите.

Протестируйте обновление STARTTLS, введя следующее:

  1. ldapwhoami -H ldap://ldap.example.com -x -ZZ

Если обновление STARTTLS прошло успешно, вы должны увидеть:

anonymous

Принудительное подключение к использованию TLS (необязательно)

Мы успешно настроили наш сервер OpenLDAP, чтобы он мог беспрепятственно обновлять обычные соединения LDAP до TLS через процесс STARTTLS. Однако это по-прежнему разрешает незашифрованные сеансы, что может быть не то, что вам нужно.

Если вы хотите принудительно обновлять STARTTLS для каждого подключения, вы можете настроить параметры своего сервера. Мы будем применять это требование только к обычному DIT, а не к DIT конфигурации, доступному под записью cn=config.

Во-первых, вам нужно найти соответствующую запись для изменения. Мы распечатаем список всех DIT (информационные деревья каталогов: иерархии записей, которые обрабатывает сервер LDAP), о которых сервер OpenLDAP имеет информацию, а также запись, которая настраивает каждое DIT.

На вашем сервере OpenLDAP введите:

  1. sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q "(olcSuffix=*)" dn olcSuffix

Ответ должен выглядеть примерно так:

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:

  1. nano ~/forcetls.ldif

Внутри выберите DN, для которого вы хотите принудительно включить TLS. В нашем случае это будет dn: olcDatabase={1}hdb,cn=config. Мы установим для changetype значение \modify и добавим атрибут olcSecurity. Установите для атрибута значение \tls=1, чтобы принудительно использовать TLS для этого DIT:

dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSecurity
olcSecurity: tls=1

Сохраните и закройте файл, когда закончите.

Чтобы применить изменение, введите:

  1. sudo ldapmodify -H ldapi:// -Y EXTERNAL -f forcetls.ldif

Перезагрузите службу OpenLDAP, набрав:

  1. sudo service slapd force-reload

Теперь при поиске в dc=example,dc=com DIT вам будет отказано, если вы не используете параметр -Z для запуска обновления STARTTLS:

  1. ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL dn
Confidentiality required (13)
Additional information: TLS confidentiality required

Мы можем продемонстрировать, что соединения STARTTLS все еще работают правильно:

  1. ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL -Z dn
dn: dc=example,dc=com

dn: cn=admin,dc=example,dc=com

Заключение

Теперь у вас должен быть настроен сервер OpenLDAP с шифрованием STARTTLS. Шифрование вашего подключения к серверу OpenLDAP с помощью TLS позволяет вам проверить подлинность сервера, к которому вы подключаетесь. Это также защищает ваш трафик от посредников. При подключении через открытую сеть шифрование трафика имеет важное значение.