Шифрование соединений OpenLDAP с помощью STARTTLS

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

Требования

Поддержка LDAP по SSL и по STARTTLS: в чем разница?

Существует два способа шифрования соединений LDAP по SSL/TLS.

Традиционно соединения LDAP, которые нужно зашифровать, обрабатывались по отдельном порту (обычно 636). Все соединение было защищено с помощью протокола SSL/ TLS. Этот процесс, LDAP по SSL, использует протокол ldaps://. Но этот метод шифрования устарел.

STARTTLS – альтернативный подход, который теперь является предпочтительным методом шифрования LDAP-соединений. STARTTLS защищает нешифрованное соединение по SSL/TLS после или во время подключения. Это позволяет обрабатывать незашифрованные и зашифрованные соединения по одному порту.

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

Сначала нужно настроить сервер так, чтобы он правильно разрешал свое имя хоста и полное доменное имя (FQDN). Это необходимо, чтобы сертификаты были подтверждены клиентами. Предположим, сервер LDAP будет размещен на машине с доменным именем ldap.example.com.

Чтобы задать имя хоста во всех соответствующих местах на вашем сервере, используйте команду hostnamectl с параметром set-hostname. Задайте краткое имя хоста (без домена):

sudo hostnamectl set-hostname ldap

Теперь нужно установить FQDN в файле /etc/hosts:

sudo nano /etc/hosts

Найдите строку, которая отображает адрес 127.0.1.1. После этого IP-адреса укажите полное доменное имя сервера, а во втором поле – краткое имя хоста. Это должно выглядеть примерно так:

. . .
127.0.1.1 ldap.example.com ldap
127.0.0.1 localhost
. . .

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

Чтобы убедиться, что значения установлены правильно, введите:

hostname

Вы увидите краткое имя хоста:

ldap

Теперь запросите FQDN:

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

Теперь у программы появится много новых вопросов, которые будут заданы при прохождении этого процесса:

  • Omit OpenLDAP server configuration? Введите No.
  • DNS domain name? Этот параметр определяет базовую структуру пути к вашему каталогу. Прочтите сообщение, чтобы точно понять, как он будет реализован. На самом деле это довольно открытый параметр. Вы можете выбрать любое значение в «domain name», даже если вы не являетесь владельцем домена. Однако если у вас есть доменное имя сервера, вероятно, разумно использовать его. В этом мануале используется условный домен example.com.
  • Organization name? Это, опять же, почти полностью зависит от ваших предпочтений. В этом руководстве мы будем использовать условное название Example Inc.
  • Administrator password: Как уже говорилось в разделе установки, это ваша возможность выбрать новый пароль администратора. Пароль, который вы выберете здесь, перезапишет предыдущий пароль, который вы использовали.
  • Confirm password: подтвердите пароль.
  • Database backend to use: Выберите HDB.
  • Remove the database when slapd is purged? Выберите No
  • Move old database? Введите Yes
  • Allow LDAPv2 protocol? Введите No

Установка SSL

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

sudo apt-get install gnutls-bin ssl-cert

Все необходимые инструменты установлены.

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

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

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

Создайте каталог для шаблонов:

sudo mkdir /etc/ssl/templates

Шаблон для ЦС

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

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:

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

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

В данном случае в cn нужно указать FQDN сервера LDAP. Если это значение не соответствует домену, клиент отклонит сертификат сервера. Также нужно установить срок действия сертификата. Чтобы не менять его часто, создайте сертификат на 10 лет:

organization = "Example Inc"
cn = ldap.example.com
tls_www_server
encryption_key
signing_key
expiration_days = 3652

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

Создание ключа и сертификата ЦС

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

Используйте программу certtool для создания закрытого ключа. Каталог /etc/ssl/private защищен от пользователей без прав root и является подходящим местом для хранения закрытых ключей. Можно сгенерировать закрытый ключ и записать его в файл ca_server.key в этом каталоге:

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

Теперь можно использовать закрытый ключ и файл шаблона для создания сертификата для ЦС. Запишите его в файл ca_server.pem в /etc/ssl/certs:

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).

Мы поместим сертификат в каталог /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.

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 и установить их в правильные расположения.

В итоге файл будет выглядеть так:

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

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

С помощью команды ldapmodify обновите настройки OpenLDAP:

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

Перезагрузите OpenLDAP:

sudo service slapd force-reload

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

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

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

Сервер OpenLDAP

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

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

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

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

sudo nano /etc/ldap/ldap.conf

Измените значение TLS_CACERT на такое:

. . .
TLS_CACERT /etc/ldap/ca_certs.pem
. . .

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

Теперь вы можете обновить свои подключения, чтобы использовать STARTTLS, передав параметр -Z при использовании утилит OpenLDAP. Вы можете принудительно включить STARTTLS, передав параметр дважды.

ldapwhoami -H ldap:// -x -ZZ

Теперь все подключения будут принудительно использовать STARTTLS. Вы увидите:

anonymous

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

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

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

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

scp user@ldap.example.com:/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.

. . .
TLS_CACERT /etc/ldap/ca_certs.pem
. . .

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

Проверьте обновление STARTTLS, набрав:

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 введите:

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:

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

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

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

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

Перезапустите OpenLDAP:

sudo service slapd force-reload

Если вы попробуете найти DIT dc=example,dc=com, вы не сможете подключиться без флага –Z, который включает шифрование STARTTLS.

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

Убедитесь, что соединение STARTTLS работает правильно:

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

Tags: , , , ,