Шифрование соединений OpenLDAP с помощью STARTTLS
Ubuntu | Комментировать запись
OpenLDAP – это гибкий и простой в поддержке сервис каталогов LDAP. Однако из коробки сервер передает данные по незашифрованному соединению. В этом мануале вы узнаете, как шифровать соединения с OpenLDAP с помощью STARTTLS и перейти с обычных соединений на TLS на сервере Ubuntu 14.04.
Требования
- Сервер Ubuntu 14.04, настроенный по этому мануалу.
- Сервис OpenLDAP (читайте Установка и настройка OpenLDAP и phpLDAPadmin в 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