qmail & VMailMgr というマイナー?な環境を使っているのですが、SMTP-AUTH が使いたくってアレコレ試してみました。
メールの不正リレー対策としては、POP before SMTP と SMTP-AUTH が代表的ですが、どちらにも一長一短がありますが、サーバ側から見た場合、POP before SMTP は比較的簡単に導入が可能ですが、SMTP-AUTH は smtp サーバ自体に手を入れないとならないために導入が難しく、なかなか普及しないようです。
しかも、ぼくが使っている環境が、qmail & VMailMgr という、マイナーな環境(でも、使いやすいですよ)のようで、検索エンジンで検索をしてみてもなかなか情報が無く、いいかげん探すのにも疲れたので、アレコレ試行して 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 では、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 のソースディレクトリに移り、
% 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 と同じ場所にコピー
として、どちらともを併用する方法をお薦めします。
コンパイルは、
% 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.