2009. 9. 29. 16:33

스팸메일 필터 Bogofilter 설치

보고필터를 설치하기 위해서는 BDB (Berkeley DB) 를 우선 설치해야 합니다.
BDB 는 다음 사이트에서 설치파일을 다운로드 받을 수 있습니다.

http://www.sleepycat.com

보고필터에서 다국어를 지원하므로 이를 위해 libiconv 를 설치해야합니다.
참고사이틑 다음과 같습니다.

http://www.gnu.org/software/libiconv/

보고필터 관련 사이트는 다음과 같습니다.

http://bogofilter.sourceforge.net/


[BDB 설치]

tar xvzf db-4.4.20.tar.gz
cd db-4.4.20/build_unix
../dist/configure --prefix=/usr/local/BDB
make
make install


[LIBICONV 설치]

tar xvzf libiconv-1.9.2.tar.gz
cd libiconv-1.9.2
./configure --prefix=/usr/local/LIBICONV
make
make install


[BOGOFILTER 설치]

tar xvzf tar xvzf bogofilter-1.0.3.tar.gz
cd bogofilter-1.0.3
./configure --prefix=/usr/local/BOGOFILTER --with-libdb-prefix=/usr/local/BDB --with-libiconv-prefix=/usr/local/LIBICONV
make
make install

사용을 위해선 우선 스팸 메일들을 .Spam에 몰아두고, 스팸이 아닌 메일을 .Ham폴더에 몰아둔 뒤 아래와 같은 명령어를 이용해서 학습을 시켜야 합니다.

cd .Spam
for x in *;do bogofilter -S < $x ; done
cd ..
 
cd .Ham
for x in *;do bogofilter -N < $x; done

-S옵션은 이 메일이 스팸 메일이라는 것을 의미하고, -N은 이 메일이 스팸이 아니라는 것을 의미합니다.

만약 A라는 스팸 메일을 햄이라고 잘못 학습시킨 경우 아래와 같은 명령을 이용해서 결과를 바로 잡을 수 있습니다. (A는 메일 파일 이름)

bogofilter -Ns < A ; done

거꾸로 A라는 햄 메일을 스팸이라고 잘못 학습 시켰다면 아래와 같은 명령어를 이용해야합니다.

bogofilter -Sn < A ; done

제 메일함에 쌓여있던 이메일(햄: 약300통, 스팸: 약1,000통)을 기준으로 스팸/햄 확률을 업데이트한 뒤 3일째 테스트 중입니다. 3일동안 온 30개의 메일 중에 스팸 26통을 정확하게 걸러주었네요.

아래는 나중에 시스템에 적용시켰을 때 사용자들이 Spam 폴더를 지우지 않더라도 알아서 정리해주기 위해 사용하게 될 스크립트 초안입니다~

#!/bin/sh
 
for x in `cat /etc/passwd|awk -F: '{ print $6 }'`;do 
 
	if [ ${x:0:6} == "/home/" ]; then 
		if [ -d "$x/.maildir/.Spam" ]; then
			// this will be replaced to tmpwatch 
			echo $x;
		fi
	fi
done

제가 참고한 bsdforum 의 방준영 님의 글은 아래 링크에서 볼 수 있습니다 ;)
http://bsdforum.or.kr/viewtopic.php?t=33

그리고 bogofilter 없는 상태에서 스팸을 걸러낸 결과는 아래와 같습니다.

# 전체 받은 메일 수
unfix aqua # cat /var/log/procmail|grep ^[\\[F]|wc -l
5077

# Spf 에 걸린 메일
unfix aqua # cat /var/log/procmail|grep ^\\[Spf|wc -l
2482

# Broken Multipart
unfix aqua # cat /var/log/procmail|grep ^\\[Fake|wc -l
1499

# Bad-mailer
unfix aqua # cat /var/log/procmail|grep ^\\[BadMailer|wc -l
315

# Spam-word 를 포함한 경우
unfix aqua # cat /var/log/procmail|grep ^\\[Spam|wc -l
141

# Bad-library
unfix aqua # cat /var/log/procmail|grep ^\\[BadLibrary|wc -l
21

# 내용, 제목이 모두 없는 메일
unfix aqua # cat /var/log/procmail|grep ^\\[EmptyMail|wc -l
0

# 바이러스 메일
unfix aqua # cat /var/log/procmail|grep ^\\[Virus|wc -l
2

6일부터 12일까지의 5077 개의 메일 중에 Spf 에 2482 개, Fake/NoHTML + Fake/NoPlain 에 걸린게 1499 개, BadMailer 에 315개, SpamWord 에 141 개, BadLibrary 에 21개, Virus 가 2개 되겠습니다.

결과적으로 4460/5077 개로 87.8% 가 스팸으로 판정되었습니다.

그리고 bogoutil 을 통해 확인해본 결과 나름 인코딩 관련된 처리를 알아서 처리하고 있는 듯 싶길래 BadMailer, SpamWord, BadLibrary 에서 처리하던 부분을 bogofilter 로 대체시킬까 싶어서 관련된 rule 은 주석처리를 해 놓았습니다. 


출처 : http://blog.naver.com/lakeoffire


Trackback 0 Comment 0