![]() |
★追記
2005/01/09 でスクリプトなど全面的に修正しています。そちらも参照してください。
メールフィルタリング はじめに |
---|
スパムメール(spam)が兎に角たくさん来る。1時間に1通以上は必ず来る。バイアグラがどうの、出会いがどうの、WindowsXPが安いとか、「RE:先日はありがとうございました」だの…英語、日本語問わず…。あんたなんか知らんつーの。
基本方針 |
---|
自宅にメールサーバ立ち上げているんで以下の方針でメールフィルタリングすることにした。
1. メールサーバには【qmail】を使用する。
2. スパムメール判別には【spamassassin】を使用する。
3. スパムメールは【procmail】を使って専用のディレクトリに保存。
4. 保存したスパムメールの送信者(From)、件名(Subject)など最小限の情報を念のため通知。
5. 誤ってスパム判定してしまったメールも簡単に復活できるようにする。
(メールサーバとなったマシンにログインして Linux コマンドをたたく必要もない)
6. スパムメールは一定期間保存後自動的に削除する。
こうすることによりスパムメール自体をクライアントであるPC(たとえばWindows2000)まで持ってくることなくフィルタリングされるわけだ。OUTLOOK EXPRESS なり BECKY! なりのメールボックスにまでスパムメールが届くことなく、精神衛生上非常によろしいということで…。また、万一必要なメールをフィルタリングしてしまった場合にもメールサーバにログインすることなくメール転送するだけで復活させることができるようにする。
【qmail】【spamassassin】【procmail】 |
---|
○ 以下 qmail 以外のMTAはとりあえず対象としてません。インストールされる方は以下を参考にインストールしてください。
http://miyazaki.ddo.jp/linuxserver/qmail.html
○ spamassassin というソフトを使ってスパムの判定を行う。設定ファイルに記述されたルールに従ってメールひとつひとつにポイントをつけるソフトである。そのポイントが一定値以上になるとヘッダに「スパムである」ことを示す以下の烙印が押されるのである。
X-Spam-Flag: YES
X-Spam-Checker-Version: SpamAssassin 3.0.2 (2004-11-16) on yourmachine
スパムでないと判定されたメールはもちろんNOになっているので、お手軽なやり方だとメールクライアント(MUA)の振り分け機能でゴミ箱行きにすればよい。私の場合はメールクライアントまで転送される事自体が腹立たしいのでメールサーバでフィルタリングすることにした。そのためのソフトが後述のProcmailである。
spamassassinはもともと日本語は考慮されてないので日本語メールのスパム判別は正確に行うことができない。そこで日本向けにカスタマイズされた設定ファイル(ルール)をインターネット上で探し出したので利用させてもらっている。
★Tokyo Linux Entertainment Community
http://tlec.linux.or.jp/
★同サイトの設定ファイル
http://tlec.linux.or.jp/docs/user_prefs
ソフトのインストールは私の場合 CPAN で行った。こんな感じ。
# perl -MCPAN -e shell
cpan shell -- CPAN exploration and modules installation (v1.61)
ReadLine support available (try 'install Bundle::CPAN')
cpan> install Mail::SpamAssassin
○ procmail はメールの振り分けをサーバ上で行うソフトだが、Redhat Linux 7.1 の場合でも最初から入っているようなので最近のディストリビュージョンでもおそらく入っているでしょう。
Linux user, qmail ユーザ、ディレクトリ設定 |
---|
この例では仮に Linux user = ichiro とする。
なのでディレクトリ構成は
/home/ichiro/
/home/ichiro/.spamassassin/ <-- 作ってください(ユーザ毎設定ファイル保存用)
/home/ichiro/Maildir/new/
/home/ichiro/Maildir/cur/
/home/ichiro/Maildir/tmp/
/home/ichiro/Maildir/spam/ <-- 作ってください(スパムメール保存用)
/home/ichiro/Maildir/log/ <-- 作ってください(procmail ログ保存用)
/home/ichiro/Maildir/log/procmail.log <-- touch で作成してください
/home/ichiro/Maildir/script/ <-- 作ってください(誤判定メール復活スクリプト保存用)
/home/ichiro/Maildir/script/getspam <-- シェルスクリプト。あとで説明します。
qmailユーザとしては
ichiro
ichiro-spam (スパム通知用。必須ではない)
ichiro-getspam(スパム誤判定復活用。これも必須ではない)
起動ファイル、設定ファイル |
---|
★ spamassassin デーモン(spamd)起動ファイル作成&デーモン起動
CPAN でインストールした場合以下の位置にあるスクリプトを /etc/init.d/ にコピー
cp /root/.cpan/build/Mail-SpamAssassin-3.0.2/spamd/redhat-rc-script.sh /etc/init.d/spamd
ちょっと修正(赤字部分)して
#!/bin/sh
#
# spamassassin This script starts and stops the spamd daemon
#
# chkconfig: 345 80 30
# processname: spamd
# description: spamd is a daemon process which uses SpamAssassin to check \
# email messages for SPAM. It is normally called by spamc \
# from a MDA.
自動起動するように登録
# chkconfig --add /etc/init.d/spamd
念のため起動しておく
# /etc/init.d/spamd start
★ spamassassin 設定ファイル (マシン全体の共通設定ファイル)
先ほど紹介の日本語対応 user_prefs ファイルをリネームしてここにコピーする
/etc/mail/spamassassin/local.cf
★ spamassassin 設定ファイル (ユーザごと)
ユーザ単位での設定ファイル $HOME/.spamassassin ディレクトリを作成しておくと自動的に作成される。
$HOME/.spamassassin/user_prefs
以下のようにホワイトリストを設定しておくとこれに該当するメールは SPAM ポイントが大幅にマイナスされます。-> スパムではないという方に重み付けする。自分に来るはずのメールアドレスをスパムと誤認識されないためにどんどん登録しましょう。
whitelist_from *@d-fax.ne.jp
whitelist_from *@info.shinseibank.com
whitelist_from *@shinseibank.com
whitelist_from *@spa.nifty.com
whitelist_from *@amazon.co.jp
whitelist_from *@rbbtoday.com
★ .qmail ファイルを編集( $HOME/.qmail )
| /usr/bin/procmail
★ procmail 設定ファイル( $HOME/.procmailrc )
PATH=/bin:/usr/bin:/usr/local/bin MAILDIR=$HOME/Maildir/ LOGFILE=$HOME/Maildir/log/log VERBOSE=off DEFAULT=$MAILDIR # # :0 # :0 E # # # :0 } # :0 # :0 |
★ $HOME/Maildir/script/getspam
#!/bin/sh
cd ${HOME}/Maildir/spam
SPAMMSG=`grep "$1" * | sed 's/:.*//' | tail -1`
if [ -z $SPAMMSG ]
then
exit 0;
else
tstamp=`date +%Y%m%d.%H%M%S`.$$
newmessage=$tstamp
cp $SPAMMSG ../new/$newmessage
fi
★ $HOME/.qmail-getspam
&ichiro
★ $HOME/.qmail-spam
./Maildir/
ログローテーション、古くなったスパムメールの自動削除 |
---|
私の場合以下のファイルにログローテーション設定を記述
★/etc/logrotate.d/mylog
/home/ichiro/Maildir/log/log {
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
★古いSPAMメール自動削除
/var/spool/cron/ichiro を編集、もしくは該当ユーザで crontab -e
10 04 * * * find $HOME/Maildir/spam -mtime +14 -exec rm -f '{}' \;
この例だと2週間(14日)経ったスパムメールが自動削除される。
+14 部分を変更すれば経過日付変更可能。
最後に |
---|
今のところこの設定でほとんどのSPAMメールが遮断されている。万一、必要なメールがSPAMと誤判定されて保存されても該当MESSAGE-IDの記載されたメールを ichiro-getspam@yourdomain.com 宛にメール転送すれば、自動的に復活するので便利。いちいちサーバ上でチェックしなくてよい。
sed & awk デスクトップリファレンス
シェル&Perl入門―bash/tcsh/grep/se...UNIX & Information Science
詳説 正規表現 第2版