Kozupon.com    
 
 日本語Spamはやっぱbsfilter!


bsfilterbogofilter と同じベイジアン(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
4uRzom
egUWRU42RlMWCxYtBgsGCxJeIgtyCtYK9ISENClBDg4qDaoOFgVuDQYOLgs
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

以上


 
 
 



Copyright 2007 Kozupon.com.