SMTP-AUTH してみよう

qmail & VMailMgr というマイナー?な環境を使っているのですが、SMTP-AUTH が使いたくってアレコレ試してみました。

概略

メールの不正リレー対策としては、POP before SMTP と SMTP-AUTH が代表的ですが、どちらにも一長一短がありますが、サーバ側から見た場合、POP before SMTP は比較的簡単に導入が可能ですが、SMTP-AUTH は smtp サーバ自体に手を入れないとならないために導入が難しく、なかなか普及しないようです。

しかも、ぼくが使っている環境が、qmail & VMailMgr という、マイナーな環境(でも、使いやすいですよ)のようで、検索エンジンで検索をしてみてもなかなか情報が無く、いいかげん探すのにも疲れたので、アレコレ試行して SMTP-AUTH が使えるようにしてみました。

qmail-smtpd-auth で SMTP-AUTH だけ許可するぞパッチ

qmail で SMTP-AUTH を実現するためには、qmail-smtpd-auth パッチ がありますが、 SMTP-AUTH を必要とするような運用ではすでに POP before SMTP を導入されているか、RELAYCLIENT による制御を行っているのではないかと思います。 そのような環境では認証無しに送れてしまう(^^; ので(PbS や RELAYCLIENT により許可されてしまう)、認証しなくては送れないようにしてみました。

この場合、認証無しでは動作しなくなるので、qmail-smtpd と SMTP-AUTH 専用の qmail-smtpd(qmail-smtpd-auth にリネーム)を使って、

qmail-smtpd : port 25
POP before SMTP を利用したメールサーバ
クライアントは選ばないが、送信前に受信動作が必要
qmail-smtpd-auth : port 10025
SMTP-AUTH を利用した送信専用サーバ
クライアント側の対応が必要だが、扱いは簡単

と、2つの smtp サーバを立ち上げて使いましょう。一つ一つのプロセスが軽量な qmail ならではですね。

qmail-smtpd-auth 用認証プログラム for vmailmgrd

qmail-smtpd-auth では、chkeckpassword 互換の認証プログラムが使えるのですが、VVMailMgr 付属の checkvpw ではうまく認証ができませんでした(おそらく、実行UIDの関係)。 そこで、実行UIDに関係なく認証を行える vmailmgrd を利用した認証プログラムを作ってみました。

vmailmgrd は、unix ドメインソケットを利用した認証デーモンで、PHP からの呼び出しでも使われています。この認証デーモンは、システムアカウントのみでなく、VMailMgr で管理しているバーチャルユーザーも認証可能なので、SMTP-AUTH にはもってこいの認証デーモンなのです。

なお、この認証プログラムは、qmail-smtpd-auth で使うことのみを目的としているため、chkeckpassword との完全な互換性はありません。また、認証方法としては PLAIN でのみ利用できます。

セットアップ方法

ダウンロード

まずは、パッチとソースをダウンロードしてください。 もちろん、すでにダウンロード済みの場合は、ダウンロードの必要はありません。

qmail 本体
qmail * djbdns by D. J. Bernstein よりダウンロード
qmail-smtpd-auth パッチ
qmail-smtpd-auth よりダウンロード(0.30 release 推奨)
VMailMgr 本体
VMailMgr よりダウンロード
qmail-smtpd-auth で SMTP-AUTH だけ許可するぞパッチ
qmail-smtpd-auth-0.30-iwm.patch をダウンロード
qmail-smtpd-auth 用認証プログラム for vmailmgrd
chk_vmauth.c をダウンロード

qmail-smtpd-auth の作成

まず、qmail-smtpd-auth のパッチを適用します。その後、qmail のソースディレクトリに移り、

% patch -p1 < (path/to/)qmail-smtpd-auth-0.30-iwm.patch

などとして、パッチを当てたら、普通に make して完成です。

ただし、このパッチ適用後は、認証していない場合はエラーを返すため、

1.普通に qmail をコンパイルしてできた qmail-smtpd をどこかにコピー
2.パッチを当てた qmail-smtpd を qmail-smtpd-auth にリネーム
3.コピーしておいた qmail-smtpd を戻す
4.インストール後に、qmail-smtpd-auth も qmail-smtpd と同じ場所にコピー

として、どちらともを併用する方法をお薦めします。

chk_vmauth の作成

コンパイルは、

% gcc -o chk_vmauth chk_vmauth.c

とするだけでOKです。が、環境に合わせた調整をソースに加えてください。 といっても、ソース先頭の VMAILMGR_SOCKET を変更するくらいで大丈夫だと思いますが…。

コンパイル後は、qmail-smtpd と同じディレクトリにコピーしておけばいいと思います。

設定

特に特別な設定は無いので、qmail/qmail-smtpd-auth/VMailMgr の設定を参照してください。変わるところは、checkpassword の変わりに、chk_vmauth を指定することでしょうか。checkpassword と違い、/bin/true のような引数は必要ありません。

たとえば、inetd で起動している場合、

smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env tcp-env /var/qmail/bin/qmail-smtpd
10025 stream tcp nowait qmaild /var/qmail/bin/tcp-env tcp-env /var/qmail/bin/qmail-smtpd-auth mail.domain.name /var/qmail/bin/chk_vmauth

のように設定することになります。この場合、smtp ポートでは普通の qmail-smtpd が、10025 ポートでは SMTP-AUTH 専用の qmail-smtpd-auth が動くことになります。 tcpserver を利用している場合も同様に設定します。

終わりに

このページを公開したころは、

qmail-smtpd-auth が、なぜ認証できなくても送信できるようになっているのか、かなり悩んでいます。こういうものなんですかねぇ? というわけなので、このパッチを適用する場合は、上に書いたように POP before SMTP と併用しての運用をお薦めします。 でも、なぜかなぁ…やはり、メール受信の関係でしょうか。どなたか、理由を知りませんか?

ということを書いていましたが、よくよく考えれば「一度は接続をしないと」リレーしてよいかどうかの判断はできないわけですし、 接続後も別口で RELAYCLIENT による許可をしているわけですから、PbS を廃止して(併用してもいいけど)smtp-auth 専用のポートを設定するというのが正解のような気がします。



Presented by Kazuhiko Iwama.