そろそろLDAPにしてみないか?
第11回 OpenLDAPとSSL
今回のテーマは暗号化です。SMTPやPOP3プロトコルでは平文パスワードがネットワーク上を流れることが知られていますが,LDAPでも同じことが言え,tcpdumpなどでキャプチャしてみると,パスワード文字列を簡単に取得することができてしまいます。
たとえば,UNIXアカウントをOpenLDAPで管理する場合,実際のパスワード情報はLDAPサーバ上のuserPassword属性中に暗号化された状態で格納されていますが,ネットワーク上のトラフィックをキャプチャしてみると,平文のパスワードを取得することができてしまいます。
信頼されたネットワーク内のみで運用するのであれば話は別ですが,盗聴の危険性を考慮した場合,ネットワーク経路の暗号化を是非検討してみてください。
暗号化の種類
データを暗号化させるためには,いくつかの方法が考えられますが,これはSMTP/POP3/IMAPなどの基本的なプロトコルにおける考え方と同様です。
ひとつ目の方法はSSL/TLSにより,トラフィック全体を暗号化させることです。この場合SSLを使用しますので,LDAPサーバ上にサーバ鍵,証明書,CA情報などを設置しておく必要があります。トラフィックをSSLでカプセリングすることで,パスワード情報だけではなく接続の最初から最後までの全情報を暗号化させることができることが最大のメリットです。また,暗号化だけではなく信頼された接続先に安全に接続できる,という意味も持ちます。
もうひとつの方法は,LDAPバインド時の認証情報のみを暗号化させることです。この場合,バインド時の情報だけが暗号化されていますので,エントリを取得する際の情報は平文の状態となります。SMTP Authの設定を経験されたことのある読者はご存じかと思いますが,CRAM-MD5方式などの暗号化メソッドがそれに該当します。データの一部しか暗号化されないのであれば,「最初からSSL/TLSにしていたほうが良いのでは?」と考える読者の方もいらっしゃるかもしれませんが,全てを暗号化するわけではないため,SSLよりもパフォーマンス的に優れる,というのがメリットです。
今回は前者のSSLによる設定を紹介します。
OpenLDAPとSSL/TLS設定
SSL設定を行うためにはサーバ鍵,証明書などの情報が必須です。通常であればVeriSignのような認証局にCSRを提出し,証明書を取得する手順となりますが,今回は皆さん予想されているとおり,自己証明書を使った構築方法を説明します。
ちなみに,証明書を作成するためのOpenSSLには証明書を手軽に作成するための,CA.shやCA.plというスクリプトが含まれていることが多いのですが,お使いのディストリビューションによっては,opensslコマンドは存在するが,CA.shが存在しない,という場合もありますので,今回はCA.shを使わない方法を説明します。
サーバ鍵の作成
opensslコマンドを使ってサーバ鍵を作成しますが,例のごとく鍵にパスフレーズが含まれていると,安全ではあるのですが運用上不便なところも多いため,パスフレーズ無しの鍵を作成しておきます。
図1 サーバ鍵の作成
% mkdir /tmp/ssl % cd /tmp/ssl % openssl genrsa -in server.key.tmp -out server.key Generating RSA private key, 1024 bit long modulus ................................................................++++++ .++++++ unable to write 'random state' e is 65537 (0x10001) Enter pass phrase for server.key.tmp: パスフレーズを入力 Verifying - Enter pass phrase for server.key.tmp: パスフレーズを入力 % openssl rsa -in server.key.tmp -out server.key Enter pass phrase for server.key.tmp: 先ほどのパスフレーズを入力 writing RSA key
次に自分自身でサインする証明書を作成します。今回の目的は先に述べたよう,暗号化のみであるため,公の認証局は使用しません。また,後々の運用を楽にするため,有効期限をかなり長めに設定します。
図2 自己証明書の作成
% openssl req -new -x509 -days 3650 -key server.key -out server.crt You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Tokyo Locality Name (eg, city) []:Minato-ku Organization Name (eg, company) [Internet Widgits Pty Ltd]:BLUECOARA Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:secure.bluecoara.net Email Address []:
整理しておきますと,サーバ鍵と証明書の内容は次のようなフォーマットになります。
リスト1 サーバ鍵(server.key)
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDJU87P/DCNcbT1GbUF4GGsd0AlA637NO9RZ8VV3WGca5ovPqII
SYYjCEaVdlLdhfw545W5gS4LprsAFU00DKz9G+WAk2GwZgFxO8W5xB8RtvUTokeK
s/PsOxDFR8PX2UTRZqZePnfxtAHx/Yd7e5EfamZpJ5/eqshjIbcP3p6MUQIDAQAB
AoGBAMMTb9tb03faa6rqo9rz1fCVBBRZgmVcn19Tm4RdpE06fgW1PK+m/lBHno0I
P7biMsms2dELeKBVh/DGsy3x8lL+eFEBYo9d9jeHUY6E0Y4e1GhNDisZwKehQUiV
VwqHI81YbDMmtrZ2U4RWuddgKSyeVa+o63zYqhw/Tps7H+zZAkEA6FD2Sl12ISKZ
WOZsj6q0orS4TjAjNOU+Z3Ql0deHzkbRN4xJL4QizVIP36+aiEpWydW7d7cnaxu1
Hpoy7bti4wJBAN3aF2ql39nzwpYaQclbXYVgpsoxSPiapo/8ZpuV7dR6izuqW84l
BsefE+1cfoU3yKtkZd6xRwG5gw5lqts31jsCQQDi2aQWK7tdUcbCC4d4pm1q7+OE
3faTAUN1i/IePUMshvRnNIKGdpXxPi+n8naInWawAhfkJ6HDMjQjJNmUUMWXAkEA
ydlgbNw266rpZIDHUlkaofvqRRTKe8bZvS+8e9rR5P0KKWM63Di8DmwiSVhalQLI
RYi3VwKcxGjxYOwHpCUNeQJAAoEVQVxUhQq2aXKOaEdjjmODTh+WnbY0OcRgX6KX
ZDKv4VOV+kRO5G1pKjtM/PMclhzf4l5lHZe5/BWE1LA2Gw==
-----END RSA PRIVATE KEY-----
リスト2 証明書(server.crt)
-----BEGIN CERTIFICATE-----
MIIDEDCCAnmgAwIBAgIJALnZerfv4y/qMA0GCSqGSIb3DQEBBQUAMGQxCzAJBgNV
BAYTAkpQMQ4wDAYDVQQIEwVUb2t5bzESMBAGA1UEBxMJTWluYXRvLWt1MRIwEAYD
VQQKEwlCTFVFQ09BUkExHTAbBgNVBAMTFHNlY3VyZS5ibHVlY29hcmEubmV0MB4X
DTA4MDUwNDAzMjMxM1oXDTE4MDUwMjAzMjMxM1owZDELMAkGA1UEBhMCSlAxDjAM
BgNVBAgTBVRva3lvMRIwEAYDVQQHEwlNaW5hdG8ta3UxEjAQBgNVBAoTCUJMVUVD
T0FSQTEdMBsGA1UEAxMUc2VjdXJlLmJsdWVjb2FyYS5uZXQwgZ8wDQYJKoZIhvcN
AQEBBQADgY0AMIGJAoGBAMlTzs/8MI1xtPUZtQXgYax3QCUDrfs071FnxVXdYZxr
mi8+oghJhiMIRpV2Ut2F/DnjlbmBLgumuwAVTTQMrP0b5YCTYbBmAXE7xbnEHxG2
9ROiR4qz8+w7EMVHw9fZRNFmpl4+d/G0AfH9h3t7kR9qZmknn96qyGMhtw/enoxR
AgMBAAGjgckwgcYwHQYDVR0OBBYEFP2Kyzw0LBvTf2Q5DjVpckh/2tXAMIGWBgNV
HSMEgY4wgYuAFP2Kyzw0LBvTf2Q5DjVpckh/2tXAoWikZjBkMQswCQYDVQQGEwJK
UDEOMAwGA1UECBMFVG9reW8xEjAQBgNVBAcTCU1pbmF0by1rdTESMBAGA1UEChMJ
QkxVRUNPQVJBMR0wGwYDVQQDExRzZWN1cmUuYmx1ZWNvYXJhLm5ldIIJALnZerfv
4y/qMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAOjeLtA8YNh6QUuoP
tLYt6RcJgWLVqpkpFv8f3kJgY02AIeSvcWP7sHCFtALf4YkhKEG8eKfQt3kA2jHb
C3XJzxWGHMLoMBwe3IPdQbeadp8NyWVq6PqlAp0SpX42qRA3oUK0w6d/S4GUnE0S
8n8o7k/mglbG1Q+aQdY9JQbD+o8=
-----END CERTIFICATE-----
では,これらのファイルを便宜上/etc/openldapディレクトリ中にコピーしてください。安全のためサーバ鍵のパーミッションは管理者のみが参照できるように設定しておきます。
図3 ファイルの配置
# cp server.key /etc/openldap/ # cp server.crt /etc/openldap/ # chmod 600 /etc/openldap/server.key # chown ldap:ldap /etc/openldap/server.*
また,公の認証局を使用する場合には,必要に応じてその認証局のCA情報を同ディレクトリに保存しておいてください。


