私は数か月前からopenLDAPサーバーを実行してきましたが、私たちはそれを使用して多くのアプリケーションの認証を行っています。以前のスタッフがサーバーをセットアップしましたが、標準のインストールではないようですが、かなり簡単です。
最近、CA証明書の1つが期限切れになり、Let's Encryptに置き換えることが決定されました。上司がサーバーの証明書を交換しました。
Webアプリケーション(LDAP Manager、セルフサービスのパスワード変更)で機能しますが、クライアントはそれに対して認証できません。たとえば、RedmineのLDAP設定をテストしようとすると、「接続できません(SSL_connect SYSCALLが返されました= 5 errno = 0状態= SSLv2/v3読み取りサーバーhello A)」というメッセージが表示されます
それに対してネクサス認証をテストするだけでは接続しません。
苛立たしいことに、LDAPサーバーまたはアプリケーションのログのいずれにも、これが失敗している理由を示すログはありません。調査の結果、証明書/キーの構成方法を実行するためのものではないかと思いましたが、考えられるすべてのこと、オンラインで見つけることができるすべてのものを試しましたが、何も機能しません。
環境の詳細は次のとおりです。
Debian 8 openLDAP openldap-2.4.40
私の設定は以下の通りです:
/ etc/ldap/ldap.conf
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
#BASE dc=example,dc=com
#URI ldap://ldap.example.com ldap://ldap-master.example.com:666
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
# TLS certificates (needed for 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ファイルは、olcTLSCertificateFileとしてslapdに提示する必要があります。
連結の順序が重要かどうかはわかりませんが、これは私が使用した順序です:cat chain.pem root.pem> ca.merged.crt
使用したopensslテストは、このように設定するとすべてがOKであることを示しています。
ルート認証ファイルはここにあります: https://www.identrust.com/certificates/trustid/root-download-x3.html
テスト:
[root @█████ssl]#openssl s_client -connect [編集済]:636 -showcerts -state -CAfile ca.merged.crt CONNECTED(00000003) SSL_connect:before/connect初期化 SSL_connect:SSLv2/v3書き込みクライアントhello A SSL_connect:SSLv3読み取りサーバーhello A 深さ= 2 O =デジタル署名信頼株式会社、CN = DSTルート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 = [編集済み] verify return:1 SSL_connect:SSLv3 read server certificate A SSL_connect:SSLv3 read server key exchange A SSL_connect:SSLv3サーバーの読み取り完了A SSL_connect:SSLv3クライアントの鍵交換の書き込みA SSL_connect:SSLv3書き込み変更暗号仕様A SSL_connect:SSLv3書き込み完了A SSL_connect:SSLv3フラッシュdata SSL_connect:SSLv3読み取り完了A --- 証明書チェーン 0 s:/ CN = [編集済] i:/ C = US/O = Let's Encrypt/CN = Let's Encr ypt 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 ----- [編集済] ----- END CERTIFICATE ----- 2 s:/ O = Digital Signature Trust Co./ CN = DSTルートCA X3 i:/ O =デジタル署名信頼会社/ CN = DSTルートCA X3 ----- BEGIN CERTIFICATE ----- [編集済] ----- END CERTIFICATE ----- --- サーバー証明書 subject =/CN = [編集済] issuer =/C = US/O = Let's Encrypt/CN = Let's Encrypt Authority X3 --- 送信されたクライアント証明書CA名なし サーバー一時キー:ECDH 、secp384r1、384ビット --- SSLハンドシェイクは4417バイトを読み取り、405バイトを書き込みました --- 新規、TLSv1/SSLv3、暗号はECDHEです-RSA-AES256-GCM-SHA384 サーバーの公開鍵は4096ビットです。 Secure Renegotiation IS supported 圧縮:なし 拡張:なし SSL-セッション: プロトコル:TLSv1.2 暗号:ECDHE-RSA-AES256-GCM-SHA384 セッションID:[編集済み] セッションID-ctx: マスターキー:[編集済み] キー-組織:なし Krb5プリンシパル:なし PSK ID:なし PSK IDヒント:なし 開始時間:1487882605 タイムアウト:300(秒) 戻りコードを確認:0 (OK) - -
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を使用して追加する必要があります。
証明書への読み取りアクセスを制限する追加のセキュリティ対策(apparmorなど)が有効になっていますか? apparmorがopenldapで証明書を暗号化するためのアクセスを許可しなかったため、同じエラーメッセージldap_modify: Other (e.g., implementation specific) error (80)
が表示されました。
次の手順で問題が解決しました:
/etc/apparmor.d/local/usr.sbin.slapd
に行を追加:/etc/letsencrypt/** r,
service apparmor restart
このトピックに関する美しいブログ投稿があります。それは私のために働きます https://www.dahlem.uk/display/deb/Configure+and+enable+TLS+for+OpenLDAP
私のシステムはこれです:
# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.8 (jessie)
Release: 8.8
Codename: 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
私は同じ問題を抱えていて、数時間後に最も簡単な解決策であることがわかりました:pemファイルを/ etc/openldap/certsにコピーし、olcTLSCACertificateFileにfullchain.pemを使用します。 (ルートCAは必要ないようです)。また重要:olcTLSCertificateFileおよびolcTLSCertificateKeyFileアクセス権は、それぞれ644 ldap ldapおよび600 ldap ldapである必要があります。
これを行うためのansibleプレイブックは、これを自動化しやすくするために次のようになります。
- hosts: ldap
gather_facts: false
become: true
tasks:
- name: Copy 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: Copy 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: Copy 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'
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
を実行します「ライブ」パスを「アーカイブ」に変更したとき、なんとかそれを行うことができました。
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