LDAPクライアントと 389 DS との通信を暗号化するための設定についてまとめる。また、同設定は、389 DS 間でのレプリケーション通信を暗号化する際にも利用できる。ここでは、プライベートCA (認証局) を作り、各サーバ証明書はそれによって署名することにする。
手近な Linux マシン上に自前の CA を作成する。いずれかの LDAPサーバ機を流用してもいい。もちろん、既に CA があるなら作成は不要。
キーの生成や署名作業には、一部 OpenSSL も使うが、多少なりとも作業を楽にするため主として GnuTLS ユーティリティを使用する。CentOS/RHEL では gnutls-utils という名前で標準パッケージがあり、yum 等でインストールできる。certtool コマンドのオプションとテンプレートファイルのフォーマットについては GnuTLS オフィシャルマニュアルの "Invoking certtool" を参照。
この生成には openssl を使う。現状の certtool では RSAキーの生成に異常に時間がかかるからだ (乱数生成デバイスファイルの扱いに問題があるらしい)。
root# cd /etc/pki/CA/private root# openssl genrsa -out cakey.pem 1024 root# chmod 400 cakey.pem
内容を確認したければ、
root# certtool -k --infile cakey.pem
cakey.pem のファイルパーミッションは root:root 400 が適当。
まず、CA証明書(公開鍵)生成のためのテンプレートファイル /etc/pki/CA/private/ca.info を作成する。内容は下記の要領。`serial=xxxx' の指定をしないと証明書のシリアルナンバーが `00' になり、配布しても受け入れてもらえない場合がある。有効期限は極端に長くしておけばいいだろう (例では10年)。ファイルパーミッションは root:root 600 にしておくことを勧める。
cn="Hoge Net CA" organization="Hoge Net" unit="Hoge Net Certificate Authority" country=JP expiration_days=3650 serial=1001 ca cert_signing_key crl_signing_key
自己署名済みCA証明書を作る。
root# cd /etc/pki/CA/private root# certtool -s \ --load-privkey cakey.pem \ --template ca.info \ --outfile ../cacert.pem
内容を確認したければ、
root# certtool -i --infile ../cacert.pem
問題がなければ、利便性のため cacert.pem を /etc/pki/tls/certs/ にコピーしておく。このファイルは公開鍵なので誰でも読めるようにして構わない。ファイルパーミッションは、本物/複製とも root:root 444 もしくは 644 が適当。
389 Management Console (Java版) を使って、ディレクトリサーバの CSR (証明書署名要求) を生成する。CSR はインスタンス毎に生成する必要がある。
![]() ※ デフォルトのセキュリティデバイスはバークレイDB をバックエンドとしたビルトインのソフトウェアセキュリティデバイスで、定義上では "Internal (Software)" というニックネームで呼ばれる。 |
![]() |
![]() |
![]() |
![]() |
まず、CA マシン上で、テンプレートファイル /etc/pki/tls/private/389ds-hogecert.info を作成する。内容は下記の要領。証明書タイプ (下記最後の3行) には tls_www_server, encryption_key, signing_key の 3つを指定する。
cn=centos5u.hoge.com organization="Hoge Net" unit="IT Development" state="Aichi" locality="Nagoya" country=JP expiration_days=730 serial=1001 tls_www_server encryption_key signing_key
次に、前項で生成した CSR ファイル 389ds-hoge.csr を、CA マシン上の /etc/pki/tls/private/ にコピーする。
そして、CA署名済みのサーバ証明書 (公開鍵) を作成する。
root# cd /etc/pki/tls/private root# certtool -c \ --load-request 389ds-hoge.csr \ --load-ca-certificate /etc/pki/CA/cacert.pem \ --load-ca-privkey /etc/pki/CA/private/cakey.pem \ --template 389ds-hogecert.info \ --outfile ../certs/389ds-hogecert.pem
完成したサーバ証明書の内容を確認するには、
root# certtool -i --infile ../certs/389ds-hogecert.pem
389ds-hogecert.pem ファイルはここに置きっぱなしにしておく必要はないが、置いたままにするなら root:root 444 あるいは 644 のパーミッションにしておくのが適当。
389 Management Console (Java版) を使い、インスタンスにサーバ証明書と CA証明書をインストールする。どちらの証明書を先にインストールするのが正解なのかよく分からないのだが、CA証明書をインストールしなおすとそれに絡んだインストール済みのサーバ証明書も消えてしまうことから、もしかすると CA証明書を先に入れる方が正しいのかもしれない。
![]() 第1画面では、前項で作成したCA署名済みサーバ証明書を読み込ませる。389ds-hogecert.pem を cat するなりしてからクリップボードにコピーし、左図の Paste from Clipboard ボタンで貼り付ける方法が確実だ。同画面にはファイルを選択して読み込ませる選択肢も見られるが、その方法ではうまくいった試しがない。 |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Red Hat DS Administration Guide の "Configuring the Directory Server to Run in SSL/TLS" の推奨事項に従うのなら、/etc/dirsrv/slapd-<INSTANCE_NAME>/ にある cert8.db と key3.db のファイルパーミッションを、インスタンス実行ユーザだけが読み書きできる状態にする。当ドキュメントの例だと dsadmin:dsadmin 0600 に設定することになる。
![]() |
![]() Enable SSL for this server にチェック、 Use this cipher family: RSA にチェック。 Security Device と Certificate がサーバ証明書のインストール時に指定したものに間違いないことを確認する。 "Client Authentication" 設定サブグループは、LDAPクライアントからサーバへの接続時に証明書による認証を行う場合のもので、通常はデフォルトの Allow client authentication (つまり認証は任意) のままでいい。 同グループの Use SSL in Console は、管理サーバインスタンスでも SSL/TLS を有効にするまでは、チェックを付けてはいけない。 |
設定を反映させるため、当該のディレクトリサーバインスタンスを再起動する。
root# service dirsrv restart centos5u
この時分かるように、インスタンスの起動の度にセキュリティデバイスのパスフレーズを人間がタイプしてやらなければならない。これでは 389 DS を自動起動できないし 389 Management Console からリモートで再起動するにも困る。そこで、パスワードファイルというものを作っておく。作成するファイルは /etc/dirsrv/slapd-<INSTANCE_NAME>/pin.txt。内容は下記。yourpassword のところは、当該ディレクトリサーバインスタンスのセキュリティデバイスに設定したパスワード。`:' とパスワードの間にスペースを挟んではならないのはもちろん、その前の固定句の大文字小文字やスペースの数も一字一句正確でなくてはならない。ファイルパーミッションは、ディレクトリサーバインスタンス実行ユーザの所有 (当ドキュメントの例だと dsadmin:dsadmin) で 0400 に設定すること。
Internal (Software) Token:yourpassword
もう一度サーバインスタンスを再起動して、パスフレーズを訊かれずエラーも出ないことを確認する。
mozldap 版の ldapsearch を使って TLS接続と SSL接続で検索を掛けてみる。
CA公開鍵 (証明書) を読み込む必要があるため -P オプションで証明書データベースを指定する必要がある。ただし、ldapsearch はカレントディレクトリから証明書データベースを探すようにできているので、先に /etc/dirsrv/slapd-centos5u/ へ cd しておけば -P オプションは必要ない。
root# ldapsearch -h centos5u.hoge.com -p 389 \
-ZZZ -P /etc/dirsrv/slapd-centos5u/cert8.db \
-D "cn=usermanager,dc=hoge,dc=com" -w - \
-b "ou=People,dc=hoge,dc=com" '(objectClass=person)'
TLSの時と違うのはポートと -Z オプションだけ。
root# ldapsearch -h centos5u.hoge.com -p 636 \ -Z -P /etc/dirsrv/slapd-centos5u/cert8.db \ -D "cn=usermanager,dc=hoge,dc=com" -w - \ -b "ou=People,dc=hoge,dc=com" '(objectClass=person)'