Настройка TLS для LDAP

ldap_tls
Rate this post

Не так давно я описал в статье настройку репликации LDAP серверов по схеме multimaster. В данной заметке я опишу как настроить работу LDAP по зашифрованному каналу в том числе и для репликации. Понадобиться это может в довольно большом количестве случаев, например если вам надо прокинуть реплику куда-то во вне защищенной сети или если ваша сеть публичная. В общем зашифровать данные никогда не бывает лишним. В LDAP это делается довольно просто. Итак, исходные данные такие же как и в предыдущей статье, будем считать, что та схема уже сделана и нормально функционирует, и просто к ней в дополнение организовываем шифрование.

Как и прежде, все настройки мы храним с самом LDAP и реплицируем между всем серверами реплики. В качестве ключей будем использовать самоподписные ключи сгенерированные с помощью утилит из набора GNU TLS. Ключи сделанные через openssl работать не будут, так что пользоваться придется certtool, что совсем не сложно. Для начала установим набор утилит:

apt-get install gnutls-bin

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

slapd TLS: can't connect: A TLS packet with unexpected length was received..

Поэтому делаем набор ключ и сертификат для корневого сертификата и им подписываем сертификат для непосредственно рабочей пары:

certtool --generate-privkey --outfile ca.key
certtool --generate-self-signed --load-privkey ca.key --outfile ca.crt

Генерим рабочую пару:

certtool --generate-privkey --outfile ldap.prod.local.key
certtool --generate-certificate --load-privkey ldap.prod.local.key --outfile ldap.prod.local.crt --load-ca-certificate ca.crt --load-ca-privkey ca.key

Кладем все полученные сертификаты и приватный ключик в папочку где они будут доступны для сервера, например в /etc/ldap/ssl. Добавляем владельца и группу:

chown -R openldap:openldap /etc/ldap/ssl

Вносим изменения в конфиг, добавляя туда информацию о ключах с помощью следующих строчек

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/ssl/ca.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap.prod.local.key
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/ldap.prod.local.crt

Теперь можно перезапустить сервер с работой по шифрованному протоколу, для этого идем в /etc/default/slapd и в строчке

SLAPD_SERVICES="ldap://server1.prod.local ldapi:///"

Добавляем еще один биндинг

ldaps://server1.prod.local, так чтобы полная строчка стала выглядеть так:

SLAPD_SERVICES="ldap://server1.prod.local ldapi:/// ldaps://server1.prod.local"

Делаем это на каждом из серверов и перезапускаем службу:

/etc/init.d/slapd restart

Теперь демон будет, помимо 389 порта, еще доступен на 636 порту, не забудьте открыть его в файерволе. Для того чтобы помимо обычных запросов, шифровались и запросы по реплике, то при конфигурировании реплики надо указывать ключик starttls=yes, при этом остальные параметры остаются без изменений, в общем конфиг для репликации конфигов будет выглядеть таким вот образом:

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001 provider=ldap://server1.prod.local binddn="cn=admin,cn=config"
bindmethod=simple credentials=ck3u8gj3
searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1 starttls=yes
olcSyncRepl: rid=002 provider=ldap://server2.prod.local binddn="cn=admin,cn=config"
bindmethod=simple credentials=ck3u8gj3
searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1 starttls=yes
-
add: olcMirrorMode
olcMirrorMode: TRUE

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