OpenBlocks200+ssdlinux+Postfix+bsfilter

関連サイト:http://bsfilter.org/
       :http://www.ruby-lang.org/ja/


あ〜やっぱり、家みたいな小規模のサーバにもスパムがじゃんじゃんやってくるようになったorz
qmailでお世話になっているbsfilterにまたおせわになろっと。

bsfilterはRubyで動いているので、まずRubyをインストール

###ソースをダウンロード###
wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.4.tar.gz

###展開###
tar zxfv ruby-1.8.4.tar.gz

###移動###
cd ruby-1.8.4

###Makefile設定###
./configure

###コンパイル###
make

###インストール###
make install

###bsfilterを用意###

###ダウンロード###
wget http://prdownloads.sourceforge.jp/bsfilter/20232/bsfilter-1.0.14.tgz

###展開###
tar zxfv bsfilter-1.0.14.tgz

###ディレクトリ作成###
mkdir /usr/local/bsfilter

###コピー###
cp bsfilter-1.0.14/bsfilter/bsfilter /usr/local/bsfilter/

###確認###
cd /usr/local/bsfilter
./bsfilter --revision
bsfilter release 1.0.14 revision 1.79

###bsfilterのインストール完了###

###スパムの学習###
#まずspamメールの集合体をダウンロードし基本となるDBを構築しておく###
#これでウイルス入りのメールは大体はじいてくれます###

###スパムをダウンロード###
mkdir spambox
cd spambox
wget ftp://daemon.jp.freebsd.org/pub/FreeBSD-jp/mail-archives/ports-jp/ports-jp-17201-17300.tar.gz
wget ftp://daemon.jp.freebsd.org/pub/FreeBSD-jp/mail-archives/ports-jp/ports-jp-17301-17400.tar.gz
wget ftp://daemon.jp.freebsd.org/pub/FreeBSD-jp/mail-archives/ports-jp/ports-jp-17401-17500.tar.gz


###展開###
tar zxfv ports-jp-17201-17300.tar.gz
tar zxfv ports-jp-17301-17400.tar.gz
tar zxfv ports-jp-17401-17500.tar.gz
rm ports*
cd ..

###spamメール学習###
./bsfilter --add-spam spambox/*

###これだけでは不十分で、通常のメール(cleanメール)を学習させないと誤判定が続発します###
mkdir cleanbox
#ここにcleanメールを放り込む、特にメルマガやDMメールはスパムメールに近いので学習させておく#
./bsfilter --add-clean cleanbox/*

###確率データベースを更新###
./bsfilter --update

###メールを判定させてみる###
/usr/local/bsfilter/bsfilter --homedir /usr/local/bsfilter/.bsfilter/ --mbox /var/spool/mail/yoshiwo

combined probability /var/spool/mail/yoshiwo 1 0.500000
combined probability /var/spool/mail/yoshiwo 2 1.000000
combined probability /var/spool/mail/yoshiwo 3 0.500000
combined probability /var/spool/mail/yoshiwo 4 0.506931
combined probability /var/spool/mail/yoshiwo 5 0.499927
combined probability /var/spool/mail/yoshiwo 6 1.000000
combined probability /var/spool/mail/yoshiwo 7 0.500000
combined probability /var/spool/mail/yoshiwo 8 0.500000
combined probability /var/spool/mail/yoshiwo 9 0.507112
combined probability /var/spool/mail/yoshiwo 10 0.500000


##さて、この一番右がスパムの確立で0〜1までで、1に近づけば近づくほどスパム確立が高いと言う意味。
##実際にメールを開いて、大体あっているか確認。
##日本語メールは文字化けするのでnkfで変換出力する
nkf /var/spool/mail/yoshiwo | more

1 0.500000 -> Cronの動作報告 -> cleanメール
2 1.000000 -> 英語のスパム -> spamメール
3 0.500000 -> 楽天市場ニュース(HTML) -> cleanメール
4 0.506931 -> 日本語のスパム -> spamメール
5 0.499927 -> 【ITpro Data 今週のピックアップ情報】 -> cleanメール
6 1.000000 -> 英語のスパム -> spamメール
7 0.500000 -> マイTSUTAYAメール -> cleanメール
8 0.500000 -> 【日経BP】先進ユーザー企業が自ら語る★IP電話の導入/構築/効果が全てわかる1日 -> cleanメール
9 0.507112 -> 日本語のスパム -> spamメール
10 0.500000 -> 【BB Games Tribune】 -> cleanメール

##4番目と9番目に日本語のエロサイト誘導スパムのスパム確立が低いが
##日本語のエロサイト誘導スパムはなかなか既存 のDBでは判定できないものが
##ちょくちょくあるので、その都度spamメールとして追加しなければならない。

##一番問題なcleanメールをspamメールと誤判定することはなさそうなので、これで先に進めます。

##postfixにはコンテンツフィルタを挟むと言う仕組みがバージョン2.1以降から搭載されており
##Postfixのぺーじに和訳が公開されている(FILTER README)

##このサンプルをbsfilterに置き換えてみる。

##【exitステータスを利用して、スパムを破棄】
#!/bin/sh

# Simple shell-based filter. It is meant to be invoked as follows:
# /path/to/script -f sender recipients...

# Localize these.
INSPECT_DIR=/usr/local/bsfilter
SENDMAIL="/usr/sbin/sendmail -i"

# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69

# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15

# Start processing.
cd $INSPECT_DIR || {
echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }

cat >in.$$ || {
echo Cannot save mail to file; exit $EX_TEMPFAIL; }

# Specify your content filter here.
./bsfilter --homedir /usr/local/bsfilter/.bsfilter/ <in.$$

if [ $? -eq 0 ] ; then
 echo "spam mail"
 exit $?
else
 echo "clean mail"
 $SENDMAIL "$@" <in.$$
 exit $?
fi


##このスクリプトを実行させるユーザを作成
useradd filter

##作業用ディレクトリを作成
mkdir /var/spool/filter
chown filter:wheel /var/spool/filter


##フィルターの権限を変更
chown -R filter:wheel /usr/local/bsfilter

##master.cfにフィルターを通るよう設定
vi /etc/postfix/master.cf

# =============================================================
# service type private unpriv chroot wakeup maxproc command
# (yes) (yes) (yes) (never) (100)
# =============================================================
filter unix - n n - 10 pipe
 flags=Rq user=filter argv=/usr/local/bsfilter/script -f ${sender} -- ${recipient}


##設定反映
postfix reload

##しかしこれでは、前述したように誤判定したcleanメールをも捨ててしまいます。
##当分はヘッダにスパム判定結果を書くにとどめて、DBを熟成させましょう。

##さっきのスクリプトのバックアップ
cp -p script script-reject

##色々フラグ設定
vi .bsfilter/bsfilter.conf
spam-cutoff 0.90
insert-probability
insert-revision
insert-flag
mark-spam-subject


##【パイプモードを利用して、ヘッダやSubjectにフラグ挿入】
#!/bin/sh

# Simple shell-based filter. It is meant to be invoked as follows:
# /path/to/script -f sender recipients...

# Localize these.
INSPECT_DIR=/usr/local/bsfilter
SENDMAIL="/usr/sbin/sendmail -i"

# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69

# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15

# Start processing.
cd $INSPECT_DIR || {
echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }

cat >in.$$ || {
echo Cannot save mail to file; exit $EX_TEMPFAIL; }

# Specify your content filter here.

#$SENDMAIL "$@" <in.$$
./bsfilter --pipe --homedir /usr/local/bsfilter/.bsfilter/ <in.$$ | $SENDMAIL "$@"

exit $?




上へ
 トップページへ