Вопрос или проблема
Я уже несколько месяцев управляю сервером openLDAP, и мы используем его для аутентификации в ряде приложений. Предыдущий сотрудник настраивал сервер, и это не выглядит как стандартная установка, но довольно просто.
Недавно один из наших CA сертификатов истек, и было решено заменить его на сертификат Let’s Encrypt. Мой менеджер заменил сертификат на сервере.
Это работает для веб-приложения (LDAP Manager, самообслуживание по смене пароля), однако ни один из клиентов не может пройти аутентификацию. Например, если я пытаюсь протестировать конфигурацию LDAP Redmine, я получаю сообщение: “Не удалось подключиться (SSL_connect SYSCALL вернул=5 errno=0 state=SSLv2/v3 read server hello A)”
При тестировании аутентификации Nexus он просто не подключается.
Раздражает, что в логах нет ничего ни на сервере LDAP, ни в приложениях, что указывает на причину сбоя. Мои расследования приводят меня к мысли, что это связано с тем, как настроены сертификат/ключ, но я перепробовал все, что мог придумать, и все, что я нашел онлайн, и ничего не сработало.
Детали окружения:
Debian 8
openLDAP openldap-2.4.40
Моя конфигурация следующая:
/etc/ldap/ldap.conf
# LDAP Defaults
#
# See ldap.conf(5) for details
# Этот файл должен быть доступен для чтения, но не для записи.
#BASE dc=example,dc=com
#URI ldap://ldap.example.com ldap://ldap-master.example.com:666
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
# TLS сертификаты (необходимы для GnuTLS)
TLS_CACERT /etc/letsencrypt/live/myserver.com/fullchain.pem
/etc/ldap/slapd.d/cn=config.ldif
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: none
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1
structuralObjectClass: olcGlobal
entryUUID: c6dd9e40-9dc2-1035-8c03-add74f928a5e
creatorsName: cn=config
createTimestamp: 20160423171552Z
entryCSN: 20160423171552.629347Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20160423171552Z
Если я тестирую соединение:
admin@ldap:~$ sudo openssl s_client -connect localhost:636 -showcerts -state -CAfile /etc/letsencrypt/live/myserver.com/fullchain.pem
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
140394818631312:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 289 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
Кто-нибудь имеет идеи, что я упускаю?
ПРАЗДНИК
Как предложил @84104, я отредактировал файл tls.ldif, чтобы он выглядел следующим образом:
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/letsencrypt/live/myserver/fullchain.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/letsencrypt/live/myserver/cert.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/letsencrypt/live/myserver/privkey.pem
Затем я выполнил команду:
ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif
Тем не менее, вывод, который я получаю теперь:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
ldap_modify: Other (e.g., implementation specific) error (80)
Я нашел предложение, что это может быть связано с правами доступа к сертификатам или ключевых файлов, но я изменил их, чтобы они точно соответствовали тем, которые были на ранее использованных файлах, и все равно получил это сообщение.
Снова извиняюсь за отсутствие общего знания по теме, но кто-нибудь может предложить что-то еще?
ПРАЗДНИК
В соответствии с предложением я изменил tls.ldif и изменил все команды с replace на delete, затем снова запустил команду ldapmodify. Появилась другая ошибка.
admin@ldap:/etc/ansible_ldif_work$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.remove.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
ldap_modify: Inappropriate matching (18)
additional info: modify/delete: olcTLSCACertificateFile: no equality matching rule
Файл fullchain.pem НЕ является конкатенацией цепочки сертификатов над файлом cert.pem, это конкатенация файлов chain.pem и cert.pem.
Файл chain.pem и файл корневого удостоверяющего центра должны быть конкатенированы в файл, который вы представите slapd как olcTLSCACertificateFile
Файл privkey.pem должен быть представлен slapd как olcTLSCertificateKeyFile.
Простой файл cert.pem должен быть представлен slapd как olcTLSCertificateFile.
Я не уверен, что порядок конкатенации имеет значение, но это порядок, который я использовал:
cat chain.pem root.pem > ca.merged.crt
Тест openssl, который вы использовали, показывает, что все в порядке, когда настроено таким образом.
Файл корневого удостоверяющего центра можно найти здесь:
https://www.identrust.com/certificates/trustid/root-download-x3.html
Тест:
[root@█████ ssl]# openssl s_client -connect [REDACTED]:636 -showcerts -state -CAfile ca.merged.crt CONNECTED(00000003) SSL_connect:before/connect initialization SSL_connect:SSLv2/v3 write client hello A SSL_connect:SSLv3 read server hello A depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3 verify return:1 depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3 verify return:1 depth=0 CN = [REDACTED] verify return:1 SSL_connect:SSLv3 read server certificate A SSL_connect:SSLv3 read server key exchange A SSL_connect:SSLv3 read server done A SSL_connect:SSLv3 write client key exchange A SSL_connect:SSLv3 write change cipher spec A SSL_connect:SSLv3 write finished A SSL_connect:SSLv3 flush data SSL_connect:SSLv3 read finished A --- Certificate chain 0 s:/CN=[REDACTED] i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 -----BEGIN CERTIFICATE----- [REDACTED] -----END CERTIFICATE----- 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 i:/O=Digital Signature Trust Co./CN=DST Root CA X3 -----BEGIN CERTIFICATE----- [REDACTED] -----END CERTIFICATE----- 2 s:/O=Digital Signature Trust Co./CN=DST Root CA X3 i:/O=Digital Signature Trust Co./CN=DST Root CA X3 -----BEGIN CERTIFICATE----- [REDACTED] -----END CERTIFICATE----- --- Server certificate subject=/CN=[REDACTED] issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 --- No client certificate CA names sent Server Temp Key: ECDH, secp384r1, 384 bits --- SSL handshake has read 4417 bytes and written 405 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384 Серверный открытый ключ 4096 бит Поддерживается безопасная повторная аутентификация Compression: NONE Expansion: NONE SSL-Session: Протокол : TLSv1.2 Шифр : ECDHE-RSA-AES256-GCM-SHA384 Идентификатор сеанса: [REDACTED] Идентификатор сеанса-ctx: Основной ключ: [REDACTED] Ключ-аргумент: None Krb5 Principal: None PSK identity: None PSK identity hint: None Время начала: 1487882605 Тайм-аут : 300 (сек) Код возврата проверки: 0 (ок) ---
У вас включены какие-либо дополнительные меры безопасности (например, apparmor), которые ограничивают доступ к вашим сертификатам для чтения? Я получил то же сообщение об ошибке ldap_modify: Other (e.g., implementation specific) error (80)
потому что apparmor не разрешала доступ openldap к сертификатам Let’s Encrypt:
Следующие шаги разрешили проблему для меня:
-
Добавьте строку в
/etc/apparmor.d/local/usr.sbin.slapd
:/etc/letsencrypt/** r,
-
service apparmor restart
Ваш сервер OpenLDAP, похоже, не имеет настроенного TLS.
Ваш /etc/ldap/slapd.d/cn=config.ldif
должен содержать что-то вроде следующего:
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap.key
olcTLSCACertificateFile: /etc/ldap/ssl/ldap_ca.cert
olcTLSCertificateFile: /etc/ldap/ssl/ldap.cert
olcTLSCipherSuite: HIGH:!aNull:!MD5:@STRENGTH
olcTLSProtocolMin: 3.1
Вы должны добавить это через ldapmodify.
Существует прекрасная статья в блоге по этой теме. Она сработала для меня https://www.dahlem.uk/display/deb/Configure+and+enable+TLS+for+OpenLDAP
Обновление (архив блога на archive.org):https://web.archive.org/web/20161023210915/http://www.dahlem.uk:80/display/deb/Configure+and+enable+TLS+for+OpenLDAP
Моя система следующая:
# lsb_release -a
Нет доступных модулей LSB.
Идентификатор дистрибьютора: Debian
Описание: Debian GNU/Linux 8.8 (jessie)
Релиз: 8.8
Кодовое имя: jessie
# slapd -V
@(#) $OpenLDAP: slapd (Jul 16 2017 19:57:41) $
Debian OpenLDAP Maintainers <[email protected]>
Вот быстрое руководство. Обрабатывайте доступ к файловой системе для letsencrypt …
useradd letsencrypt
chown openldap:letsencrypt /etc/letsencrypt/ -R
usermod -a -G letsencrypt openldap
Активируйте службы …
# /etc/default/slapd
SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"
И скажите openldap о ваших сертификатах …
# /root/add_ssl.ldif
dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: NORMAL
-
add: olcTLSCRLCheck
olcTLSCRLCheck: none
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
-
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/letsencrypt/live/YOURDOMAIN/fullchain.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/letsencrypt/live/YOURDOMAIN/cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/letsencrypt/live/YOURDOMAIN/privkey.pem
-
add: olcTLSProtocolMin
olcTLSProtocolMin: 3.3
Прочитайте файл ldif …
ldapmodify -Y EXTERNAL -H ldapi:/// -f add_ssl.ldif
Наконец, перезапустите и проверьте slapd.
systemctl restart slapd.service
systemctl status slapd.service
У меня была такая же проблема при настройке сертификатов от Lets Encrypt с OpenLDAP.
Ошибка:
~ # ldapmodify -Y EXTERNAL -H ldapi:/// -f add_ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
ldap_modify: Other (e.g., implementation specific) error (80)
Лог-файлы содержат:
... apparmor="DENIED" operation="open" profile="/usr/sbin/slapd" name="/etc/letsencrypt/archive/your.domain.tld/fullchain1.pem" ...
Я нашел следующее решение:
- Отредактируйте файл
/etc/apparmor.d/usr.sbin.slapd
- Добавьте строку:
/etc/letsencrypt/archive/your.domain.tld/* r,
- Перезапустите
*apparmor*:
service apparmor restart` - И теперь снова выполните
ldapmodify
У меня была такая же проблема, и после нескольких часов я нашел, что самым простым решением было: скопировать файлы pem в /etc/openldap/certs и использовать fullchain.pem для olcTLSCACertificateFile. (Корневой CA, похоже, не требуется). Также важно: права доступа olcTLSCertificateFile и olcTLSCertificateKeyFile должны быть 644 ldap ldap и 600 ldap ldap соответственно.
Ansible playbook для этого будет выглядеть примерно так, чтобы упростить автоматизацию:
- hosts: ldap
gather_facts: false
become: true
tasks:
- name: Копировать cert.pem
copy:
src: "/mnt/data/main/ansible/letsencrypt/config/live/appdev.elabs.svcs.entsvcs.com/cert.pem"
dest: "/etc/openldap/certs/olcTLSCertificateFile"
backup: yes
owner: ldap
group: ldap
mode: '0644'
- name: Копировать fullchain.pem
copy:
src: "/mnt/data/main/ansible/letsencrypt/config/live/appdev.elabs.svcs.entsvcs.com/fullchain.pem"
dest: "/etc/openldap/certs/olcTLSCACertificateFile"
backup: yes
owner: root
group: root
mode: '0644'
- name: Копировать privkey.pem
copy:
src: "/mnt/data/main/ansible/letsencrypt/config/live/appdev.elabs.svcs.entsvcs.com/privkey.pem"
dest: "/etc/openldap/certs/olcTLSCertificateKeyFile"
backup: yes
owner: ldap
group: ldap
mode: '0600'
OpenLDAP с сертификатами LetsEncrypt на Linux Mint 21.1 (Ubuntu)
Я потратил столько часов за последние несколько недель, читая статьи по всему Stack, блоги и форумы, и наконец я нашел комбинацию изменений, которая сработала для меня. Надеюсь, это поможет другим.
На основе этой статьи в блоге и многих других.
Требования:
- Работающий OpenLDAP/slapd без ssl.
- Работающий LetsEncrypt (сертификаты в структуре
/etc/letsencrypt).
Установите правильные права доступа для директорий и файлов LetsEncrypt в два шага.
setfacl
$ sudo setfacl -m user:openldap:r-x /etc/letsencrypt/live
$ sudo setfacl -m user:openldap:r-x /etc/letsencrypt/archive
apparmor
Создайте /etc/apparmor.d/local/usr.sbin.slapd с следующим содержимым.
/etc/letsencrypt/live/your.domain.here r,
/etc/letsencrypt/archive/your.domain.here r,
/etc/letsencrypt/archive/your.domain.here/** r,
Перезапустите apparmor.
sudo service apparmor restart
Эти настройки TLS могут быть необходимы для добавления, или вы уже могли их установить.
# /root/add_ssl.ldif
dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: NORMAL
-
add: olcTLSCRLCheck
olcTLSCRLCheck: none
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
-
add: olcTLSProtocolMin
olcTLSProtocolMin: 3.3
Если вы хотите/нуждаетесь, добавьте их с:
ldapmodify -Y EXTERNAL -H ldapi:/// -f add_ssl_options.ldif
Добавьте сертификаты LetsEncrypt в ваш openldap, добавив следующую информацию в add_letsencrypt_ssl.ldif.
# /etc/ldap/add_letsencrypt_ssl.ldif
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca-certificates.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/letsencrypt/live/your.domain.here/privkey.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/letsencrypt/live/your.domain.here/fullchain.pem
и выполните это для импорта:
ldapmodify -Y EXTERNAL -H ldapi:/// -f add_letsencrypt_ssl.ldif
Если вы еще не включили ldaps в /etc/default/slapd, сделайте это сейчас.
SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"
Перезапустите openldap
sudo service slapd restart
Обновите сертификаты, когда они обновляются
Поместите это в директорию /etc/ldap, чтобы мы могли повторно использовать это, когда сертификат LetsEncrypt обновляется).
# /etc/ldap/add_letsencrypt_ssl.ldif
dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/letsencrypt/live/your.domain.here/privkey.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/letsencrypt/live/your.domain.here/fullchain.pem
Затем поместите это в /etc/letsencrypt/renewal-hooks/deploy/reload_le_certs_in_slapd
#!/bin/sh
do
if [ "$RENEWED_LINEAGE" = your.domain.here ]
then
ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/ldap/add_letsencrypt_ssl.ldif
fi
done
Сделайте его исполняемым.
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload_le_certs_in_slapd
(Идея позаимствована у @cram в более раннем ответе.)
Мне удалось это сделать, когда я изменил путь “live” на “archive”:
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/letsencrypt/archive/SOMEDOMAIN/fullchain1.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/letsencrypt/archive/SOMEDOMAIN/cert1.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/letsencrypt/archive/SOMEDOMAIN/privkey1.pem
и позволив пользователю openldap читать эти файлы, используя, например:
setfacl -m “u:openldap:r” /etc/letsencrypt/archive/SOMEDOMAIN/{fullchain1,cert1,privkey1}.pem
вам не нужно настраивать CA, когда у вас есть fullchain.pem, потому что этот файл уже содержит корневой CA, промежуточные и Сертификат Сервера.
Используйте fullchain.pem как olcTLSCertificateFile, а privkey.pem как olcTLSCertificateKeyFile.
Если вы получите ошибку 80 =>(Other (e.g., implementation specific) error (80)):
- Важно изменить оба Атрибута одним ldapmodify (это не сработает, если вы сначала установите olcTLSCertificateKeyFile, а затем olcTLSCertificateFile и наоборот)
- Проверьте, чтобы файл privkey.pem имел режим 600, владелец был вашим SLAPD_USER и чтобы SLAPD_USER мог читать файл по полному пути.
- Проверьте, чтобы файл fullchain.pem имел режим 644, владелец был вашим SLAPD_USER и чтобы SLAPD_USER мог читать файл по полному пути.
- Проверьте, чтобы apparmor, selinux и т. д. не блокировали доступ для SLAPD_USER
Напишите файл ldapmodify – ssl.mod:
dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /path/to/your/letsencrypt/privkey.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /path/to/your/letsencrypt/fullchain.pem
Примените конфигурацию:
ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.mod
И классная вещь в том, что вы можете использовать последнюю команду как certbot –deploy-hook и обновлять сертификат без перезапуска slapd при обновлении.
Многие люди здесь и в других местах на stackexchange обращали внимание на то, что права доступа и порядок стянок имеют значение, но в конечном итоге то, что помогло мне, это было:
- разделить один .ldif файл, содержащий три стянки, на три .ldif файла, каждый из которых содержит одну стянку (они не должны загружаться все вместе!)
- попробуйте загружать их один за другим (например, загрузка #1: неудача; загрузка #2: неудача; загрузка #3: успех)
- повторите все неудачные загрузки (например, загрузка #1: неудача; загрузка #2: успех)
- повторите все неудачные загрузки (например, загрузка #1: успех)
С третьего раза я понял, в каком порядке их нужно загружать.
Похоже, это единственная работающая установка на системах подобным DEBIAN :
Проверено у меня (UBUNTU Server 24): ОК
Ответ или решение
Использование сертификатов Let’s Encrypt с OpenLDAP
OpenLDAP — это мощный инструмент управления идентификацией, который широко используется для аутентификации в различных приложениях. Замена сертификатов на Let’s Encrypt может значительно повысить безопасность вашего OpenLDAP-сервера, однако неправильная настройка может привести к проблемам с подключением и аутентификацией. В этом руководстве мы рассмотрим, как правильно интегрировать сертификаты Let’s Encrypt в вашу конфигурацию OpenLDAP, а также основные шаги для устранения проблем, возникших при использовании новых сертификатов.
1. Проверка и подготовка сертификатов
Сначала убедитесь, что у вас есть необходимые файлы сертификатов, созданные с помощью Let’s Encrypt:
fullchain.pem
— содержит как ваш сертификат, так и промежуточные сертификаты.privkey.pem
— ваш закрытый ключ.
Советы по настройке файлов:
- Полный сертификат (
fullchain.pem
) должен использоваться какolcTLSCertificateFile
. - Закрытый ключ (
privkey.pem
) должен использоваться какolcTLSCertificateKeyFile
. - Убедитесь, что файлы имеют правильные разрешения:
privkey.pem
: 600 (только для чтения владельца)fullchain.pem
: 644 (чтение для всех).
Для изменения разрешений используйте команды:
chmod 600 /etc/letsencrypt/live/yourdomain/privkey.pem
chmod 644 /etc/letsencrypt/live/yourdomain/fullchain.pem
2. Настройка конфигурации OpenLDAP
Для того чтобы OpenLDAP использовал новые сертификаты, вам нужно внести изменения в конфигурацию сервера.
Пример файла ssl_config.ldif
Создайте файл конфигурации ssl_config.ldif
:
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/letsencrypt/live/yourdomain/fullchain.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/letsencrypt/live/yourdomain/cert.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/letsencrypt/live/yourdomain/privkey.pem
Применение конфигурации
Чтобы применить изменения, выполните команду:
ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl_config.ldif
3. Проверка настроек безопасности
Убедитесь, что доступ к файлам сертификатов не ограничен системными мерами безопасности, такими как AppArmor или SELinux. Если ваша система использует AppArmor, вы можете внести в профиль usr.sbin.slapd
следующую строку:
/etc/letsencrypt/** r,
Затем перезапустите AppArmor:
sudo service apparmor restart
4. Тестирование подключения
Проверьте, работает ли установка, с помощью команды OpenSSL:
openssl s_client -connect localhost:636 -showcerts -state -CAfile /etc/letsencrypt/live/yourdomain/fullchain.pem
Убедитесь, что вывод показывает успешное установление соединения и сертификаты.
5. Устранение неполадок
Если вы столкнулись с ошибками, такими как "ldap_modify: Other (e.g., implementation specific) error (80)", это может быть связано с:
- Неправильной последовательностью применения изменений. Попробуйте разбить файл
ldif
на несколько файлов, чтобы изолировать проблему. - Права доступа к файлам. Убедитесь, что OpenLDAP имеет доступ к .pem файлам.
- Проблемы с конфигурацией TLS. Убедитесь, что вы используете правильные файлы и порядок модификаций.
Заключение
Интеграция сертификатов Let’s Encrypt с OpenLDAP может значительно улучшить безопасность вашей системы, однако требует тщательной настройки. Следуйте приведённым шагам, и ваша система должна начинать работать без проблем. Помните, что поддержка сертификатов при автоматическом обновлении также важна. Используйте хук обновления Certbot для перезагрузки конфигурации OpenLDAP после обновления сертификатов.
Для получения дополнительной информации и поддержки рекомендуется обратиться к официальной документации OpenLDAP и Let’s Encrypt.