강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

​Spamassassin을 이용한 스팸메일 필터링 1부

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

Spamassassin을 이용한 스팸메일 필터링 1 

 

메일의 중요성이 날이 갈수록 커지면서 바이러스 메일과 함께 스팸(spam) 메일이 사회적으로 큰 이슈가 되고 있다.

 

하루가 다르게 쏟아져 들어오는 스팸 메일 때문에 스팸 메일을 골라서 삭제하기 위해 소요되는 시간 낭비뿐만 아니라 스팸 메일이 워낙 많다 보니 수많은 스팸 메일 속에 숨어 있는 정상적인 메일을 골라내기 위해 매일 전쟁을 치루는 입장이다.

 

이를 위해 최근의 일부 백신 소프트웨어에는 아예 스팸 차단 기능이 포함되었거나 별도의 전용 스팸 차단 솔루션들이 많이 판매되고 있는 실정이다.

상용이든 공개 버전이든 관계없이 스팸을 차단하는 방법은 크게 두 가지 방식으로 나눌 수 있다.

 

첫 번째는 각각의 유저 PC에 직접 프로그램을 설치하는 클라이언트 기반 방식으로서 아웃룩 등 메일 클라이언트 프로그램으로 메일을 수신하기 전에 먼저 스팸인지 여부를 처리하는 방법이다.

두 번째는 앞에서 살펴본 바이러스 차단과 마찬가지로 메일 서버 차원에서 스팸인지 여부를 처리하여 미리 정해진 룰에 따라 스팸으로 분류된 메일을 차단하거나 제목을 변경하여 전송하는 등의 방식이다.

바이러스 차단 방법과 마찬가지로 각각의 방법 모두 장단점이 있겠지만 여기에서는 메일 서버에 직접 설치하여 쉽게 사용할 수 있는 서버기반의 Anti-스팸 프로그램인 스팸어세신(Spamassassin)을 이용하여 스팸 메일을 줄일 수 있는 방법에 대해 알아보도록 하겠다.

 

실제로 필자가 운영하는 서버에서 이 프로그램을 운영하고 있는데, 설치 방법도 쉽고, 부하도 많이 유발하지 않으면서도 90% 이상의 정확도로 스팸을 구분하고 있어 모두가 만족스럽게 사용하고 있다.

 

 

 

3.6.1 스팸어세신이란?

 

어세신(assassin)의 사전적 의미가 자객, 암살자인 것처럼 스팸어세신이란 말 그대로 스팸 메일을 골라서 차단 또는 분류해주는 프로그램이라는 의미이며 실제로 여러 테스트 결과 90% 이상의 높은 차단률을 보이고 있어 어떠한 상용 솔루션에 뒤지지 않는 정확도와 다양한 기능을 제공하고 있다.

 

01279ae25ef9d844ae0866fb55254f26_1670565553_4025.png
 

[그림] 스팸어세신 로고

 

홈페이지 : http://www.spamassassin.org/

http://spamassassin.apache.org/

 

스팸어세신은 주로 perl로 개발되었는데, 라이센스 역시 사용상의 제약없이 누구나 자유롭게 사용할 수 있으며 마치 IDS처럼 rule 기반 하에 메일 헤더와 내용(body)을 분석하거나 실시간 차단리스트(internet-based realtime blacklists)를 참고하여 각각의 룰에 매칭될 경우 +- 점수를 매겨 총 점수가 기준점수를 초과하는지 여부에 따라 스팸인지 여부를 결정하게 된다.

 

스팸어세신을 실행하면 기본적으로 127.0.0.1783/tcp에서 리슨(LISTEN)하는 spamd라는 데몬이 항상 작동하고 있는데, 이 데몬은 spamc라는 경량의 C 기반의 클라이언트 프로그램과 통신하면서 스팸인지 여부를 계산하고 판별하는 역할을 한다.

 

여기에서 특히 spamc 프로그램은 sendmail과 같은 MTA가 많은 양의 메일에 대해 일일이 포크(fork)하지 않고 효율적으로 스팸인지 여부를 판별할 수 있도록 도와준다.

 

여기에서 잠깐 스팸어세신이 기존의 시스템에서 어떠한 방식으로 작동하는지 알아보자. 외부에서 내부의 메일 서버로 전송되는 메일은 sendmail과 같은 MTA25번 포트에서 리슨하고 있다가 수신한 후 procmail과 같은 MDA를 통해 해당하는 각 유저의 메일함에 저장하게 된다.

 

그러나 스팸어세신을 설치하게 되면 MDA(procmail)를 통해 각자의 메일함에 메일이 저장되기 전에 스팸어세신을 거쳐서 스팸인지 여부를 확인 후 스팸일 경우 제목등에 [SPAM] 이라는 말머리를 붙이게 되는 것이다.

물론 이 과정에서 메일함에 저장되기 전에 특정한 메일은 삭제하도록 설정할 수도 있을 것이다.

따라서 스팸어세신은 기본적으로 실제 메일 계정이 설정되어 있는 메일 서버에 설치되어야 한다.

 

 

 

01279ae25ef9d844ae0866fb55254f26_1670565575_4327.png
 

[그림] 스팸어세신의 작동방식

 

 

3.6.2 스팸어세신 설치 방법

 

스팸 어세신이 정상적으로 작동하려면 많은 perl 모듈들이 먼저 설치되어 있어야 한다.

 

 

[스팸어세신에 필요한 모듈]

 

스팸어세신이 제대로 작동하기 위해 필요한 기본적인 모듈과 옵션 사항으로 필요한 몇 가지 모듈이 있는데, 기본 모듈들은 perl이 설치되어 있다면 대부분 기본적으로 설치되어 있을 것이다.

만약 설치되어 있지 않다면 “perl -MCPAN -e shell” 실행 후 “install 모듈명을 실행하면 간단히 설치할 수 있다.

 

만약 잘 설치가 안 되면 http://search.cpan.org/에서 검색후 직접 소스를 다운로드받아 설치해도 된다.

 

이를테면 아래의 Digest::SHA1 모듈을 설치하고자 할 경우, 위 사이트에서 “Digest::SHA1”으로 검색 후 보이는 화면에서

Digest-SHA1-2.11 와 같이 버전이 보이는 링크를 클릭 후 download를 통해 압축된 소스를 다운로드 및 압축해제 후 perl Makefile.PL ; make; make install로 설치하면 된다.

 

설치과정에서 몇 가지를 묻게 되는데 모두 엔터만 입력하면 된다.

 

 

 

* 기본모듈

 

기본모듈은 스팸어세신이 제대로 설치되고 작동하기 위해서 반드시 필요한 것들이다.

모듈의 버전이 너무 낮으면 스팸어세신이 정상적으로 설치가 되지 않으므로 가급적 최신 버전을 설치하는 것이 좋다.

Digest::SHA1

베이시안 및 몇 가지 test에 대한 암호화 해쉬에 필요하다.

 

HTML::Parser

대부분의 메일은 html 기반의 메일이다.

자세한 설명은 “perldoc -q html”을 실행하면 볼 수 있으며 가급적 최신버전을 이용하도록 한다.

 

 

 

Net::DNS

RBL(Realtime BlackList)이나 MX를 체크할 때 사용되므로 반드시 설치하여야 하며 특히 최신 버전을 설치하지 않으면 오류가 발생한다.

 

 

LWP HTTP::Date

룰 자동 업데이트 프로그램인 sa-update를 실행 시 필요하다.

 

IO::Zlib Archive::Tar

sa-update를 통해 압축 해제 시 필요하다.

 

ExtUtils::MakeMaker

이 모듈은 기본적으로 포함되어 있을 것이다.

만약 이 모듈이 없으면 빌드 시 에러가 난다.

 

File::Spec

이 모듈은 기본적으로 포함되어 있을 것이다.

 

Pod::Usage

이 모듈은 기본적으로 포함되어 있을 것이다.

가급적 최신버전을 사용하는 것이 좋다.

 

Sys::Syslog

spamd는 이 모듈을 이용하여 스캔한 내용을 syslog를 통해 로그에 남긴다.

 

이 모듈은 기본적으로 설치되어 있는데, “perl -MSys::Syslog -e 1”을 실행할 때 에러가 나면 설치가 되어 있지 않은 것이고 아무런 메시지가 없으면 설치되어 있는 것이다.

아래는 이 모듈을 통해 /var/log/maillog에 남은 로그 부분인데, 첫 번째 예제는 먼저 sendmail을 통해 메일을 받은 후 127.0.0.1에서 783/tcp에 리슨하고 있던 spamd4531번 포트를 이용하여 접속 후 bill 계정에게 메일을 전송하였는데, 이 메일은 기준 스팸 수치 8.0을 초과하는 18.3이어서 스팸으로 분류된 것을 알 수 있다.

 

 

Jun 23 09:10:42 test1 sendmail[3665]: i5N0Ag103665: from=<coori49@msn.com>, size=2083, class=0, nrcpts=1, msgid=<200406230011.i5N0BVW26026@www10.tt.co.kr>, bodytype=8BITMIME, proto=ESMTP, daemon=Daemon0, relay=www.tt.co.kr [211.47.66.50]

Jun 23 09:10:42 test1 spamd[20270]: connection from localhost.localdomain [127.0.0.1] at port 4531

Jun 23 09:10:42 test1 spamd[3670]: info: setuid to bill succeeded

Jun 23 09:10:42 test1 spamd[3670]: processing message

<200406230011.i5N0BVW26026@www10.tt.co.kr> for bill:520.

Jun 23 09:10:43 test1 spamd[3670]: identified spam (18.3/8.0) for bill:520 in 1.0 seconds, 2343 bytes.

만약 스팸 기준치보다 낮은 마지막 줄의 경우 아래와 같이 보이게 된다.

 

 

 

Jun 23 09:29:38 test1 spamd[3702]: clean message (2.3/8.0) for bill:520 in 0.0 seconds, 1581 bytes.

 

Storable

spamd를 실행할 때 필요한 모듈이다.

아래와 같이 실행했을 때 버전 번호가 출력되면 정상적으로 설치된 것이다.

없으면 설치하도록 한다.

 

 

# perl -MStorable -e 'print "$Storable::VERSION\n"'

2.13

 

 

* 옵션모듈

 

옵션모듈이 설치되지 않았다고 해서 스팸어세신이 오작동하지는 않지만 다른 부가기능을 제공하고 있으므로 특별히 문제가 없다면 설치하는 것이 좋다.

 

DB_File

MIME::Base64

Mail::SPF

IP::Country::Fast

IO::Socket::INET6

Compress::Zlib

Time::HiRes

Mail::DKIM

Mail::DomainKeys

Encode::Detect

Razor2

 

만약 설정과정에서 특정 모듈이 설치되어 있지 않을 경우에는 다음과 같은 에러가 발생하게 된다.

 

이러한 경우 위의 사이트에서 해당 모듈을 다운로드받아 먼저 설치하여야 한다.

 

 

***************************************************************************

ERROR: the required Digest::SHA1 module is not installed. at lib/Mail/SpamAssassin/Util/DependencyInfo.pm line 293, <STDIN> line 1.

 

The Digest::SHA1 module is used as a cryptographic hash for some

tests and the Bayes subsystem. It is also used by Razor2.

***************************************************************************

 

REQUIRED module missing: Digest::SHA1

REQUIRED module out of date: HTML::Parser

REQUIRED module missing: Net::DNS

optional module missing: Mail::SPF

optional module missing: Mail::SPF::Query

optional module missing: IP::Country

optional module missing: Razor2

 

 

모듈들의 설치가 완료된 후에는 이제 스팸어세신을 설치할 차례이다.

스팸어세신 역시 특정 버전에서 보안상 취약성이 발견되었으므로 최신의 버전을 다운로드 받아 설치하도록 하여야 한다.

 

아래 사이트에 접속하여 현재 어떤 버전에서 취약성이 확인되었는지 확인하기 바란다.

 

http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=spamassassin

 

만약 기존에 스팸어세신이 설치되어 있다면

#spamassassin --V를 실행하면 현재 설치되어 있는 버전을 확인할 수 있다.

 

rpm 버전이 설치되어 있다면 구버전이므로 가급적 삭제 후 최신 버전의 소스로 재설치하는 것이 좋다. rpm 버전이 설치된 환경에서 소스로 설치하게 되면 스팸어세신이 오작동하게 되므로 주의하기 바란다.

 

 

스팸어세신을 설치하는 방법은 여러 가지가 있는데, 가장 간단하게 사용할 수 있는 방법은 아래와 같이 CPAN.pm을 이용하는 방법으로 cpan shell 모드로 들어간 후 “install Mail::SpamAssassin”만 실행하면 자동으로 설치가 완료된다.

 

 

# perl -MCPAN -e shell

cpan shell -- CPAN exploration and modules installation (v1.59_54)

ReadLine support available (try 'install Bundle::CPAN')

 

cpan> install Mail::SpamAssassin

 

만약 잘 설치가 되지 않을 경우에는 홈페이지에서 소스 파일을 다운로드 하여 압축해제 후 해제된 디렉토리로 이동한 다음

# perl Makefile.PL

이후

# make; make install

 

와 같이 설치해도 된다.

 

 

만약 perl 버전이 낮아 perl을 소스컴파일하여 업그레이드하려면

http://www.cpan.org/src/ 에서 소스를 다운로드 및 압축해제한 후

 

perl-5.x.1]# ./Configure -d ; make; make install 로 설치하면 된다.

 

 

 

설치과정에서 1-2번 물어보면 그냥 Enter만 입력하면 되고 설치 후 perl -v 로 업그레이드되었는지 확인하면 된다.

 

 

만약 root 권한이 없을 경우에는 일반유저 권한으로 자신의 디렉토리에만 설치하여 운영할 수도 있는데, 이는 설치과정에서 아래와 같이 prefix만 적절히 지정해 주어야 한다.

 

이렇게 되면 일반 유저도 자신의 계정에 프로그램을 설치할 수 있게 된다.

 

 

# perl Makefile.PL PREFIX=~/user1 SYSCONFDIR=~/user1

 

만약 make시에 'could not locate your pod2man program' 'Makefile: 54: *** missing separator. Stop.'와 같은 에러가 나거나 설치가 잘 안되는 경우가 있는데 이는 perlExtUtils::MakeMaker 모듈에서 UTF-8을 처리하는 중 버그가 있기 때문이다.

이때에는 export LANG=en_US을 실행하거나 unset LANG을 실행 후 다시 perl Makefile.PL을 실행하면 된다.

 

또는 /etc/sysconfig/i18n 파일에서 LANG 부분에서 "en_US.UTF-8""en_US"로 수정하면 된다.

 

 

 

아울러 설치나 운영과정에서 에러가 발생할 경우에는 “spamassassin -D --lint“을 실행하여 debug메시지를 보면 대략의 원인을 유추할 수 있다.

 

 

스팸어세신의 설치가 완료되면 설치되는 파일은 다음과 같다.

 

/etc/mail/spamassassin/ : 주 설정 파일이

/usr/bin/ : spam 관련 바이너리(spamc, spamd)

/usr/share/spamassassin/ : 기본 제공 룰

설치가 완료된 후에는 기본적으로 제공되는 rule 파일을 업데이트하는 것이 좋다.

 

# sa-update --no-gpg를 실행하면 잠시후 업데이트된 룰이 /var/lib/spamassassin/ 디렉토리에 다운로드되므로 이 룰 파일을 /usr/share/spamassassin/로 옮기고 해당 디렉토리는 삭제하도록 한다.

 

sa-update --no-gpg --D 와 같이 debug 옵션을 추가하면 보다 상세한 정보를 확인할 수 있다

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,034 명
  • 현재 강좌수 :  35,791 개
  • 현재 접속자 :  80 명