SMTP AUTH

教授から「ノートPCを持ち歩いても、研究室のメールサーバからメールを送りたい」という要望があったので、いろいろ検討してみる。
サーバには OpenVPN が入れてあるので、VPN でつないでからメールを送ってもらえば大丈夫なんだが、教授の Mac にインストールするのは面倒そうなので没。
となると、POP before SMTPSMTP AUTH ってところになる。
Webでいろいろ情報を見てみると、POP before SMTP より SMTP AUTH のほうが導入が楽そうだったので、そっちにしてみた。ちなみに、OS は FreeBSD 5.3 です。

参考にしたのは「SMTP認証の設定メモ.(TLS SSL) [FreeBSD](fkimura.com)」とかその周辺。あとは、それっぽいキーワードでぐぐれ

1. cyrus-sasl の導入と sendmail の作り直し

とは言っても /usr/ports/mail/sendmail-sasl で make install すれば、依存する security/cyrus-sasl2 とか security/cyrus-sasl2-saslauthd もまとめて入ります。

もとの sendmail は /usr/libexec/sendmail/sendmail だけど、ports で入れると /usr/local/sbin/sendmail に入るので、make の最後に出てくるメッセージにしたがって、make mailer.conf もしておく。

2. /usr/local/lib/sasl2/Sendmail.conf

pwcheck_method: saslauthd

に修正。これで saslauthd 経由でパスワードを確認するようになるらしい。

3. /etc/rc.conf の書き換え

sendmail_enable="YES"
sendmail_program="/usr/local/sbin/sendmail"
sendmail_procname="/usr/local/sbin/sendmail"
saslauthd_enable="YES"
saslauthd_flags="-a sasldb"

sendmail_enable="NONE" にして、/usr/local/etc/rc.d/sendmail.sh.sample を sendmail.sh にリネームしてもいいけど、上の設定でもちゃんと動いているようだ。
saslauthd_flags は、パスワードをどう扱うかによって変わる。今回は sasldb を使った。

4. sendmail.cf の作り直し

/usr/local/share/doc/cyrus-sasl2/Sendmail.README に書いてあるように /etc/mail/freebsd.mc と freebsd.submit.mc に設定を追加して make install。
→本当は hostname.mc に書くのが行儀がいい方法みたい?

freebsd.mc に追加

TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5')dnl
define(`confAUTH_MECHANISM', `DIGEST_MD5 CRAM-MD5')dnl
define(`confDONT_BLAME_SENDMAIL', `GroupReadableSASLDBFile')dnl

※ define(`confRUN_AS_USER',`root:mai') は 
※ saslauthd を使う場合は無くても大丈夫みたい

freebsd.submit.mc に追加

DAEMON_OPTIONS('Name=NoMTA, Addr=127.0.0.1, M=EA')dnl

5. 起動&再起動

/usr/local/etc/rc.d/saslauthd.sh start
/etc/rc.d/sendmail restart

6. パスワード設定

saslpasswd2 username でパスワードを設定。

7. 確認

Thunderbird だと SMTP サーバの設定で、「ユーザ名とパスワードを利用する」をチェックしておけばいい。あとは、自分宛にでもテストメールを送ってみる。

SMTP AUTH で受け付けられると、Recieved: が普段とちょっと変わりますねぇ。うちのサーバだとこんな感じ。

Received: from [127.0.0.1] (***.um.u-tokyo.ac.jp [133.11.***.***])
        (authenticated bits=0)
        by ***.sakamura-lab.org (8.13.4/8.13.1) with ESMTP id ******
        for <*****@*****>; Fri, 15 Apr 2005 12:00:00 +0900 (JST)
        (envelope-from ***@****)

ちなみに、最初は telnet でつないで確認しようと思ったけど、CRAM-MD5 とか DIGEST-MD5 の計算が面倒なんで、EHLO で、ちゃんと sendmailSMTP AUTH 対応でこんぱいる出来てるか見るだけでやめました^^;

8. おまけ STARTTLS (TLS) サポート

Sendmail.README にあるように、Outlook Express は AUTH Mechanism に LOGIN が必要だそうで、いちおうこれでもパスワード垂れ流しにならないように対策ってことで、TLS も使えるように試してみる。

証明書の作成

というか、imap over SSLpop3 over SSL 用に証明書があるので、それを使い回すことにした。

ln -s /usr/local/certs/imap.pem /usr/local/certs/sendmail.pem 

ちなみに、手作業で作るなら多分次のコマンド。作られた sendmail.pem は chmod 600 しておく。

openssl req -new -x509 -days 365 -nodes -out sendmail.pem -keyout sendmail.pem 

それから、FreeBSDsendmailports では、make tls-install でキーの生成を行ってくれるそうです。

sendmail.cf の作り直し

freebsd.mc の TRUST_AUTH_MECH と confAUTH_MECHANISM に LOGIN を追加。
証明書の場所の指示を追加。

dnl STARTTLS (TLS) Support
define(`confCACERT_PATH',`/usr/local/certs')
define(`confCACERT',`confCACERT_PATH/sendmail.pem')
define(`confSERVER_CERT',`confCACERT_PATH/sendmail.pem')
define(`confSERVER_KEY',`confCACERT_PATH/sendmail.pem')

修正したら、make install restart。

Outlook Express 設定

メールアカウントの「サーバ設定」タブで、「このサーバは認証が必要」をチェック。其の横の「設定」も必要に応じて直す。「詳細設定」タブで、SMTPSSL を使うようにチェックを入れる。(「SMTP認証の設定メモ.(TLS SSL) [FreeBSD](fkimura.com)」に画像があります)

これで Outlook Express でも、暗号化されるので一応安心。ちなみにアンチウィルスソフトを使っていて「発信電子メールをスキャン」などを設定していると(たぶんデフォルトONになってる)、送信失敗するみたいなので、試す前に OFF にしておきましょう。