これはPostfix Advent Calendar 2014の18日目の記事です。こちらも大変遅くなってしまってすみません…
Postfixには2.8以降からpostscreenという機能があります。が、あまり知られていないと思います。
これはひとことで言うと、超軽量簡易スパムフィルタです。
Postfixにはsmtpd_*_restrictionsをはじめ、policydやfilterなど色々とスパムをフィルタするための仕組みが用意されています。
にもかかわらずpostscreenが用意された理由は、postscreenは超軽量のためフィルタをすることで負荷も下げることが出来るからでしょう。
やまやさんはPostfix Postscreen Howto - どさにっきで「トリアージ」と表現されているのですが、まさにそんな感じで、postscreenで怪しいメールだけをより詳しいチェックへと回してやり、大丈夫そうなメールは通常の処理で行う、という大まかなよりわけが行えるというものです。
PostfixはSMTPセッション毎に一つsmtpdのプロセスが立ち上がるため、例えばtarpittingでのフィルタを掛けると、スパムによりsmtpdの同時起動数が増えてしまい、メモリ消費量などが増えてしまうという問題がありました。(そのため、接続が切れたら即smtpdプロセスが死ぬようなパッチを書いたりしました)
これに対してpostscreenでは、smtpdの前段に位置して1プロセスで処理を行うため、大量のスパムからの接続があってもプロセスの爆発が起こらずにフィルタすることが出来るようになっています。
postscreenで使えるフィルタは下記Howtoページから確認することが出来ます。
2.8.2のころから使えるフィルタは増えていないので、日本語訳の情報がそのまま使えます。
公式のPostscreen Howto
Postfix-2.8.2のものですが、やまやさんによるPostscreen Howtoの日本語訳。
マニュアルにpostscreenではどんなフィルタが利用できるのかが書いてありますが、どんなものかざっとわかるように短くまとめてみました。
- Pregreet test
以前pregreet detectionでエントリーを書いたのですが、「220-server.example.com ESMTP Postfix」みたいに嘘のグリーティングメッセージを返して、答えを返しちゃったら負け、という手法。
- DNS White/blacklist test
複数の(DNSBL毎に重み付けした)DNSBLでマッチさせトータルが閾値以上になったかどうかを見る。
- Command pipelining test
SMTPにはpipeliningをアナウンスされていなければ一応答ごとに一コマンドしか受け付けないのだが、スパムはそれを無視して連続してコマンドを送ってくる場合が多いため、それで判断する。
- Non-SMTP command test
オープンプロキシを使って送ってくるbotだと、例えばHTTPで使われるCONNECTのようなSMTPには存在しないコマンドを使ってくることがあるため、そのようなコマンドで検知する。
- Bare newline test
SMTPでは行が「CR LF」で終了することになっているのだが、単に「LF」だけで送ってくるものを引っ掛ける。
こうやって見るとどれも結構トリッキーなもので引っ掛けているなと感じるのではないかと思いますが、結構な確度でbotが引っ掛けられるのではと思います。
ほとんど、昔やまやさんが書かれたものをまとめただけ、というエントリーになってしまいましたが、これでpostscreenの認知度が少しでもあがればいいなと思います。
(参考)
Postfix Postscreen Howto
Postfix manual - postscreen(8)
2010年11月17日(水) Postfix Postscreen Howto - どさにっき
2011年4月8日(金) Postfix Postscreen Howto - どさにっき
Postfix Postscreen Howto(Postfix 2.8.2 に同梱の POSTSCREEN_README の翻訳)