2009年9月15日火曜日

FreeBSD でサーバ構築 #15 SMTP Authentication (SMTP-AUTH)

林檎生活100: FreeBSD でサーバ構築 #14 リレー設定の続き.今回は,SMTP に認証を付加する SMTP Authentication の設定を行う.これによって,認証に通ったものだけリレーするようになるので,前回の設定を使わなくてもよくなるw(前回の設定を解除する場合は,/etc/mail/access を空にし,make maps を実行する.)だけど,Sendmail に設定するのは少し面倒くさいんだなぁ…….

SMTP Authentication は,SMTP の拡張機能として RFC2554 で規定されている.Sendmail も V8.10 からサポートしているが,FreeBSD に付属している Sendmail は SMTP Authentication を組み込まれてコンパイルされていない.したがって,SMTP Authentication を組み込むために,Sendmail をリビルドする必要がある.

SMTP Authentication は,SASL (Simple Authentication and Security Layer) というフレームワークによって実現される.そのため,SASL ライブラリが必要になるので,Sendmail に SMTP Authentication を組み込むときによく使われる Cyrus SASL を使用する.(そもそも,ほかのライブラリを知らないw)

また,当然のことながら,認証の際にはユーザ名とパスワードが必要になる.今回は,FreeBSD のユーザ名とパスワードに連動するような方法をとる.(もちろん,独立したユーザ名とパスワードにすることも可能であるが,その方法については説明しない.そのような方法については,sasl auxprop というようなキーワードで検索してほしい.)

FreeBSD のユーザ名とパスワードに連動させる場合,saslauthd というデーモンが必要になる.これは,SASL ライブラリを使用した認証のためのデーモンである.このデーモンが,FreeBSD の PAM (Pluggable Authentication Modules) を使用して FreeBSD のユーザ名とパスワードでの認証を行う.(念のため言っておくと,PAM 以外を使用した認証のデーモンとして動作させることもできる.)つまり,Sendmail は SASL ライブラリを使用して,saslauthd に認証を依頼し,saslauthd が PAM を使用して FreeBSD のユーザ名とパスワードで認証を行い,その結果を Sendmail に返却する.というような仕組み.(たぶん…….)

さて,Sendmail に SMTP Authentication を組み込む作業をしていこう.

1. Cyrus SASL のインストール
cyrus-sasl2 と cyrus-sasl2-saslauthd という Port をインストールする.(cyrus-sasl2-saslauthd は cyrus-sasl2 に依存しているので,cyrus-sasl2-saslauthd をインストールするだけで両方インストールされる.)オプションとして,Berkeley DB を使うように BDB にチェックをいれる.(今後のエントリで書く予定の Cyrus IMAP でも Cyrus SASL を使用する予定で,そのインストール要件に Cyrus SASL を Berkeley DB を使用するようにコンパイルしておくことを強く推奨されてるためである.)
# cd /usr/ports/security/cyrus-sasl2-saslauthd
# make install clean



cyrus-sasl2-saslauthd をインストールすると,Sendmail.conf というものが /usr/local/lib/sasl2 に作成される.これは,Sendmail が Cyrus SASL を使用するときの設定ファイルで,pwcheck_method オプションが記述されており,認証に saslauthd を使用するように設定されている.

2. saslauthd の起動
rc.conf に次の行を追記する.
saslauthd_enable="YES"

そして,次のコマンドで起動する.いつものサーバと同じようなかんじだが,Ports からインストールしたので,/usr/local 以下に起動スクリプトが配置されている.
/usr/local/etc/rc.d/saslauthd start

3. Sendmail のコンパイルオプションの設定
/etc/make.conf に次の行を追記する.(FreeBSD Handbookの説明通り.)
SENDMAIL_CFLAGS=-I/usr/local/include/sasl -DSASL
SENDMAIL_LDFLAGS=-L/usr/local/lib
SENDMAIL_LDADD=-lsasl2

4. Sendmail のリビルドとインストール
次の手順でリビルドとインストールを行う.(FreeBSD Handbookの説明通り.)&& は,左辺の実行が成功したら右辺を評価するという動作をする.
# cd /usr/src/lib/libsmutil
# make cleandir && make obj && make
# cd /usr/src/lib/libsm
# make cleandir && make obj && make
# cd /usr/src/usr.sbin/sendmail
# make cleandir && make obj && make && make install


5. FreeBSD の再起動
再起動して,Sendmail と saslauthd の自動起動を確認する.(saslauthd が起動していないというのが,認証時のハマりポイントだったりするので覚えていてほしい.)

6. Sendmail の設定
次のコマンドを実行することで,ホスト名.mc という設定ファイル(僕の環境では lucifer.legna.org.mc になる.)が生成される.
# cd /etc/mail
# make

その設定ファイルに次の行(バッククウォートとクウォートが対応していることに注意.)を追記する.SASL での認証に平文を使用するという設定である.(認証で最終的に PAM を使用するので,平文でないと認証できないため.)メールクライアントとして,Outlook Express を使用する場合 LOGIN という項目も追加する必要があるらしい.(/usr/ports/security/cyrus-sasl2/files/Sendmail.README を参照のこと.)
dnl Set SASL options
TRUST_AUTH_MECH(`PLAIN')
define(`confAUTH_MECHANISMS', `PLAIN')

設定ファイルをインストールし,Sendmail を再起動する.
# make install
# /etc/rc.d/sendmail restart

7. 設定の確認
次のコマンドを実行し,Compiled with 行に SASLv2 という項目があることを確認する.(sendmail を起動(デーモンとして起動するわけではない.)して最低限のデバッグ情報を出力するようにデバッグモードを設定し,/dev/null を標準入力させることで何も動作させずに終了させている.)
# sendmail -d0 < /dev/null

さらに,telnet で認証方式 250-AUTH PLAIN が表示されることを確認する.
# telnet localhost smtp
EHLO localhost
QUIT

LAN 内の PC で メールクライアントから SMTP Authentication による認証ができるか確認する.平文による認証なので,WAN 側から実行するのはセキュリティ上の問題がある.
また,次のサイトを利用して,不正リレーのチェックを実行する.

Abuse.net: Mail relay testing

これで,SMTP Authentication の設定は完了である./etc/mail/access を設定している場合は,ファイルの内容を空にして make maps を実行しておこう.さて,次回は,STARTTLS という機能を使用して,SMTP セッションを暗号化する方法について記述する.これで,平文による認証ごと暗号化できるので,WAN 側から SMTP サーバを安全に利用することができるようになるのだ♪

参考文献:
sendmail 第3版〈VOLUME1〉運用編
sendmail 第3版〈VOLUME2〉設定編
sendmailクックブック―設定と運用のためのレシピ集
FreeBSD Handbook

追記(2009年10月26日):
saslauthd が使用する PAM について.saslauthd を d オプションで起動して試してみるとわかるのだが,Sendmail から saslauthd を使用した場合,サービス名は smtp になる.しかしながら,/etc/pam.d には smtp がないので,デフォルトの other が使用される.その中身の説明は省くが,デフォルトのままだと UNIX 認証モジュールが使用されることになる.つまり,ログイン時のようにユーザ名とパスワードによる認証が裏で行われる.Sendmail での認証がログイン時のユーザ名とパスワードでできるのはこのためなのだ.

0 件のコメント: