今まで主にブラックリストでSPAM対策をしていた訳ですが、いろいろ試行錯誤してもフィルタ率が80%くらいでした。
届く宛先の傾向を見ると、やはり過去にWebにメアドを載せていたのが原因ですね。ここのサイトも10年以上公開しているので歴史の重みの一つですね。
で、結構悩んだんですが、S25R(Selective SMTP Rejection)という仕組みを導入してみることにしました。詳しくは以下のサイトを見てください(始めのページに要点も書いてあります)。
http://www.gabacho-net.jp/anti-spam/
結果から言うと、ほぼ100%SPAMを駆逐出来てます。かなりすごいですね。ただし、誤フィルタの危険性も捨てきれないので、しばらく監視が必要です。
とりあえず設定方法については上記アドレスの「阻止率99%のスパム対策方式の研究報告」ってところに、postfix向けの設定サンプルが書かれているのでそれで行けますが、ちょっと注意点などを以下に記載してみたいと思います。
まず、main.cfの設定ですが、元々ブラックリストによる制限をしてますが、S25Rも同じようなところに定義してます。ですので、ブラックリストとS25Rを両立する設定が必要な訳ですが、私は以下のような感じに設定しました。
Contents
main.cfの設定サンプル(ブラックリストとS25Rの両立)
〜以下、抜粋です
「reject_rbl_client 云々」がブラックリストの設定。「permit_mynetworks」以下が、S25Rのサイトにあったサンプルと同様の設定です。
smtpd_client_restrictions = reject_rbl_client all.rbl.jp, reject_rbl_client sbl.spamhaus.org, reject_rbl_client bl.spamcop.net, reject_rbl_client list.dsbl.org, permit_mynetworks, check_client_access regexp:〜云々〜, check_client_access regexp:〜云々〜, check_client_access regexp:〜云々〜
また、S25Rは誤フィルタを防ぐ為にホワイトリスト(許可リスト)を設定する必要があります。ホワイトリストも上記S25Rのサイトの「ホワイトリスト情報」ってところにあります。
で、この情報は頻繁に更新がなされるので、更新されたらメールで知らせてくれるようにcronに以下のソースを設定しています。
更新お知らせシェル
頻繁にチェックすると相手のサイトに迷惑なので、一日一回だけのチェックにしてます。ちなみに以下の設定だと、サーバのroot宛にメールを送るので、その辺は環境に応じて旨く設定してください。
なお、あくまでお知らせするだけで、更新はしてくれません。
#!/bin/csh wget --no-cache -q -O /etc/postfix/white-list.txt.check -T 10 http://www.gabacho-net.jp/anti-spam/white-list.txt if ( $status != 0 ) then echo 'wget error S25R white list' | mail -s "wget error S25R white list" root exit 1 endif setenv diff_count `diff /etc/postfix/white-list.txt /etc/postfix/white-list.txt.check | wc -l` if ( $diff_count == 0 ) then exit 0 endif echo 'S25R whitete list is changed' | mail -s "S25R whitete list is changed" root
とりあえず、これで更新したんですが、早速私自身が制限に引っかかりました(^^)ゞ
制限されたログ(/var/log/maillog)
一部「XXX」でマスクしてますが、まぁなんか文字が入っていると思ってください。
Jan 5 10:27:51 dws postfix/smtpd15946: NOQUEUE: reject: RCPT from XXXXXX.XXXX.XX.ftth2.ppp.infoweb.ne.jp[211.
2.XXX.XXX]: 450 <XXXXXX.XXXX.XX.ftth2.ppp.infoweb.ne.jp211.2.XXX.XXX>: Client host rejected: S25R check, be pa
tient; from=<私のメアド> to=<宛先のメアド> proto=ESMTP helo=<127.0.0.1>
なので、私自身をホワイトリストに登録しないとならないのですが、S25Rが提供しているホワイトリストに追加すると、今後のメンテナンスが大変です。ですので、以下の様に「add-white-list.txt」という追加のホワイトリストを設定しました。
main.cfの設定サンプル(追加ホワイトリスト)
〜以下、抜粋です
「reject_rbl_client 云々」がブラックリストの設定。「permit_mynetworks」以下が、S25Rのサイトにあったサンプルと同様の設定です。
smtpd_client_restrictions = reject_rbl_client all.rbl.jp, reject_rbl_client sbl.spamhaus.org, reject_rbl_client bl.spamcop.net, reject_rbl_client list.dsbl.org, permit_mynetworks, check_client_access regexp:/etc/postfix/white-list.txt, check_client_access regexp:/etc/postfix/add-white-list.txt, check_client_access regexp:/etc/postfix/rejections
「add-white-list.txt」というのが追加したホワイトリスト。さらにそのファイルを作成します。
# Nifty + Tepco /\.XXXX\.XX\.ftth2\.ppp\.infoweb\.ne\.jp$/ OK
指定している内容はログに記録されている値を使用してます。スラッシュ内に接続元の名称を書きますが、正規表現なので、ピリオドなどの前には「\」が必要です。最後の「$」は「〜で終わる」という意味。ホワイトリストには先頭に「^」がありますが、それはこれには付いていません。
私の場合、上記ログには「XXXXXX.XXXX.XX.ftth2.ppp.infoweb.ne.jp」と記録されていますが、初めの「XXXXXX」には明らかに毎回変化しそうな数字が入っているので、ここは指定していません。
最後にフィルタした情報をメールで送ってくれるシェルです。
フィルタされると、maillogにSMTPのコード「450」と「550」を返すので、それを抽出しさらにFrom/Toアドレスのみを切り取っています。
なお、ログの形式、OSの種類によっては正しく表示されないことがあるので、注意してください。
結果ログサンプル
#!/bin/csh # 一日前の情報に絞る setenv TZ JST+15 setenv LANG C # 念のため、前の一時ファイルを削除 rm -f /tmp/s25r_log* # 機能のログのみに絞り込んで、「/tmp/s25r_log.tmp」に一時保存 grep "^`date '+%b %e'`" /var/log/maillog* | grep 'reject:' | egrep '450|550' \ >> /tmp/s25r_log.tmp # メールの本文となる一時ファイル(/tmp/s25r_log2.tmp)に対象日付を追加。 echo "- check date -" >> /tmp/s25r_log2.tmp date '+%b %e' >> /tmp/s25r_log2.tmp # コード450、550のそれぞれ件数をメール本文に追加 echo '' >> /tmp/s25r_log2.tmp echo 'error450: '`grep ' 450 ' /tmp/s25r_log.tmp | wc -l` >> /tmp/s25r_log2.tmp echo 'error550: '`grep ' 550 ' /tmp/s25r_log.tmp | wc -l` >> /tmp/s25r_log2.tmp # 実はここで頻繁に届くが、サーバに存在しないアドレスをログから除外して、「/tmp/s25r_log3.tmp」に保存しています。 cat /tmp/s25r_log.tmp | grep -v 'メアド1' | grep -v 'メアド2' \ >> /tmp/s25r_log3.tmp # 宛先毎の件数(これはあくまで参考データ) echo '' >> /tmp/s25r_log2.tmp echo "- To List -" >> /tmp/s25r_log2.tmp cat /tmp/s25r_log3.tmp | sed -e "s/\(.*\)from=<\(.*\)> to=<\(.*\)> \(.*\)/to=\3/" | sort | uniq -c \ >> /tmp/s25r_log2.tmp # 送信元毎の件数(1つのメアドが複数カウントされている場合は誤フィルタの疑いがある) echo '' >> /tmp/s25r_log2.tmp echo "- From List -" >> /tmp/s25r_log2.tmp cat /tmp/s25r_log3.tmp | sed -e "s/\(.*\)from=<\(.*\)> to=<\(.*\)> \(.*\)/from=\2/" | sort | uniq -c \ >> /tmp/s25r_log2.tmp # 送信元/宛先の組み合わせ毎の件数(これも複数カウントされてたら注意かも) echo '' >> /tmp/s25r_log2.tmp echo "- Mail addrs -" >> /tmp/s25r_log2.tmp cat /tmp/s25r_log3.tmp | sed -e "s/\(.*\)from=<\(.*\)> to=<\(.*\)> \(.*\)/from=\2 to=\3/" | sort | uniq -c \ >> /tmp/s25r_log2.tmp # メール送信 cat /tmp/s25r_log2.tmp | mail -s "S25R check mail" root # 一時ファイル削除 rm -f /tmp/s25r_log* # 始めに変更したタイムゾーンを元に戻す。 setenv TZ JST-9
- こんにちは。開発者です。 – 浅見秀雄 (2008年03月22日 20時36分17秒)
- あ、Enter打ったら挨拶だけ投稿されちゃった。(^^;) S25Rのご利用ありがとうございます。もしかして、貴サイトがS25Rに引っかかりますか?でしたら、メールサーバ名と逆引き名お知らせください。公開ホワイトリストに掲載させていただきます。 – 浅見秀雄 (2008年03月22日 20時38分51秒)
- 連絡先:<webmaster@gabacho-net.jp> です。掲示板に書き込んでくださってもけっこうです。 – 浅見秀雄 (2008年03月22日 20時41分59秒)
- こんにちは(^^。引っかかりますが、今週中くらいにプロバイダが変わるので、それから考えますです。 – デルタ (2008年03月22日 21時01分08秒)

Leave a Reply