SPAM対策

あまりにspamが多いのでspamassasinとbogofilterの二つを使用した対策をしてみました。 この設定はMH形式を前提としております。mbox形式とはprocmailの記述が違います。また、設定を施したホストマシンのOSはFreeBSD-5.5ですが、Linuxでも大きな違いは無いと思います。

使用するメールシステムはPOPを使わずSMTPにて直接ホストマシンにメールが送信されてくることを前提としています。 設定対象はホストマシンのみです。
何処かのメールサーバ  ←SMTP→ 組織内メールリレーサーバ  ←SMTPホストマシン
SPAMメールを検知する手順は、sendmailによって他のマシンからメールを受信した後、procmailにメールを渡します。(.forwardの設定) procmailではspamassasinにてSPAM判定を行ない、もしSPAMであるのならばMail/spamにメールを保存します。同様にbogofilterでもSPAM判定を行ない、もしSPAMであるのならばMail/SPAM2にメールを保存します。違うところに保存するのは万が一正しいメールもSPAM判定されてしまった場合どちらのソフトウェアで処理されたかを明確にするためです。

インストールするソフトウェア

  1. sendmail
  2. spamassassin
  3. bogofilter
  4. procmail
  5. 必要であればsylpheed

SpamAssasinのインストール (2009.3.31追加)

portsからインストールしますが、mecab関連をインストールする必要もあります。またUNICODEに対応させる為、インストール時に環境設定を行なう必要もあります。
setenv WITH_CHARSET utf-8
setenv ENCODING utf-8
portinstall /usr/ports/japanese/mecab
portinstall /usr/ports/japanese/mecab-ipadic
portinstall /usr/ports/japanese/p5-Text-MeCab
portinstall /usr/ports/japanese/p5-Mail-SpamAssassin
インストールしたあとは /usr/ports/japanesep5-Mail-SpamAssassin/pkg-messageの内容を良く読んで設定します。
SpamAssasinをデーモンモード動作させる為に/etc/rc.confに
spamd_enable="YES"
spamd_flags="-u spamd -H /var/spool/spamd"
を書き加えます。/usr/local/bin/spammassasinを使用すると
warn: spamassassin: killed by SIGPIPE
が発生しメールボックスが破壊されるので
/usr/local/bin/spamc
を使用します。
SPAM学習と正常メールは以下のコマンドを使って行ないます。
spamassassin --lint
sa-learn --spam スパムメールのフォルダ
sa-learn --ham 正常メールのフォルダ
実行例
>spamassassin --lint 

>sa-learn --spam Mail/spam
Learned tokens from 25453 message(s) (25524 message(s) examined)

>sa-learn --ham Mail/inbox
Learned tokens from 1153 message(s) (1186 message(s) examined)

.forwardの設定

"|IFS=' ' && exec /usr/local/bin/procmail  || exit 75  #ユーザ名"

.procmailrcの設定

SPAMASSASINでSPAMメールをMail/spam行きにして、さらにbogofilterでMail/SPAM2行きにする。通過してきたSPAMメールをsylpheedでbogofilterに学習させることが可能。
# Please check if all the paths in PATH are reachable, remove the ones that
# are not.

PATH=/usr/bin:/usr/sbin:/usr/ucb:/bin:/usr/local/bin
MAILDIR=$HOME/Mail      # You'd better make sure it exists
#DEFAULT=$MAILDIR/mbox
DEFAULT=/var/mail/ユーザ名
LOGFILE=$MAILDIR/from
#LOCKFILE=$HOME/.lockmail
LOCKEXT=.lockmail
SENDMAIL=/usr/sbin/sendmail
SENDMAILFLAGS=-oi

#まずはSPAMASSASSINに通す。
##(2009.3.31追加)
##/etc/rc.confにspamd_enable="YES"と
##spamd_flags="-u spamd -H /var/spool/spamd"を書き加える。
##/usr/local/bin/spamcを使用する。/usr/local/bin/spammassasinは
##warn: spamassassin: killed by SIGPIPEがでる。
:0fw
*!^X-Spam.*
        |/usr/local/bin/spamc
#"X-Spam-Status: Yes"があればspam行き
:0:
* ^X-Spam-Status: Yes
spam/.


:0 B:
* ^Found\ virus.*in\ file*
ERROR/.

:0 :
* ^To:.*FreeBSD-users-jp@jp.freebsd.org
FreeBSD-users-jp/.
:0 ci
|cd  FreeBSD-users-jp && rm -f dummy `ls -t|sed -e 1,100d`

:0 :
* ^Subject:.*FreeBSD-users-jp
FreeBSD-users-jp/.
:0 ci
|cd  FreeBSD-users-jp && rm -f dummy `ls -t|sed -e 1,100d`

:0 :
* ^From:.*Charlie.*Root
DAEMON/.
:0 ci
|cd DAEMON && rm -f dummy `ls -t|sed -e 1,100d`

:0 :
* ^From:.*root@localhost
DAEMON/.
:0 ci
|cd DAEMON && rm -f dummy `ls -t|sed -e 1,100d`

:0 :
* ^From:.*MAILER-DAEMON@.*
DAEMON/.
:0 ci
|cd DAEMON && rm -f dummy `ls -t|sed -e 1,100d`

#bogofilterでSPAMを検出する。
:0 fw : bogofilter.lock
| /usr/local/bin/bogofilter -uepl -c ~/.bogofilter/bogofilter.cf

#"X-Bogosity: Spam"があればSPAM2行き
:0
* ^X-Bogosity: Spam
SPAM2/.

:0 c:$HOME/.lockmail
* ^From.*@
! 携帯電話のメールアドレス

# Anything that has not been delivered by now will go to $DEFAULT
# using LOCKFILE=$DEFAULT$LOCKEXT
#procmail: Lock failure on "/var/mail/XXXX.lockmail対策(2009.3.31追加)
:0:$HOME/.lockmail
$DEFAULT

bogofilterの設定

特に無し。学習させると ~/.bogofilter/wordlist.dbができる。

spamassasinの設定

特に無し。

SPAMの学習

bogofilterを動作させるには正常なメールとSPAMメールの両方を学習させる必要があります。
正常なメールは以下のコマンドで学習させる。
bogofilter -nvI 正常なメールのファイル名
多量に学習させる場合にはシェルスクリプト等を用いると便利である。
#!/bin/csh
foreach file ( `ls | grep  '[0-9]+*'` )
bogofilter -nvI $file
end
SPAMメールを学習させる。
bogofilter -svI SPAMメールのファイル名
多量に学習させる場合にはシェルスクリプト等を用いると便利である。
#!/bin/csh
foreach file ( `ls | grep  '[0-9]+*'` )
bogofilter -svI $file
end

sylpheedとの連携

迷惑メールに関する設定を行なう。 設定→全般の設定にある迷惑メールのタグを選択する。
迷惑メール bogofilter -s -I
非迷惑メール bogofilter -n -I
判定コマンド bogofilter -I
迷惑メールフォルダ #mh/メール箱/SPAM2
”受信時に迷惑メールと判定されたメッセージを振り分ける。”チェックする。

メンテナンス

もし正しいメールがSPAMと判断されてしまった場合にはbogofilterに少し勉強してもらう必要がある。
bogofilter -SnvI SPAMメールと判断されてしまった正しいメールのファイル名

戻る


猫 yukiya@cs.t-kougei.ac.jp
Last modified: Thu Jan 19 14:23:34 JST 2007