2009年10月15日木曜日

FreeBSD でサーバ構築 #16 SMTP over SSL: TLS による暗号化通信

林檎生活100: FreeBSD でサーバ構築 #15 SMTP Authentication (SMTP-AUTH)の続き.前回は,認証のための機能を Sendmail に導入した.今回は,その認証のための通信を暗号化するために SMTP over SSL を導入する.

SMTP over SSL とは,SMTP セッションを SSL によって暗号化するものだ.(SSL と TLS については参考文献を参照してほしい.)これによって,メールクライアントからメールサーバへの通信は暗号化される.認証を行い,メールを受け渡すプロセスまでだ.しかし,メールサーバから次のメールサーバに転送される場合の通信の暗号化は保証されない.つまり,メールが最終配送先に届くまでの経路すべてが暗号化されるわけではないことに注意しよう.ここで暗号化の対象としているのは,メールの内容ではなく,認証時のユーザ名とパスワードなのだ.(メール本体の暗号化の問題は,全然別になるってことだね.)

さて,さっそくその機能を導入しよう.幸運なことに,この機能はすでに FreeBSD の Sendmail に入っているので,SSL 証明書を配置し,設定を変更するだけでいい.(生成については,林檎生活100: OpenSSL で自己署名証明書を作成する林檎生活100: Namecheap で格安 SSL 証明書を取得する方法を参考にしてほしい.)

1. /etc/mail/certs ディレクトリを作成する.
# mkdir /etc/mail/certs

2. /etc/mail/certs ディレクトリに証明書を配置(もしくは生成)し,アクセス権を次のように変更する.(秘密鍵のアクセス権に注意.証明書へのシンボリックリンクととなるハッシュのファイル名は,対象の証明書によって異なる.ちょっとここらへんの用途がわかってない.)
・自己署名証明書の場合
lrwxr-xr-x 1 root wheel 8 Oct 15 05:06 807f5ca7.0 -> cert.pem
-rw-r--r-- 1 root wheel 1172 Oct 13 05:41 cert.pem
-rw------- 1 root wheel 887 Oct 13 05:41 key.pem

・ルート CA による署名済み SSL 証明書の場合
lrwxr-xr-x 1 root wheel 10 Oct 15 05:05 594f1775.0 -> cacert.pem
-rw-r--r-- 1 root wheel 1162 Oct 13 05:41 cacert.pem
-rw-r--r-- 1 root wheel 1172 Oct 13 05:41 cert.pem
-rw------- 1 root wheel 887 Oct 13 05:41 key.pem

3. /etc/mail/lucifer.legna.org.mc(自分の環境に合わせた設定ファイルを変更すること.)を変更する.
3.1. まず,非暗号化通信時に認証を行わないように設定する.これによって,暗号化されていない状態での認証を防ぎ,ユーザ名やパスワードの漏洩を防止する.
dnl Set SASL options
TRUST_AUTH_MECH(`PLAIN')
define(`confAUTH_MECHANISMS', `PLAIN')
define(`confAUTH_OPTIONS', `p')(この行を追加する.)

3.2. 使用する SSL 証明書など,SMTP over SSL に関わるオプションを設定する.(上から順に,証明書ディレクトリへのパス,CA 証明書へのパス,サーバ証明書へのパス,サーバ秘密鍵へのパスである,最後のオプションは,クライアント検証を行わないというオプションである.クライアント認証うんぬんの話は割愛する.)
・自己署名証明書の場合
dnl SSL Options
define(`confCACERT_PATH',`/etc/mail/certs')
define(`confCACERT',`/etc/mail/certs/cert.pem')
define(`confSERVER_CERT',`/etc/mail/certs/cert.pem')
define(`confSERVER_KEY',`/etc/mail/certs/key.pem')
define(`confTLS_SRV_OPTIONS', `V')

・ルート CA による署名済み SSL 証明書の場合
dnl SSL Options
define(`confCACERT_PATH',`/etc/mail/certs')
define(`confCACERT',`/etc/mail/certs/cacert.pem')
define(`confSERVER_CERT',`/etc/mail/certs/cert.pem')
define(`confSERVER_KEY',`/etc/mail/certs/key.pem')
define(`confTLS_SRV_OPTIONS', `V')

4. 設定ファイルを更新し,Sendmail を再起動する.
# cd /etc/mail
# make install
# /etc/rc.d/sendmail restart

これで,SMTP over SSL による通信ができるようになったはずである.メールクライアントの設定を変更して,TLS による接続を試みてみるといい.また,暗号化していない状態での認証が棄却されることを確かめよう.

また,telnet で 250-STARTTLS が表示されることで設定されているか確認できる.STARTTLS というのは,暗号化通信を開始するコマンド名である.

正常に動作しないときは,/var/log/maillog を確認してみよう.エラーメッセージがファイルの最後あたりに出ていると思う.

以上.こんな感じで Sendmail を設定して,メールクライアントから見た場合の送信用サーバが完成した♪

WAN 側から接続する際には,TCP 25 番に対してポートマッピングを設定しよう.

次回は,メールクライアントから見た受信用サーバを構築の段階に入る.いまや自分用サーバで POP サーバを使う必要性は感じないので,IMAP サーバを対象とする.メジャーな IMAP サーバはいくつかあるが,この Blog では UW IMAP と Cyrus IMAP を取り上げる.導入な簡単な UW IMAP を先にさっくり構築してみて,その後で Cyrus-IMAP の構築をやる.少ない人数で大量のメールをさばかないのであれば,前者の UW IMAP で十分だと思う.UNIX のメールシステムとの親和性も高いので,すごく自然に導入できる.しかし,人数が多かったり大量のメールをさばかなければならないのであれば,後者の Cyrus IMAP を使用した方がいいだろう.クウォータを利用したい場合もこっちになる.

とりあえず,それぞれのサーバの特徴などは次回以降説明する.お楽しみに〜.

参考文献:
Wikipedia: Secure Sockets Layer
RFC2487: SMTP Service Extension for Secure SMTP over TLS
sendmail 第3版〈VOLUME1〉運用編
sendmail 第3版〈VOLUME2〉設定編
sendmailクックブック―設定と運用のためのレシピ集
FreeBSD Handbook

追記(2009年10月15日):
クライアント検証・認証についての補足.

今回の設定で,メールクライアントがサーバを検証することが可能になり,接続先メールサーバが保証されることになる.(自己署名の場合はダメだけどねw)しかし,メールサーバはクライアントを認証を通った誰かとしか感知しない.よって,サーバがクライアントを検証したい場合に,クライアント検証が必要になる.しかしながら,証明書を持って接続してくるクライアントを検証するという設定が今回のサーバに必要ないと思ったので,自動的に検証しようとする動作を無効化するオプションを付加した.(また,僕の理解が浅いので説明したくなかったというのもあるw)

クライアント認証というのは,クライアントの証明書をもとに認証する方法.これも使い方によっては便利だと思うのだが,僕が必要としなかったのと,その説明をきちんとできなさそうだったので説明していない.

加えて,今回設定したサーバがメールを転送する際には,別のサーバから見てクライアントになる.その際に証明書を呈示する設定もできるのだが,省略してある.これについても必要性を感じなかったからである.

今回の設定は,あくまでユーザ名とパスワードによる認証を暗号化することが目的なので,ほかの観点について抜けていて申し訳ない.

0 件のコメント: