SMTP認証とstarpit | 雲の上はいつも青空

雲の上はいつも青空

不思議な経歴をもつエンジニア!?の徒然なブログです。
お仕事関係の話が多いと思いますが、コメントとかもらえると中の人はとても喜びます(^O^)/

それでは前回のSPAMとの戦いで予告したSMTP認証+starpitについて書いてみます。

starpitとは25番ポートにコネクションが成立するときに接続元の逆引き情報をもって、応答遅延をかける方法です。 つまり、smtpでのやり取りを始める前に動作してしまうので、実はこのままだとsmtp認証を行うには問題があります。

具体的には、smtp認証を使うクライアントは自宅やホテル、出先のモバイル端末から接続してくることが多いので、その接続元の逆引き情報はまさしくtarpittingに引っかかるアドレスになることが多いです。
しかも、smtp認証というのはしっかりsmtpのプロトコルでのやり取りとなるので、S25Rのフィルターに引っかかるとsmtp認証のプロトコルが始まる前に応答保留が掛かってしまいます。

実際の動作としては、smtp認証は応答保留なしで実行され、smtp認証を行わずにメールを送信しようとする相手にはS25Rのフィルターをかけ、必要なら応答保留を行うという動作が望まれます。

ということで、smtpでのやり取りを行う前に応答保留を行うというstarpitの理念とはちょっと外れてしまいますが、heloコマンドを送り、mailコマンドを受け付ける時点でS25Rフィルターをかけるようにmain.cfを変更します。

smtpd_sender_restrictions = 
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_invalid_hostname,
check_client_access regexp:/etc/postfix/white_list.txt,
check_client_access regexp:/etc/postfix/white_list,
check_client_access regexp:/etc/postfix/warn_client,
check_client_access regexp:/etc/postfix/tarpit_client,
permit

一件、通常のstarpitと同じように見えますが、違うところは…
smtpd_sender_restrictions
の部分です。

通常のstarpitの場合には、ここが
smtpd_client_restrictions
となり、この場合はsmtpでのやり取りが始まる前に、この部分の評価式が実行されます。

順番的には、以下のように評価されます。

smtpd_client_restrictions     コネクション成立時
smtpd_helo_restrictions helo: ehlo:
smtpd_sender_restrictions mail from:
smtpd_recipient_restrictions rcpt to:

つまり、smtpd_recipient_restrictionsの評価をするときにはsmtp認証は既に終わっているはず… というのが、smtp認証+starpitの肝の部分です。

2009/05/10
starpitの発案者である『佐藤』さんからコメントを頂きました。
応答保留を掛けたメールの詳細をログに残す為に、smtpd_recipient_restrictionsで制限をかけるのがお勧めとのこと… 確かに、mail fromとrcpt toの両方の情報がログに残ります。
私のようなブログにコメントをいただき、本当にありがとうございました。