Tag Archives: 스팸

[TT/TC] 스팸 코멘트/트랙백 차단 플러그인 – SpamBlocker 0.9 beta

이번에 새롭게 개발한 스팸 블록커를 공개 합니다.

기본적으로 Geo-IP ExtensionSpamhaus 의 블랙 리스트를 사용합니다.
안타깝지만 Geo-IP 가 서버에 설치 되어있지 않으면 국가별 차단 기능을 사용할 수 없습니다.
더욱 아쉬운건 PHP5.x 이상에서만 작동합니다. PHP5 의 함수들을 좀 많이 썼습니다.-_-a

어디까지나 EAS가 학습을 하는데까지 생기는 공백을 매꿔주는 역할은 할 수 있을것이라 생각합니다.
EAS를 참고하였으며, EAS에 피해를 주지 않도록 최대한 생각하여 개발 하였습니다.
EAS + SpamBlocker를 혼합하여 테스트 해본결과 지금까지 스팸을 100% 막았습니다. 저도 생각했던것 이상의 수치더군요.

스팸이 앞으로 좀더 다양하게 변화되어 막기가 점점 더 힘들어 질 것이라 생각합니다.
그럼 그때마다 계속해서 기능을 보강하여 새버젼을 내놓을 수 있도록 하겠습니다.

사용자 삽입 이미지

눈에 보이지 않는 프로세스라 디버깅 하기 힘들더군요, 디버깅과 모니터링을 위해 Logging까지 하면서 테스트 하였습니다.-_-;

옵션은 다음과 같습니다.

국가별 차단
국가별 차단 기능을 사용할 것인지에 대한 설정입니다. 사용을 하게 되면 접속을 허용한 국가만 글/트랙백을 작성할 수 있게 됩니다. 사용안함을 선택하여 기능을 끌 수 있습니다.


  • 사용 : 국가별 차단 기능을 사용합니다.
  • 사용안함 : 국가별 차단 기능을 사용하지 않습니다.

접속 허용 국가코드
접속을 허용할 국가의 코드입니다. 2자리 코드이며, 쉼표(,)로 구분을 합니다. 다수의 국가를 설정할 수 있습니다. 사용하시는 블로그의 의사소통이 일어나는 모든 국가를 추가해 주시면 됩니다.
국가코드는 이곳 을 참고하시기 바랍니다.



  • : KR,JP,US

접속 허용 주소
무조건적으로 접속을 허용할 White List입니다. 교류를 하시는 모든 블로그 서비스를 등록해 주시면 됩니다. www는 붙이지 않습니다. 이하 모든 기능에 대해 최우선권을 갖게 됩니다. 쉼표(,)를 통해 구분합니다. 다수의 주소를 입력할 수 있습니다.



  • : blog.naver.com,egloos.com,blog.daum.net,tistory.com,blog.paran.com,blog.empas.com

트랙백 아이피 체크
트랙백을 받을때만 작동합니다. 트랙백의 URL과 실제로 보내는 서버의 IP를 비교하여 다를 경우 차단합니다. 규모가 큰 서비스형 블로그의 경우 대부분 블로그 서버와 트랙백 발송 서버가 다르기 때문에 원치 않는 차단이 있을 수 있습니다. 하지만 접속 허용 주소에 포함이 되어있으면 트랙백 아이피 체크를 하지 않습니다.



  • 사용 : 외부로 부터 들어오는 트랙백에 대하여 호스트 아이피 체크를 합니다.
  • 사용안함 : 외부로 부터 들어오는 트랙백에 대하여 아이피 체크를 하지 않습니다.

DNSBL 사용
Domain Name System Black List의 약자입니다. 원래는 스팸메일 시스템에서 사용되곤 하는 DNS쿼리를 이용한 블랙리스트 관리 시스템입니다. Spamhaus 의 디비를 이용하고 있습니다. 마찬가지로 접속 허용 주소가 더 우선시 됩니다. 스팸메일에 사용되는 기술이지만 도입한 이유는 다음과 같습니다.


최근에 발생하는 IP가 다른 전세계적인 동시 공격의 원리는 뉴스에서 접해 보셨을 좀비 PC에 의한 무차별 적인 공격입니다. 실제로는 대부분이 중국발 공격입니다. 하지만 이번에 모니터링을 해보니 공격 루트는 거의 전세계더군요-_-; 보통 이런 좀비 PC들은 서버를 공격하거나 스팸메일을 보내는데 이용됩니다. 그렇기 때문에 이런 좀비 PC의 아이피는 대부분이 Spamhaus에 등록이 되어있습니다. 이것을 통해 블록킹을 하는것을 생각하였습니다.


  • 사용 : 무조건 체크를 합니다. 실제로 스패머가 아닌 정상적인 사용자까지 차단 될 우려가 있습니다.
  • 홈페이지 입력시만 사용 : 스팸의 경우 자신의 홈페이지 경로 유입을 위해 홈페이지 url을 입력하게 됩니다. 이런 URL이 있는 경우에만 체크를 합니다.
  • 사용안함 : DNSBL 체크 기능을 사용하지 않습니다.


아직 다양한 환경에서 테스트 해보지 못하였습니다. 테터툴즈 1.1 및 텍스트 큐브 최신버젼에서 작동하는것은 확인하였습니다. 사용해 보시고 문제 있을시 말씀해 주시면 최대한 고칠 수 있도록 하겠습니다. 감사합니다.


1314684826.zip

한국에 맞는 스팸어쎄신 설정하여 스팸 95% 줄여보기

사용자 삽입 이미지개인적으로 운영하는 투명아이의 서버는 오랫동안 스팸메일과의 전쟁을 벌여오고 있었다.  용하다는 온갖 필터를 다 사용해 보았지만 특별히 효과를 본 것이 없었다.

그러던중 단순하면서도 매우 괜찮은 조합을 발견해 내었다. 그 조합을 가지고 3달을 테스트 해보고 6달에 걸쳐 스팸어쎄신의 베이시안 필터를 학습 시켰다.

결국 나의 노력을 하늘도 알아준 것일까? 거짓말같이 스팸이 줄기 시작했다. 투명아이 서버의 경우 하루평균 2000통 이상의 스팸메일이 도착하는데 현재 이 모든 필터들을 통과하는 스팸이 서버 내 통틀어 5개 이내로 줄었다.

이 5개도 스팸으로 분류되어 도착한다. 그 조합은 다음과 같다.

Sendmail MTA → 3 DNSBL → SPF-Milter → Clamav-Milter → SpamAssassin → Procmailrc


오늘은 스팸어쎄신에 대해서만 이야기를 해보자. 보통의 서버에서 스팸어쎄신을 별다른 옵션없이 디폴트로 설정해 놓고 베이시안 필터도 사용하지 않고 있을것이다. 그런 절반의 스팸어쎄신을 사용하며 만족하고 있었던적이 있었다.

확실히 스팸 어쎄신은 학습전과 학습 후의 작동 모습이 확연하게 차이나는 녀석이다. 다만 Perl기반이라 그런지 처리에 엄청난 무리가 온다. 확실히 베이시안 필터로서의 스팸어쎄신은 대규모 메일 서버에서는 사용하기 힘들듯 하다. Bogofilter등을 사용하는것을 추천해 본다.

우선 스팸어쎄신을 설치해보자. cpan을 이용하면 옵션 모듈까지 손쉽게 설치할 수 있다.

[code]# cpan

cpan> install Digest::SHA1 HTML::Parser DB_File Net::DNS Mail::SPF::Query IP::Country Mail::Audit::Razor Net::Ident IO::Socket::INET6 IO::Socket::SSL Time::HiRes DBI LWP::UserAgent HTTP::Date Archive::Tar IO::Zlib Encode::Detect Net::SSLeay Mail::DKIM Mail::DomainKeys Compress::Zlib
cpan> install Mail::SpamAssassin[/code]

위와 같은 방법만으로도 스팸어쎄신을 손쉽게 설치할 수 있다. 옵션 모듈중에 설치 안되는 것들에 대해서는 너무 목숨걸지 말자. 다음같은 모듈은 굳이 필요없다.

Encode::Detect, IO::Socket::INET6, IO::Socket::SSL, Net::SSLeay, Razor2

이제 스팸어쎄신의 로컬 설정을 한다. 디폴트로 /etc/mail/spamassassin/local.cf 파일이다.

[code]# This is the right place to customize your installation of SpamAssassin.
#
# See ‘perldoc Mail::SpamAssassin::Conf’ for details of what can be
# tweaked.
#
# Only a small subset of options are listed below
#
###########################################################################

#   Save spam messages as a message/rfc822 MIME attachment instead of
#   modifying the original message (0: off, 2: use text/plain instead)
#
report_safe 0

#   Set the threshold at which a message is considered spam (default: 5.0)
#
required_score 5.0

#   Use Bayesian classifier (default: 1)
#
use_bayes 1

#   Bayesian classifier auto-learning (default: 1)
#
bayes_auto_learn    1
bayes_path          /etc/mail/spamassassin/bayes/bayes
bayes_file_mode     0666

# Enable or disable network checks
skip_rbl_checks         0
use_razor2              0
use_dcc                 0
use_pyzor               0

# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
ok_languages            ko

# Mail using locales used in these country codes will not be marked
# as being possibly spam in a foreign language.
ok_locales              ko

# Add your own customised scores for some tests below.  The default scores are
# read from the installed spamassassin rules files, but you can override them
# here.  To see the list of tests and their default scores, go to
# http://spamassassin.apache.org/tests.html .
score SPF_PASS -2.0
score SPF_HELO_PASS -2.0
score SPF_NEUTRAL -1.0
score SPF_HELO_NEUTRAL -1.0

# For Daum Communications
score WEIRD_PORT 0.0

# For Korean Fonts
score HTML_FONT_FACE_BAD 0.0

# Whitelist important senders
whitelist_from          *@theeye.pe.kr[/code]


report_safe : 스팸으로 판단될 경우 원본글을 감출지 여부이다. 메일을 읽는 순간 당할수 있는 그 어떤 공격이 두렵다면 1로 해야 한다. 하지만 0으로 설정한다.


required_score : 몇점 이상을 스팸메일로 의심할것인지에 대한 설정이다. 이것은 서버관리자의 주관적인 부분이다. 그냥 5로 해도 무관하다고 본다.


use_bayes : 학습된 Bayesian Classifier를 사용할것인지에 대한 여부이다. 당연히 1로 한다.


bayes_auto_learn : 자동학습에 대한 설정이다. 정말로 확실한 스팸의 경우 분석하여 나누어진 토큰을 지속적으로 학습 시킨다. 물론 자동으로.


bayes_path : 학습된 토큰 파일을 저장할 위치이다. 기본적으로 사용자 별로 개별 저장되나 이런식으로 하여 중앙 관리가 가능하다. 저 값은 접두어다. 저 뒤로 _toks와 _seen이 붙는 파일 두개가 생긴다.


bayes_file_mode : 파일의 권한이다. 666정도면 되겠다.


skip_rbl_checks : RBL체크값을 점수에 활용한다. 나름 맹활약을 하게 된다.


use_razor2 : Vipul’s Razor라는 곳에서 운영하는 블랙리스트 공유 시스템을 활용할지 여부이다. 난 사용안했다. 설치할것이 별도로 존재한다.


use_dcc : Distributed Checksum Clearinghouse의 약자이다. 실제 홈페이지에서는 스팸을 줄이는데 특출난 효과가 있다고 설명하고 있다. 필요하다 판단되면 사용하자


use_pyzor : Razor2와 비슷한 역할을 하는것 같다. 자세한건 사용해 보지 않아서 모르겠다. 홈페이지는 여기


ok_languages : 중요하게 사용되는 언어를 설정해 주면 된다. 한국의 경우 ko를 적어주면 된다. 영어권과 메일을 주고 받을일이 많다면 en도 추가해 주자.


ok_locales : 위와 같은 역할을 한다.


score : 별도로 특정 룰에 대한 점수를 강제로 지정할 수 있다.


whitelist_from : 믿을 수 있는 메일주소를 지정해주자. 매우 중요한 거래처의 메일이나 같은 서버의 메일은 굳이 점수를 매길필요가 없다.


다음의 SPF설정은 SPF의 신뢰도를 믿고 점수를 -해주겠다는 뜻을 가지게 된다.
[code]score SPF_PASS -2.0
score SPF_HELO_PASS -2.0
score SPF_NEUTRAL -1.0
score SPF_HELO_NEUTRAL -1.0[/code]

다음의 한메일의 경우 메일을 보내는데 기본 포트가 아닌 특이한 포트를 사용하는것 같다. 다음메일이 무조건 스팸메일화 되는것을 막을려면 설정해 주자.
[code]score WEIRD_PORT 0.0[/code]

다음의 설정은 한글 폰트 설정때문에 스팸메일의 의심을 받게 되는것을 막기 위한 설정이다. 보통은 font-face가 영문으로 설정되기 마련이지만 국내의 메일 시스템은 “font-face:돋음”과 같이 한글로 표기하는 경우가 많다. 무시하도록 하자.
[code]score HTML_FONT_FACE_BAD 0.0[/code]

위와 같이 설정을 하였으면 procmailrc스크립트에 스팸어쎄신을 등록하자. 보통은 spamd로 데몬으로 띄우기 마련이지만 이렇게 하는 편이 더 간단하다. procmailrc스크립트의 제일 상단에 추가해 주자.

[code]# Pipe the mail through spamassassin (replace ‘spamassassin’ with ‘spamc’
# if you use the spamc/spamd combination)
#
# The condition line ensures that only messages smaller than 250 kB
# (250 * 1024 = 256000 bytes) are processed by SpamAssassin. Most spam
# isn’t bigger than a few k and working with big messages can bring
# SpamAssassin to its knees.
#
# The lock file ensures that only 1 spamassassin invocation happens
# at 1 time, to keep the load down.

:0fw: spamassassin.lock
* < 256000
| spamassassin

# Mails with a score of 15 or higher are almost certainly spam (with 0.05%
# false positives according to rules/STATISTICS.txt). Let’s put them in a
# different mbox. (This one is optional.)
:0:
* ^X-Spam-Level: \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
/var/spool/mail/spam[/code]

여기서 주목할 점은 X-Spam-Level 체크 구문인데 *한개가 1점을 뜻한다. 위의 경우 15개이므로 15점 이상이면 spam으로 포워딩 해버리겠다는 뜻을 가지게 된다. 주관적인 판단아래 조정하길 바란다.

여기서 *의 수는 이정도 점수면 스팸이 확실하다라는 확신이 서는 기준을 점수로 하면 되겠다.

그리고 스팸메일을 spam 파일에 1달정도 모으자. 그리고 학습을 시켜보도록 하자.

[code]# sa-learn –spam –mbox /var/spool/mail/spam
# sa-learn –ham –mbox /var/spool/mail/ham[/code]

위와 같은 방법으로 스팸메일을 모은 파일을 –spam옵션을 주고 분석하여 학습 시키면 된다. 반대로 스팸메일이 아닐경우에는 –ham으로 등록하면 된다. 정확히 스팸메일만 분류되어있다면 ham은 학습을 시키지 않아도 정확성이 높다.

위에서 설정한 대로라면 학습한 데이터는 /etc/mail/spamassassin/bayes/ 안에 존재하게 된다.

현재 내가 수집하여 만든 학습 데이터를 공개하겠다. 6개월에 걸쳐 스팸메일을 모았으며 15,000개의 스팸메일이 사용되었으며 8만개 이상의 단어가 누적 학습되었다.

1155977043.tgz


필요하다면 1주일마다 spam학습을 시키는 스크립트를 만들어 cron에 등록하여 작동시킬수도 있을것이다.
하지만 학습시마다 데이터를 백업하자. 학습이 과하면 미치기 시작한다. 일반 메일까지 분류하게 될지도 모른다.
적당한 시점을 찾아보자.