qmailでPOP before SMTP (IMAP4 before SMTP)

この記事は古いバックアップを漁っていたら久しぶりに発掘されたので記念に載せていますが、内容が恐ろしく古いので参考にはしない方が良いでしょう。PostfixでSMTP-AUTHを使うべきです。

sendmailは古くからある最も代表的なMTAで、多くのUNIXシステムに標準で導入されます。(何でも出来ると言えるほど)非常に多機能を誇りますが設定が難解で実際にはその多機能ぶりも小さなネットワークでは殆ど利用せずに持て余してしまうでしょう。
配送も遅く、セキュリティ上の心配が常に付きまとうので複雑で特殊なネットワーク以外では出来ることなら利用を避けたいところです。

INTAA.NET(いんたぁ.ねっと)の前身であるGuardiansではeximを導入していました。
eximは、高機能でありながらsendmailより遥かに簡単に設定出来るということでdebian linux等で標準のMTAとなっています。eximは頻繁にバージョンアップしているんだけど、がとはexim2.05の時代までしか使用しなかったので現在どんなものになっているのかよく知りません。頻繁にパージョンアップし、しかも色々と変わるのでついて行くのが大変です。

postfixはsendmailとの互換性が高くてqmailの様に高速で安全ということで最近話題のMTAですが、まだ良く知りません。取り敢えず現在サーバー用に導入するには時期尚早と考えました。

INTAA.NETで採用したのはqmailです。
これはqmailが人気があるからというのもありますが、qmailは極めて安全で速くてシンプルで簡単というのが魅力でした。しかもバージョンアップしない。バージョンアップしないといってもバグが無いからその必要が無いという良い意味の方で、なんと1998年の6月から更新していません。(2000年7月現在)
しかし、qmailは簡単というのは確かにその通りなんだけど、ちょっと複雑なことをやりたいと思うとすぐに行き詰まってしまいそうなので複雑なネットワークに導入するのはかなり難しそうです。取り敢えずqmailの公式Webを見ると非常に多くのサポートユーティリティ等が掲載されているので何か必要になったら見に行くと良いでしょう。

さて、qmailではマニュアル通りにインストールを行った段階ではメールを受信できるのはqmailをインストールしたマシンだけとなっています。これはspam防止の為にこのように標準状態ではSMTP転送をしない仕様になっています。例えば同じドメインの別のホストへのメールも送信できるようにするには control/rcpthostsにそのホスト名を登録する必要があります。小規模な社内サーバ等の場合はこれだけでもう設定は終わりといえます。
ドメイン外等、管理外のネットワークにもメールを送信できるようにするにはtcpserverを導入します。これについては割愛します。

問題はSMTP転送を受け付けたい場合です。
SMTP転送とは、例えば、或るプロバイダに接続しているユーザーが自分の勤務先の会社のメールサーバからメールを送信するようなことです。厳密にいうとメールサーバであるホスト以外からのSMTP接続によるメール送信受付は全てSMTP転送ですが、この記事ではドメイン外からのSMTP接続によるメール送信受付のSMTP転送について述べます。
なお、転送メールアドレスとは全然違う話なのでご注意ください。
無料メールサーバなどでSMTP接続を受け付けていることろは全てドメイン外からのSMTP転送の設定を行っています。
ドメイン外であろうともメール送信者のIPアドレスが固定であるならば上のファイルcontrol/rcpthostにそのIPアドレスを記述するだけです。
しかし、不特定のサイトのユーザー相手の場合はそのIPアドレスを特定できないのでcontrol/rcpthostに予め登録しておくという方法は採れません。だからといって、無制限に全てのIPアドレスからのSMTP転送を受け付ける設定にするとSPAMメールの発信台として利用される危険があります(qmailでは control/rcphhostを削除してしまうなどの方法がありますが、絶対にこの方法は行ってはなりません)。
これを避けるには転送を受け付ける前にその相手を認証する必要があります。
現在SMTP転送の為の認証方法としては2種類の方法が有名です。

  • SMTP-AUTH
  • POP before SMTP

SMTP AUTHは其の名の通り、SMTPサーバがSMTP接続を受ける際にログイン名とパスワードにより認証します。最近RFC2554として正式に公開されましたがまだこの方式に対応していないメールアプリケーションが結構あるので導入に踏み切るのは躊躇します。sendmailやeximはSMTP-AUTHに対応済みですが、qmailやpostfixは本体では非対応です。qmailではSMTP-AUTHに対応させるパッチが公開されていますがそれについては少し後で触れます。

POP before SMTPはSMTPサーバでは認証を行いません。利用者は先にPOP3(POP2)サーバにアクセスし(POP before SMTPという名称なのでここではPOPサーバを挙げていますが実はユーザー認証できるサーバなら何でもいいのです。だからWebサーバでもtelnetサーバでも別に構わないのです。ただ、利用者の利便性を考えるとPOP3またはIMAP4が適当だと思われます)、通常通り認証を受けます。認証が通った段階でメールサーバ内ではその利用者のIPアドレスを一定時間のみ登録されるデータベースに載せます。
次に利用者がSMTPサーバにアクセスし、メール送信を試みます。上のデータベースにその利用者のIPアドレスが登録されていればそのメールの転送を行います。
データベースは例えば15分や30分程度の短時間で登録されたIPアドレスを削除します。
この方法では例えばあるプロバイダγの会員AがサイトεのPOPサーバのメールを読み出して回線切断する、直後にプロバイダγの会員Bが接続したところ事情により同じIPアドレスが与えられ、しかも何故かそのユーザーBがサイトεのSMTPサーバに接続して極悪なSPAMメールを発信する、というような事態も原理的にはあり得ます。 しかし、通常このようなことは起こり得ません。(保証は出来ませんが)よって、POP before SMTPもその仕組み自体がSMTP認証方法として十分有効といえます。
POP before SMTPの良いところは利用者側のメールアプリケーションを選ばないということです。ただし、利用者はメールを送信する際は必ず先にPOPサーバにアクセス(メールの読み出し)する必要があるので少しだけ面倒です。
(最近はメール送信時にPOPサーバに自動的にアクセスしてくれるPOP before SMTP対応メールアプリケーションもあります)

qmailでSMTP-AUTH

2002年1月追記 : 試していませんが、http://www.emaillab.org/djb/qmail-vida/index.htmlにqmail-vidaというのが出ています。
qmail用SMTP-AUTHの本命かもしれません。正常に動くようでしたらお知らせ下さい。
(他人まかせでゴメンなさい)

http://members.elysium.pl/brush/qmail-smtpd-auth にqmailをSMTP-AUTHに対応させる為のパッチがあります。

ただ、結論から言いますと、これおかしいです。(Ver.0.23とVer.0.24)
これをマニュアル通りに導入してみたところ、正しいアカウントとパスワードで無ければ認証は通らないのでなるほどSMTP認証は機能しているようです。
ところが、SMTP認証を無視して(SMTP-AUTH非対応のメールアプリケーションで)メールを送信するとそのまま受け付けてしまうのです。これでは何の為の認証機能なのか解かりません。
これについて正しく機能させる方法を知っている方は教えてください。

2000年11月に山村さんからメールをいただきました。

qmail-smtp-authについて、Ver.0.23とVer.0.24ではおかしい旨の記載が
ありますが、現在の最新版(Ver.0.26)でもまったく同様でした。
(checkpasswordがからむセキュリティホールを埋めた程度のものと認識
しています。)
が、いろいろいじっていて、tcpserverと組み合わせるとうまく動作する
ことを確認しました。

個人的にPOP before SMTPはスマートでないと考えていますので、
qmail-smtp-authでなんとかならないかといろいろやってみたわけです。
(http://members.elysium.pl/brush/qmail-smtpd-authだけでは何も解決
せずです。)

1.rc.localなどで以下のように起動します。

    tcpserver -x /etc/tcp.smtp.cdb ......../bin/checkpassword /bin/true
/bin/cmd5checkpw
    /bin/true

......の部分はqmail-smtpdを記述します。

注:通常、.....の部分はユーザー「qmaild」で起動するのが普通(qmailの開発
動機などを考えると普通...ですよね。)ですが、これだと、checkpasswordが
うまく動作しません。
イレギュラーは承知でrootで起動するとうまく/etc/passwdのアカウントで認証
できます。(ちょっと怖いです。)
このへんはqmail-smtp-authの作者は認識しているようで、みょうな言い回しで
暗にroot(でなきゃ別の方法)で起動しろと書いているようにみえます。
(私だけでしょうか。)

2./etc/tcp.smtpを作成し、
        127.:allow,RELAYCLIENT=""
        :allow

    tcp.smtp.cdbを作成します。
    tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

現在私がテストしている環境は少し特殊ですので、多少はしょっていますが
こんなとこです。
これで、単純に「127.0.0.1」以外のクライアントからsmtpを使用してメールを
送ろうとしても
「rcpthostに記述のないメールはリレーしないよ」のエラーがでます。
Outlook(Ver.5)を使用して認証を通すと何の問題もなく送ることができました。
(ネスケ4.75も確認済み)
つまり、SMTP認証を無視して(SMTP-AUTH非対応のメールアプリケーションで)
メールを送信するとそのまま受け付けてしまうということがないわけです。

要はtcprulesの使い方が肝になるわけですが、私自身はこの解決方法が正しい
のかどうかはよくわかりません。なぜなら、認証エラーが出るならいいのですが、
リレーしないよエラーは、単にqmail-smtpdがtcpserverの環境変数を元に出して
いるエラーであって、SMTP-AUTHでエラーが発生しているわけではないからです。
これをどうとるか他のサーバ管理者の方々に聞いてみたいものです。

まだ、使い込んでいないので、まだどこかに問題を抱えている可能性は否定
できませんが、本来の目的は達していると思われます。

いかがでしょうか。

どうもありがとうございます。qmaildをroot権限で動作させなければならないという問題点はあるにしても、SMTP-AUTHが使えるようになっただけで大前進です。
qmail-smtp-authもパージョンが上がるにつれてマニュアルも整備されてきているようですね。

同じく山村さんから12月にメールをいただきました。

以前お送り致しましたメールに一部動作不良となる記述がありました。
私の環境が特殊であることが原因なのですが、具体的にはSMTPのtcpserverを
利用したアクセス権について誤解を招く記述となっていました。

「tcp.smtp」の記述について

通常qmailではtcpserverを使用する場合、smtpアクセス(発信)を許可する
クライアントに対して

	XXX.XXX.XXX.XXX:allow,RELAYCLIENT=""

と記述しますが、qmail-smtp-authを使用してアクセスするクライアントに対
しては
	XXX.XXX.XXX.XXX:allow

と記述する必要があります。(「RELAYCLIENT=""」を付加すると無意味です。)
これは、XXX.XXX.XXX.XXXからのアクセスに対してまずtcpserverが受け入れる
必要があるためですが、通常ではこの記述ではqmailはメールをリレーしません。
動作を見ている限りではqmail-smtp-authをパスすると「/var/qmail/conf/rcpthost」
と「RELAYCLIENT=""」を無視してリレーを受け入れるようです。

qmail-smtp-authでのauthを通ったクライアントのみリレーするようにするため
には最低この記述が必要です。

誤解を招く記述について、深くお詫び致します。

現在、qmail-smtpdを「root」で動作をさせなくてすむ方法を模索中ですが、
あちらをたてればこちらが立たずで....
ただ、checkpasswordのかわりに「cmd5checkpw-0.22」を使用して動作させると
なんとかなるのですが、passwdとは別にパスワードファイルを作成する必要があり、
良い解決方法には至っておりません。

また新しい方法がありましたらご報告させていただきます。

ありがとうございます。がとなんてちょっと上手くいかないと放り出してしまうのですが、いろいろ試行錯誤してレポート頂き感謝しています。

qmailでPOP before SMTP

qmailをPOP before SMTPに対応させるツールは色々あるようです。
ここではqmail自体を改造(パッチ)する必要のないツールを紹介します。

Bruce Guenter (bruceg@em.ca)作
http://em.ca/~bruceg/relay-ctrl/ SMTP Relaying Control for qmail & tcpserver

このツールはSMTP転送の制御ツールなので、POP3サーバだけでなくIMAP4サーバ等も改造無しで利用できます。
特にVer.2.0では添付マニュアルにqmail-pop3とcourier-imap4での設定例が記されているので導入が極めて簡単です。
(個人的にIMAP4がcourierというところが特に気に入っています)

導入

pop3サーバとしてはqmailに付属のqmail-pop3dを使用します。imap4サーバとしては上のようにcourier-imap4を使用します。どちらか一方または両方同時に利用できます。
アクセス受け付け制御用にtcpserverまたはtcp-envが必ず必要です。
(tcpserverがお勧めです)
上の4点のインストール方法についてはマニュアルに詳しくかかれているので割愛します。

なお、courier-imapを利用する場合ですが、標準で用意されている起動停止スクリプト/usr/lib/courier-imap/libexec/imapd.rc (デフォルト)ではcouriertcpdでimapdを起動させるようになっていますが、このrelay-ctrlはtcpserverかtcp-envで起動させる必要があるので修正が必要です。

${exec_prefix}/libexec/couriertcpd -address=$ADDRESS \
-stderrlogger=${exec_prefix}/libexec/logger \
-maxprocs=$MAXDAEMONS -maxperip=$MAXPERIP \
-pid=$PIDFILE $TCPDOPTS \
$PORT ${exec_prefix}/sbin/imaplogin $LIBAUTHMODULES \
${exec_prefix}/bin/imapd Maildir &"

と、なっている部分をコメントにするかカットして

/usr/local/bin/tcpserver -v メールサーバのアドレス imap \
${exec_prefix}/sbin/imaplogin $LIBAUTHMODULES \
${exec_prefix}/bin/imapd Maildir &"

の様にします。これはあくまでもシンプルなオプションの例です。tcpserverのオプションについては必要に応じて適切に設定して下さい。

WindowsのOutlook Expressを利用する際の注意

IMAP4サーバに接続する為にアカウント情報の設定を行う必要がある訳ですが、メールサーバのホスト名ではなくIPアドレスを指定します。(hostsファイルにメールサーバを登録している場合はホスト名で構いません)
私はここにメールサーバのホスト名を入力した為に正常に動作しなくて半日潰してしまいました。(下行のページで情報を得ましたありがとうございます)

http://www.asahi-net.or.jp/~GP4N-ISD/courier-imap.html