qmail,procmail,spamassassin でスパム(迷惑メール)削除

| トラックバック(1)



★追記
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

#
# spamassassin を実行する。
#
# 設定ファイル
# マシン共通: /etc/mail/spamassassin/local.cf
# ユーザー毎: $HOME/.spamassassin/user_prefs
#
:0fw
*!^X-Spam.*
| /usr/local/bin/spamc

#
# spamassassin 実行した結果以下フラグが YES の場合
# 指定したユーザにそのスパムメールのヘッダの一部を送信して
# 要/不要の判断材料を提供する
# と同時に spam 保存ディレクトリに保存する
# スパムと思われるものも誤判定を考慮して即削除はしない。
#
# 送信先アドレスは ichiro-spam とする。
#
# X-Spam-Flag: YES
#
:0:
* ^X-Spam-Flag: YES
{
    :0 hc
    | egrep -i '^From:|^Subject:|^To:|^Cc:|^X-Spam-Status:|^Message-ID:' | nkf -s | mail -s "spam mail arrived. (SPAMASSASSIN)" ichiro-spam

    :0
    spam/.
}

#
# ichiro-getspam 宛メール受信で
# SPAM 判定したメールを復活させる
# 取得するためのキーは Message-ID である。
# 該当の Message-ID のメールが存在しない場合は何もしない
#
:0:
* ^TO.*ichiro-getspam@yourdomain\.com
{
    :0 B
    * ^Message-Id: \/.*
    | /home/ichiro/Maildir/script/getspam "$MATCH"

    :0 E
    /dev/null
}

#
# SPAM Status がマイナス80~90代だったら
# 安全なメールと判断して通常の配信を行う。
#
:0:
* ^X-Spam-Status: No, score=-[89][0-9]\..+
new

#
# ヘッダ部に X-ML-Name を設定するメーリングリストも
# 安全なメールとして判断し通常の配信を行う。
# 例)linux-users や vine-users など
#
:0:
* ^X-ML-Name: (linux-users|vine-users)
new

#
# To: Cc: Subject: 等に自分のメールアドレス(一部でも)入ってない
# システムからのメールやエラー通知メールでない。
# distribute, fml, CMLD等を使ったメーリングリストからのメールでない
#
:0:
* !(^TO|^Subject:|Cc:)(.*)(yourmail@nifty\.com|ichiro|webmaster|root)
* !(^From)(.*)(linux\.or\.jp|nmda\.or\.jp|struts-user|rbbtoday\.com|deodeo\.co\.jp|nikkeibp\.co\.jp|dti\.ne\.jp|ascii24)
* !^FROM_DAEMON
* !^FROM_MAILER
* !(^X-Sequence|^X-ML-Name).+
{
    :0 hc
    | egrep -i '^From:|^Subject:|^To:|^Cc:|^X-Spam-Status:|^Message-ID:' | nkf -s | mail -s "spam mail arrived. (not include my e-mail address)" ichiro-spam

    :0
    spam/.

}

#
# DRUG, VIAGRA 関係のメール
#
# いや、本当は spamassassin の設定ファイルでちゃんとルール作成
# してください。以下の条件だと一発スパム判定ですから…(^^;
# とりあえずボクのところにはこういうメールがたくさん来るので…
#
:0 B:
* (valium|xanax|xalatan|xenical|viagla|medications|pain|soft tab|erection| meds|medicine|pharmacy|medical|drugstore| sex|muscle| relaxants|allergies|hiv|antidepressants|p[il1][l1][l1]s)
{
    :0 hc
    | egrep -i '^From:|^Subject:|^To:|^Cc:|^X-Spam-Status:|^Message-ID:' | nkf -s | mail -s "spam mail arrived. (DRUG)" ichiro-spam

    :0
    spam/.
}

#
# 海賊版ソフト関係のメール
#
# これも同様に本当は spamassassin の設定ファイルでちゃんとルール作成
# してください。以下の条件だと一発スパム判定ですから…(^^;
# とりあえずボクのところにはこういうメールがたくさん来るので…
#
:0 B:
* (micros0ft|m[!|1]crosoft|w1ndows|wind0ws|Wnd0w's|professi0nal|D[o0][l|/][l|/]ar|stock is limited|same day sh[i1l]pp[i1l]ng|pr!ce|\$[0-9]+ |Adobe (Photoshop|Pagemaker))
{
    :0 hc
    | egrep -i '^From:|^Subject:|^To:|^Cc:|^X-Spam-Status:|^Message-ID:' | nkf -s | mail -s "spam mail arrived. (SOFTWARE)" ichiro-spam

    :0
    spam/.
}

★ $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版

トラックバック(1)

前回、Spamassasinの導入までやりましたが、 それからだいぶほったらかし... 続きを読む

ウェブページ

  • about
Powered by Movable Type 5.2.10

このブログ記事について

このページは、よしが2005年1月 1日 02:06に書いたブログ記事です。

ひとつ前のブログ記事は「Acer AL1715GW」です。

次のブログ記事は「PCのケース交換」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。