SMTP AUTH 顛末記

関口隆昭(大学院情報学研究科)

1. はじめに

SMTP はインターネットにおける代表的なメール転送プロトコルです.しかし SMTP にはクライアントを認証する手段が用意されていなかったため,適切な設定を行っていないと,いわゆる SPAM メールの中継や「なりすまし」メールの原因となり,ある日突然,他サイト等から苦情が来ることになってしまいます.

そんなSMTPにも,RFC 2554に定義された「AUTH」拡張によって,クライアントを認証する手段が提供されました.この夏,私達の研究室では先生方を始めとして外国へ出張する人が多いため,SPAM メールの中継を拒否しつつ研究室外からでも研究室のメールサーバを使用してメールを送信できるように,この SMTP AUTH による認証システム付きのメールサーバを導入することになりました.

2. インストール

今回インストールしたソフトウェアは以下のとおりです.

sendmail は,Cyrus imapd 用に開発された認証用ライブラリ SASL(Simple Authentication and Security Layer)を用いることによって,バージョン 8.10 から SMTP の AUTH 拡張に対応しています.以下にそれぞれのインストールの顛末を簡単に書きますが,特に記録をとっていたわけではないので,かなりうろ覚えの記憶を頼りに書いていることをご了承ください.なお,インストール対象のマシンは Sun Ultra 60 + Solaris 7 です.

Berkley DB 3.1.14

まずは Berkley DB(Database) が必要だとのことです.このデータベースライブラリ自体は,すでに別マシンの /usr/local に入れてあったのですが,こちらはパッケージから入れたものであり多少バージョンが古かったので,改めて入れなおすことにしました.

% tar xvfz db-3.1.14.tar.gz
% cd db-3.1.14/build_unix/
% env CFLAGS=-O2 ../dist/configure --prefix=/usr
% make
# make install
      

インストール自体は何事もなく完了したのですが,SASL の構築(後述)の時になってはじめて,実はシェアードライブラリ(libdb.so)のほうが必要であったこと,そして普通に make しただけでは作ってくれていないことが判明しました.そのため make をやり直すことになりました.

% make distclean
% env CFLAGS=-O2 ../dist/configure --prefix=/usr --enable-dynamic
% make
# make install
      

Kerberos 4 1.0.1

Berkley DB のインストールが終わった時点で,SASL のインストールを試みました.SASL の配布ファイルに含まれていたドキュメントによれば,Kerberos 4 はオプショナルなものであると書かれていたからです.ところが,いざ SASL の configure を走らせてみると,今度はライブラリ libdes.so が無いと警告が出ました.そんなものは最初から入れていないので,この際 Kerberos 4 もインストールしておくことにしました.

% tar xvfz krb4-1.0.1.tar.gz
% cd krb4-1.0.1
% env CFLAGS=-O2 ./configure
% make
# make install
      

インストールは問題無く終わったのですが,やはりシェアードライブラリが出来ていなかったので,また make をやり直しました.

% make distclean
% env CFLAGS=-O2 ./configure --enable-shared
% make
      

しかし,シェアードライブラリを作らせようとすると,どうしてもエラーが出て make が途中で終了してしまいます.インストール対象のマシンに既に入っている別のライブラリが原因でエラーが出ているみたいでしたが,原因を探るのがめんどくさかったのと,目的のライブラリの構築までは出来ていたこともあり,Makefileを見つつ手動でライブラリをコピーして,めでたく一件落着としました.

# cp libdes.so /usr/athena/lib
# cp libkrb.so /usr/athena/lib
# ...
      

Cyrus SASL 1.5.21

以上で,やっとSASLの構築に入ることができました.ところが configure が,やはり libkrb.so が無いと警告を出してきます.ログファイルを見たところ,nslライブラリ内の関数を参照できないのが原因で libkrb.so のテストプログラムがリンクに失敗しているみたいでしたので,明示的に nsl ライブラリを指定して configure を再実行しました.

% tar xvfz cyrus-sasl-1.5.21.tar.gz
% cd cyrus-sasl-1.5.21
% env CFLAGS=-O2 LIBS=-lnsl ./configure --prefix=/usr \
--with-des=/usr/athena --enable-krb4=no \
--enable-gssapi=no --enable-login=yes
% make
# make install
      

LOGIN認証(--enable-login)は,デフォルトでは使用不可になっていますが,Microsoft Outlook Express がLOGIN認証を使うらしいので,使用可能にしておきました.

Sendmail 8.10.2

最後が sendmail のインストールです.昔やった時と何だか make の方法が変わっていて一瞬戸惑いましたが(昔は makesendmail とかいうスクリプトを走らせていたような気がします),ここは何の問題も起きませんでした.

ソースを展開して,まずは devtools/Site/site.config.m4 を書きます.

APPENDDEF(`confLIBS', `-ldes -lgdbm')
APPENDDEF(`confLIBDIRS', `-L/usr/athena/lib -R/usr/athena/lib')
APPENDDEF(`confENVDEF', `-DSASL')
APPENDDEF(`conf_sendmail_LIBS', `-lsasl')
      

その後 make,そしてインストールをしました.

% sh Build
# sh Build install
      

3. 設定と動作確認

インストール完了後,まず SASL のパスワードデータベースを作成しました.データベースの作成とパスワードの設定はコマンド saslpasswd で行います.例えばあるユーザーのパスワードを設定するときは,サーバ上でスーパーユーザーになり,

# saslpasswd ユーザー名
      

と打ち,その後パスワードを入力します.スーパーユーザーにならないとパスワードを設定できないのでは個々のユーザーにとって不便であるので,今後改良する必要があると思われます.

その後,作成したパスワードデータベースを sendmail から利用できるように,/usr/lib/sasl/Sendmail.conf というファイルを作成して, 次の一行を書いておきました.

pwcheck_method: sasldb
      

最後に sendmail.cf の作成を行いました.今までは CF を使用していたのですが,どうやら SMTP AUTH 対応はしていないようなので,sendmail 付属のツールで作成することになりました.m4 という新たな言語(大昔からあるらしいですが,少なくとも私は初めて使いました)に手間取りましたが,sendmail 付属の README を読みつつ何とか設定を行いました.SMTP AUTHに関係があるのは次の2つのマクロです.

define(`confAUTH_MECHANISMS', `LOGIN DIGEST-MD5 CRAM-MD5')dnl
TRUST_AUTH_MECH(`LOGIN DIGEST-MD5 CRAM-MD5')dnl
      

「confAUTH_MECHANISMS」は AUTH コマンドで利用可能な認証方式であり,その中でも「TRUST_AUTH_MECH」に定義された認証に成功すればメールの中継が許可される,と理解したのですが,これは間違っているかもしれません.とりあえず出来上がった sendmail.cf を読むと,デフォルトでは中継は拒否するが,認証されたクライアントに対しては中継を許可するようです.

MUA側の設定は以下のようになります.

ユーザー名の後に「@ドメイン名」が必要となることになかなか気が付かず苦労しました.ドメイン名の部分は,デフォルトではサーバのホスト名(FQDNではない)になります.これは,サーバ側のどこかの設定で変更できると思うのですが,まだよくわかっていません.

Outlook Express バージョン5での設定を例に挙げると,「ツール」メニューから「アカウント」を選択し,「メール」でサーバを選択してから「プロパティ」を押し,「サーバー」タブの「このサーバーは認証が必要(V)」チェックボックスをONにして,「設定(E)」ボタンを押して出てきたダイアログボックスで上記のものを入力します.ただ,このダイアログボックス上の「セキュリティで保護されたパスワード認証でログオンする(S)」というチェックボックスは機能しません.どうやら,ここで使われる認証機構は sendmail では対応していないもののようです.チェックしないとLOGIN認証が使用されます.

必要な作業は終わり,後は動作確認です.Outlook Express を用いて行ってみたのですが,案の定うまく行きませんでした(原因は,LOGIN認証を使用可能なようにSASLを構築していなかったことと,アカウント名に「@ドメイン」が必要なことになかなか気が付かなかったからです).LOGIN認証以外の認証方式に関しては,研究室の先生にお願いして動作確認を行ってもらったところ,うまく動いているようでした.

4. まとめ

今回はメール中継問題に対する1つの対策として,Sendmail 8.10 と SMTP AUTH のインストール及び設定を行いました.ドキュメントがいまだ少ないこともあり時間がかかりましたが,問題無く動作するところまでは確認できました.

SMTP AUTHは,Outlook Express,Netscape Messenger,Eudora Pro等,多数のMUAが対応しているようですが,MUAによって使用できる認証方式に違いがあります.特に,事実上ユーザー数が最も多いと思われる Outlook Express では,セキュリティレベルが比較的低いLOGIN認証しか使用できません.SMTP AUTH の利用が主流になるかどうかは,各MUAの今後の対応次第であると思われます.

MTA間の認証等,まだよくわかっていない点が多いのですが,読まれた方の参考に少しでもなれば幸いです.