関連サイト: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
"$@"