web-dev-qa-db-ja.com

cn = configを使用してUbuntuでSSLを使用するようにopenldapを説得する

私はこれ(openldapへのTLS接続)を機能させることができないので、助けていただければ幸いです。

私はubuntu10.04 LTSで動作しているopenldapサーバーを持っています、それはcn = configを使用するように構成されており、TLSについて見つけることができる情報のほとんどは古いslapd.confファイルを使用しているようです:

私は主にここの指示に従ってきました---(https://help.ubuntu.com/10.04/serverguide/C/openldap-server.html さらにここや他の場所で読んだもの-もちろん私はまだこれらすべてを完全に理解していないので、問題の一部である可能性があります!

次のようにssl.ldifファイルを作成しました。

dn:cn=config

add: olcTLSCipherSuite
olcTLSCipherSuite: TLSV1+RSA:!NULL
add: olcTLSCRLCheck
olcTLSCRLCheck: none
add: olcTLSVerifyClient
olcTLSVerifyClient: never
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ldap_cacert.pem
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/my.domain.com_slapd_cert.pem
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/my.domain.com_slapd_key.pem

次のコマンドラインを使用してインポートします

ldapmodify -x -D cn=admin,dc=mydomain,dc=com -W -f ssl.ldif

/ etc/default/slapdを編集して、次のサービス行が含まれるようにしました。

SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

そして、変更を加えるたびに、/etc/init.d/slapd restartでslapdを再開します。

非TLS接続をテストするための次のコマンドラインは正常に機能します。

ldapsearch -d 9 -D cn=admin,dc=mydomain,dc=com -w mypassword \
-b dc=mydomain,dc=com -H "ldap://mydomain.com" "cn=roger*"

しかし、このコマンドラインを使用してLDAPに切り替えると、

ldapsearch -d 9 -D cn=admin,dc=mydomain,dc=com -w mypassword \
-b dc=mydomain,dc=com -H "ldaps://mydomain.com" "cn=roger*"

これは私が得るものです。

ldap_url_parse_ext(ldaps://mydomain.com)
ldap_create
ldap_url_parse_ext(ldaps://mydomain.com:636/??base)
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_Host: TCP mydomain.com:636
ldap_new_socket: 3
ldap_prepare_socket: 3
ldap_connect_to_Host: Trying 127.0.0.1:636
ldap_pvt_connect: fd: 3 tm: -1 async: 0
TLS: can't connect: A TLS packet with unexpected length was received..
ldap_err2string
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

netstat -alをチェックすると、次のことがわかります。

tcp        0      0 *:www                   *:*                     LISTEN
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp        0      0 *:https                 *:*                     LISTEN
tcp        0      0 *:ldaps                 *:*                     LISTEN
tcp        0      0 *:ldap                  *:*                     LISTEN

これも重要かどうかはわかりません...私はそれが重要だと思います。

openssl s_client -connect mydomain.com:636 -showcerts
CONNECTED(00000003)
916:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

私はすべての証明書などをOKにしたと思います。これがいくつかのチェックの結果です。

私がこれを行う場合;

certtool -e --infile /etc/ssl/certs/ldap_cacert.pem

チェーン検証出力が表示されます:検証済み。

certtool -e --infile /etc/ssl/certs/mydomain.com_slapd_cert.pem

「certtool:最後の証明書は自己署名されていません」と表示されますが、それ以外は問題ないようです。

どこが間違っているのですか?確かに、openldapをubuntuで安全に実行するのは簡単で、ロケット科学の学位は必要ありません。

何か案は?

3
Roger

ロジャーのリンクはその後腐敗しました。彼がサイトを変更する前にアーカイブされた最後の日付の時点で、インターネットアーカイブのWayBack Machineでも同じです: https://web.archive.org/web/20150530064010/http:/ /rogermoffatt.com/2011/08/24/ubuntu-openldap-with-ssltls/

私はまた、彼のコンテンツを以下に追加する自由も取りました:

出発点

古いスタイルのslapd.confのバリエーションではなく、構成にcn = config(LDAPデータベース)を使用して、(保護されていない)openldapが機能していると仮定します。 slapd.confを編集して変更を加える場合は、この記事の残りの部分は適していません。

第一歩

開始するには、いくつかの自己署名証明書を作成します。 opensslを使用してWebサーバーの証明書を既に作成している場合、最初に気付くのは、それらがldapでは機能しないことです。別の形式の証明書が必要です。証明書を生成するには、まだ持っていない新しいツールが必要です。

Sudo -i
apt-get update
apt-get install gnutls-bin
certtool --generate-privkey --outfile /etc/ssl/private/ldap-ca-key.pem
certtool --generate-self-signed --load-privkey /etc/ssl/private/ldap-ca-key.pem --outfile /etc/ssl/certs/ldap-ca-cert.pem

権限を修正します–結果のファイルはopenldapグループが読み取り可能である必要があります。

これを行うには、openldapユーザーをssl-certグループに追加してから、証明書とキーがssl-certグループによって所有されていることを確認します。ディレクトリ/ etc/ssl/privateには厳密な権限があるため、これを正しく行う必要があることに注意してください。

adduser openldap ssl-cert
chgrp /etc/ssl/private/ldap-ca-key.pem

ステップ2

構成データベースにインポートするための適切なssl.ldifファイルを作成します。この時点で、私がオンラインで見たものはすべて構文エラーがあり、それらが機能しなくなったと言う価値があります-そしてそれらは静かに失敗し、あなたはそれらが機能したと思わせます!特に、ハイフンは構文的に重要であることに注意してください。

dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: NORMAL
-
add: olcTLSCRLCheck
olcTLSCRLCheck: none
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap-ca-cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap-ca-key.pem

警告:賢くならないで、TLSCipherSuiteをHIGH:MEDIUMのような賢いものに変更してください:-SSLv2 –これはopensslディレクティブであり、起動時に失敗するため、slapdを再起動できないことがわかります:-(診断するにはこれは、次のコマンドでslapdを開始してみてください。

slapd -d 16383

これを行うと、おそらく次のように表示されます。

TLS: could not set cipher list HIGH:MEDIUM:+SSLv2.
main: TLS init def ctx failed: -1

注意が必要な場合は、/ etc/ldap/slapd.d/cn = config.ldifを直接編集することでこれを修正できます。

ステップ3

Ssl.ldifファイルをインポートし、機能しない場合に表示されるものではなく、機能する場合に表示されるものに注意してください。また、これを複数回実行している場合は、ssl.ldifファイルで置換する追加を変更する必要があることにも注意してください。

ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif -v

-vは、詳細な出力を提供します。次のような内容の場合は、新しいエントリが印刷されていることを確認してください。

modifying entry "cn=config"
modify complete

それなら、これはそれがうまくいったという意味ではありません。エラーが原因でファイルが処理されておらず、実際には変更が加えられていない可能性があります。変更したエントリが一覧表示されるのを確認する必要があります。たとえば、これは動作中のバージョンです(追加ではなく置換を使用)

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
replace olcTLSCipherSuite:
NORMAL
replace olcTLSCRLCheck:
none
replace olcTLSVerifyClient:
never
replace olcTLSCertificateFile:
/etc/ssl/certs/ldap2-ca-cert.pem
replace olcTLSCertificateKeyFile:
/etc/ssl/private/ldap2-ca-key.pem
modifying entry "cn=config"
modify complete

ステップ4

Slapdがldaps://接続をリッスンしていることを確認します。ファイルを再度編集します(cn = configを使用すると、解決するよりも多くの手間がかかると考えている人はいますか?)、今回は/etc/default/slapdを編集する必要があります。次に示すように、SLAPD_SERVICES行を変更してldaps:///エントリを作成します。

SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

ステップ5

信頼できない証明書の問題を修正します。これで完了だと思われるかもしれませんが、別のファイルには非常に重要な構成が1つあることがわかりました。ここで接続しようとすると、次のようなLDAPサーバーにバインドするコマンドラインを使用します。

ldapsearch -d 9 -D “cn=admin,dc=mydomain,dc=com” -w adminpassword -b “dc=mydomain,dc=com” -H “ldaps://mydomain.com” “objectClass=*”

あなたはおそらく得るでしょう。

TLS: peer cert untrusted or revoked (0x42)
TLS: can't connect: (unknown error code).
ldap_err2string
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

これを解決するには、ファイル/etc/ldap/ldap.confを編集し(これはslapd.confファイルではないことに注意してください。少し混乱する可能性があります)、おそらく完全にコメントアウトされたファイルに以下の1行を追加します。 TLS_REQCERTは決して

今ではうまくいくはずです!

4
Ricky C

Ssl.ldifファイルの構文が正しくないようです。オンラインで別のガイドに従った後、これに変更しました(また、自己署名証明書を再生成しました)。

dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: NORMAL
-
add: olcTLSCRLCheck
olcTLSCRLCheck: none
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/new-ca-cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/new-ca-key.pem

これはまだ完全には解決していませんが、少なくとも今は使用できます。

openssl s_client -connect mydomain.com:636 -showcerts

そして実際に結果を得る。詳細がわかり次第、この回答を更新します。

編集:

私は自分の解決策を http://rogermoffatt.com/2011/08/24/ubuntu-openldap-with-ssltls/ で書きました。これは他の誰かを助けるかもしれません。そんなパレーバー!

2
Roger