bogofilter

요 근래 늘어가는 스팸에 이마에 주름이 하나 둘 늘어가고 있던 찰나에 bsdforum 을 구경갔다가 방준영 님이 쓰신 bogofilter 관련 글을 보게 되었습니다. 사용법을 보니 자동으로 스팸 훈련을 시키는 것이 아닌 듯 싶어 왠지 모르게 호감이 가더군요. :)

http://bogofilter.sourceforge.net/

참고로 bogofilter는 베이시안 룰 기반의 스팸 필터입니다.

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

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

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

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

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

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

제가 참고한 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 은 주석처리를 해 놓았습니다.