2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

日本語Spamはやっぱbsfilter!

bsfilter  は bogofilter と同じベイジアン(bayesian)方式によるSpamフィルターである。メールの内容を調査して、spamらしいからしくないかを単語ベース判別する。さらに、まともなメールやspamメールを bsfilter に食わせて学習 させることで判別効率を上げる。また、bsfilterは日本語に完全対応している。bogofilterは、kakasiなどを使って日本語対応しているが、bsfilterでは独自に日本語Spam対応している。ここでの説明は、 Postfix+procmail の環境を前提にして説明する。

インストール環境 )
OS : CentOS4.4
マシン : Dell サーバPowerEdge 420
メールサーバモジュール : Postfix+Procmail+Amavis+Clamv+Postgrey

1.インストールの準備

bsfilterはrubyで出来ているので、rubyを入れねばなるまいに。

[root@ns ~]# yum install ruby
Loading “fastestmirror” plugin
Setting up Install Process
Setting up repositories
dag 100% |=========================| 1.1 kB 00:00
update 100% |=========================| 951 B 00:00
base 100% |=========================| 1.1 kB 00:00
addons 100% |=========================| 951 B 00:00
extras 100% |=========================| 1.1 kB 00:00
Loading mirror speeds from cached hostfile
Reading repository metadata in from local files
Parsing package install arguments
Resolving Dependencies
–> Populating transaction set with selected packages. Please wait.
—> Downloading header for ruby to pack into transaction set.
ruby-1.8.1-7.EL4.6.i386.r 100% |=========================| 29 kB 00:00
—> Package ruby.i386 0:1.8.1-7.EL4.6 set to be updated
–> Running transaction check
–> Processing Dependency: libruby.so.1.8 for package: ruby
–> Processing Dependency: ruby-libs = 1.8.1-7.EL4.6 for package: ruby
–> Restarting Dependency Resolution with new changes.
–> Populating transaction set with selected packages. Please wait.
—> Downloading header for ruby-libs to pack into transaction set.
ruby-libs-1.8.1-7.EL4.6.i 100% |=========================| 75 kB 00:00
—> Package ruby-libs.i386 0:1.8.1-7.EL4.6 set to be updated
–> Running transaction check

Dependencies Resolved

=================================
Package Arch Version Repository Size
=================================
Installing:
ruby i386 1.8.1-7.EL4.6 base 155 k
Installing for dependencies:
ruby-libs i386 1.8.1-7.EL4.6 base 1.5 M

Transaction Summary
=================================
Install 2 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 1.6 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): ruby-libs-1.8.1-7. 100% |=========================| 1.5 MB 00:01
(2/2): ruby-1.8.1-7.EL4.6 100% |=========================| 155 kB 00:00
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: ruby-libs ######################### [1/2]
Installing: ruby ######################### [2/2]

Installed: ruby.i386 0:1.8.1-7.EL4.6
Dependency Installed: ruby-libs.i386 0:1.8.1-7.EL4.6
Complete!

■ rubyがバイナリパッケージに無い場合
ここ からダウンロードすると良い。
2006年9月22日現在、ruby-1.8.5.tar.gxが最新だった。
root@hiro:/usr/local/src# tar zxvf ruby-1.8.5.tar.gz
root@hiro:/usr/local/src# chown -R root.root ruby-1.8.5
root@hiro:/usr/local/src# cd ruby-1.8.5
root@hiro:/usr/local/src/ruby-1.8.5# ./configure
root@hiro:/usr/local/src/ruby-1.8.5# make
root@hiro:/usr/local/src/ruby-1.8.5# make install
root@hiro:/usr/local/src/ruby-1.8.5# ruby -v
ruby 1.8.5 (2006-08-25) [i686-linux]


2.インストール
bsfilter本体をおっこどしてくる場所は、 ここ だよ。
[root@ns ~]# cd /usr/local/src/
[root@ns src]# wget http://qgpop.dl.sourceforge.jp/bsfilter/20232/bsfilter-1.0.14.tgz

–10:22:44– http://qgpop.dl.sourceforge.jp/bsfilter/20232/bsfilter-1.0.14.tgz
=> `bsfilter-1.0.14.tgz’
Resolving qgpop.dl.sourceforge.jp… 133.69.133.232
Connecting to qgpop.dl.sourceforge.jp|133.69.133.232|:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 1,142,155 (1.1M) [application/x-tar]

100%[====================================>] 1,142,155 1.91M/s

10:22:44 (1.91 MB/s) – `bsfilter-1.0.14.tgz’ saved [1142155/1142155]

[root@ns src]# tar zxvf bsfilter-1.0.14.tgz
bsfilter-1.0.14
bsfilter-1.0.14/bsfilter
bsfilter-1.0.14/COPYING
bsfilter-1.0.14/htdocs
bsfilter-1.0.14/mda
bsfilter-1.0.14/mua
bsfilter-1.0.14/test
bsfilter-1.0.14/test/testcases
bsfilter-1.0.14/test/test.rb
bsfilter-1.0.14/test/testcases/ascii_plain
bsfilter-1.0.14/test/testcases/cr
bsfilter-1.0.14/test/testcases/crlf
bsfilter-1.0.14/test/testcases/euc_plain_iso_2022_jp
bsfilter-1.0.14/test/testcases/folding
bsfilter-1.0.14/test/testcases/gb18030_base64_gb2312
bsfilter-1.0.14/test/testcases/header
bsfilter-1.0.14/test/testcases/html
bsfilter-1.0.14/test/testcases/iso_2022_jp_plain
bsfilter-1.0.14/test/testcases/iso_8895_1_plain
bsfilter-1.0.14/test/testcases/lf
bsfilter-1.0.14/test/testcases/mbox
bsfilter-1.0.14/test/testcases/mime_b_iso_2022_jp
bsfilter-1.0.14/test/testcases/mime_b_iso_2202_jp
bsfilter-1.0.14/test/testcases/mime_b_shift_jis
bsfilter-1.0.14/test/testcases/mime_b_shift_jis_bad
bsfilter-1.0.14/test/testcases/sjis_base64_iso_2022_jp
bsfilter-1.0.14/test/testcases/sjis_base64_iso_2202_jp
bsfilter-1.0.14/test/testcases/sjis_plain_iso_2022_jp
bsfilter-1.0.14/test/testcases/utf8_base64
bsfilter-1.0.14/test/testcases/utf8_plain
bsfilter-1.0.14/mua/mew3
bsfilter-1.0.14/mua/mew4
bsfilter-1.0.14/mua/mew4/emacs.el
bsfilter-1.0.14/mua/mew4/mew.el
bsfilter-1.0.14/mua/mew3/bs_clean
bsfilter-1.0.14/mua/mew3/bs_mark
bsfilter-1.0.14/mua/mew3/bs_spam
bsfilter-1.0.14/mua/mew3/mew.el
bsfilter-1.0.14/mda/maildrop
bsfilter-1.0.14/mda/procmail
bsfilter-1.0.14/mda/procmail/procmailrc.black_gray
bsfilter-1.0.14/mda/procmail/procmailrc.header
bsfilter-1.0.14/mda/procmail/procmailrc.status
bsfilter-1.0.14/mda/maildrop/mailfilter.header
bsfilter-1.0.14/htdocs/bsfilter.css
bsfilter-1.0.14/htdocs/bsfilter.obj
bsfilter-1.0.14/htdocs/imap.png
bsfilter-1.0.14/htdocs/index-e.html
bsfilter-1.0.14/htdocs/index.html
bsfilter-1.0.14/htdocs/judge.png
bsfilter-1.0.14/htdocs/mew.html
bsfilter-1.0.14/htdocs/pop-with-bsfilter.png
bsfilter-1.0.14/htdocs/pop-without-bsfilter.png
bsfilter-1.0.14/htdocs/pop.png
bsfilter-1.0.14/htdocs/pops-with-bsfilter.png
bsfilter-1.0.14/htdocs/pops-without-bsfilter.png
bsfilter-1.0.14/htdocs/prepare.png
bsfilter-1.0.14/bsfilter/bsfilter.exe
bsfilter-1.0.14/bsfilter/bsfilter
bsfilter-1.0.14/bsfilter/bsfilter.exr
bsfilter-1.0.14/bsfilter/bsfilterw.exe

[root@ns src]# chown -R root.root bsfilter-1.0.14
[root@ns src]# cd bsfilter-1.0.14

解凍したら、bsfilter本体をコピーするだけで終わり。いたって簡単。
[root@ns bsfilter-1.0.14]# cp bsfilter/bsfilter /usr/sbin/
[root@ns bsfilter-1.0.14]# chmod 755 /usr/sbin/bsfilter


3.実際にテストしてみる
■ spamを食わせて認識するかテストしてみる
まずは、一般userでloginしてSpamを食わせる(mbox形式のファイルを食わせているとろ)。メーラーで例えばBeckyなどは、mbox形式のメールをエクスポート出来るので便利だ。
[root@ns ~]$ /usr/sbin/bsfilter –mbox -s spam/spam7
これで勝手に、.bsfilterというフォルダが作成され、その中にDBが作られる。
これとは逆に、受けても良いメール。
[root@ns ~]# /usr/sbin/bsfilter –mbox -c <受けても良いメールファイル>

データベースを更新する。
注:これをしないと、上の-sと-cコマンドを発行してもデータベースにコミットされないので気を付けること!
[root@ns ~]$ /usr/sbin/bsfilter -u

手っ取り早くspamを食わせる(データベースの更新もいっきにやる)。
[root@ns ~]$ /usr/sbin/bsfilter –mbox -s –update spam/spam7

spamではないのにspamだと誤判断された場合の対処。
[root@ns ~]$ bsfilter –sub-spam –add-clean –update spam/nonspam1
もしくは、
[root@ns ~]$ bsfilter -S -c -u spam/nonspam1

nonspamと誤判定されたが、実はspamだった場合の対処。
[root@ns ~]$ bsfilter -C -s -u spam/spam8

Spamを認識するかの確認(Spamとして認識してる結果)。
[root@ns ~]$ cat spam/spam7 | /usr/sbin/bsfilter –pipe –insert-flag –insert-probability | less
省略
X-UIDL: 1%l”!U*,#!C<b!!27$#!
X-Spam-Flag: Yes
X-Spam-Probability: 1.000000

gUCDbINng2mDk4KxgsaBeYNsg2KDZ4Npg5ODcIxmjqaUwoF6gqpQQ4FFg4KDb4NDg
4uRzomegUWRU42RlMWCxYtBgsGCxJeIgtyCtYK9ISENClBDg4qDaoOFgVuDQYOLgs
2DUoNgg4mCyYLIguiC3IK3IGh0dHA6Ly9ibHVlLWxhcmtzcHVyLmNvbS9uL2JvYXJkLz
c2DQoNCoFAgrGCzIOBgVuDi4LNid+LjoLJjGaOppTCgsmMZo3agrOC6oK9lfuBaTIwM
DOUToFgMjAwNpRONoyOMzCT+oFqgsyDZoFbg16DeIFbg1iC8IyzgskNCoOGgVuDV
YFbl2yC1o6pk66UepBNgrOCuYLEkriCooLEgqiC6ILcgreBQg0KDQqBQInfi46CyYxmjd
qCs4Lqgr2MZo6mlMKCzJPgl2WBaTIwMDaUTjaMjjMwk/qIyJFPgWqCzYOKg2qDhYFb
g0GDi5J2grWC3IK1gr2CzILFDQqQvYLJkFyCtZbzgrKCtIKigtyCuYLxgqqN7Y+cgrOC6o
LEgqiC6ILcgreBQg0KjcSTeIxmjdqCs4LqgumV+4LNIGh0dHA6Ly9ibHVlLWxhcmtzcHV
yLmNvbS9uL2JvYXJkLzc2IIKpgueKyJJQgsmMZo3agUWMn431j2+XiILcgreBQg0KDQ
qBoYNsg2KDZ4Npg5ODcIxmjqaUwoLGgs2BSIGhDQqBRZJqj5eLpILJjlGJwZazl7+Cz
INBg1+Di4NnQkJTgsWCtw0K
省略

■ bsfilterの結構使いそうなオプションパラメータ
–add-clean
もしくは、 -c
cleanなメール中の単語をデータベースに追加する。
–add-spam
もしくは、 -s
spam中の単語をデータベースに追加する。

–sub-clean
もしくは、 -C
cleanなメール中の単語をデータベースから削除する。

–sub-spam
もしくは、 -S
spam中の単語をデータベースから削除する。

–update
もしくは、 -u
単語ごとのclean/spam確率が入っているデータベースを更新する。-c、-s等と同時に使われた場合は、
メール中の単語についてのみ、確率データベースを更新する。


4.procmailで運用する
■ procmailrcのレシピ
[root@ns ~]# vi /etc/postfix/procmailrc
DEFAULT=/var/spool/mail/$LOGNAME
SPAM=$HOME/.spam
NONSPAM=$HOME/.nonspam
LOGFILE=/var/log/procmail.log

:0 fw
| /usr/sbin/bsfilter –auto-update –pipe –insert-flag –insert-probability

:0
* ^X-Spam-Flag: Yes
/dev/null

省略

–insert-flagをつけると、
「 X-Spam-Flag: Yes 」が出力されて、
–insert-probabilityをつけると、
「 X-Spam-Probability: 1.000000 」が出力される。
このレシピでは、 /dev/null でSpamを抹殺しているが、/spam . みたいにspamフォルダへスパムを格納して、
しばらくチューニングをした方が良いと思う。
なぜなら、大量にsample spamを食わせた後とかは、spamではなくまともなメール誤認識する可能性があるからだ。

■ procmail.logの中身
Spamが餌食になると、俺の場合は単純に削除しているから、procmail.logに以下のlogが残る。
以下の例はSpamを受信して抹殺されたlogである。
[mity@ns ~]# tail /var/log/procmail.log
省略
From m@e-linux.net Fri Sep 22 13:36:36 2006
Subject: =?SHIFT-JIS?B?keWVz4KokdKCvYK5grWC3IK1gr0=?=
Folder: /dev/null

■ procmail.logのlogrotate
まずは、procmailの実行権限を確認してみる。
root@hiro:~# ls -l `which procmail`
-rwsr-sr-x 1 root mail 66240 2002-06-06 03:11 /usr/bin/procmail

しかし、procmailのlogへの書き込みはrootばかりではなくusersグループも書き込むことがある。
したがって、パーミッションとオーナー&グループは以下のようにする。
root@hiro:~# ls -l /var/log/procmail.log

-rw-rw—- 1 root users 835 2006-09-23 08:16 /var/log/procmail.log

したがって、logrotateは以下のようにcreateの指定を行う。
root@hiro:~# vi /etc/logrotate.d/procmail
/var/log/procmail.log {
rotate 6
size=100k
missingok
daily
create 0660 root users
}


5.その他

 ここ からおっきなサンプルSpamを落として食わせると良いかも知れない。

■ .bsfilterの中身
ファイルの先頭に、”C”と有るのは、英語Spamだ。また、ファイルの先頭に”ja”は日本語Spamだ。

[mity@ns ~]$ cd .bsfilter/
[mity@ns .bsfilter]$ ls -al

total 33956
drwx—— 2 mity users 4096 Sep 22 17:13 .
drwx—— 6 mity users 4096 Sep 22 10:51 ..
-rw——- 1 mity users 0 Sep 22 10:51 C.clean.sdbm.dir
-rw——- 1 mity users 1024 Sep 22 10:51 C.clean.sdbm.pag
-rw——- 1 mity users 4096 Sep 22 17:12 C.prob.sdbm.dir
-rw-r–r– 1 mity users 0 Sep 22 17:13 C.prob.sdbm.lock
-rw——- 1 mity users 33398784 Sep 22 17:12 C.prob.sdbm.pag
-rw——- 1 mity users 4096 Sep 22 17:03 C.spam.sdbm.dir
-rw——- 1 mity users 33329152 Sep 22 17:04 C.spam.sdbm.pag
-rw——- 1 mity users 4096 Sep 22 12:30 ja.clean.sdbm.dir
-rw——- 1 mity users 4096 Sep 22 12:30 ja.clean.sdbm.pag
-rw——- 1 mity users 4096 Sep 22 17:13 ja.prob.sdbm.dir
-rw-r–r– 1 mity users 0 Sep 22 17:13 ja.prob.sdbm.lock
-rw——- 1 mity users 129024 Sep 22 17:13 ja.prob.sdbm.pag
-rw——- 1 mity users 4096 Sep 22 15:44 ja.spam.sdbm.dir
-rw——- 1 mity users 80896 Sep 22 15:44 ja.spam.sdbm.pag

以上

コメント