본문 바로가기

Linux/Mail

procmail을 이용한 스팸 메일 필터링

출처 procmail을 이용한 스팸 메일 필터링|작성자 mybrainz
작성자: 푸른바다 bluesealove@empal.com
작성일: 2004831

 

procmail을 이용한 스팸 메일 필터링

 

요즘 들어 스팸 메일이 극성을 부리고 있습니다. 불황이라서 그런지 스패머들의 스팸 메일 발송이 더욱 극렬해지고 교활해지고 있습니다. 이메일 주소가 인터넷에 노출되는 순간 수많은 스팸 메일이 쏟아져 들어오기 때문에 이메일 주소를 'someone AntiSpam somewhere.com' 하는 식으로 @ 를 빼고 인터넷에 게재하는 경우도 적지 않지요. 중간에 @가 들어가는 순간 이메일 주소 수집 로봇이 자동으로 인식해서 스팸 메일 발송 주소로 등록하는 모양입니다.

제 동생이 어느 날 집에 들어오더니 투덜대는 것이었습니다. 인터넷에 구인공고를 냈는데 날아오는 것은 이력서가 아니고 스팸 메일이었다고 합니다. 수십 통 메일 중 정작 가치가 있는 것은 몇 통 뿐이라는 이야기지요
.

요즘에는 특히 대출 관련 스팸 메일이 극성을 부립니다. 제 메일 박스로 들어오는 스팸 메일 제목을 몇 개 예를 들어보겠습니다
.

직장인 전문대출상담

직장인만 대출해드립니다
(-
-)남성단련 무료 트레이닝 체험
건강지킴이 가시오피외3종 무료 선착순증정

저도 참을만큼 참다가 스팸 메일 필터링에 나섰습니다. 여기저기 게시판을 둘러보니 다들 스팸 메일 필터링 때문에 머리를 쥐어짜고 계신 듯합니다. 하기야 이 정도로 스팸 메일이 쓰레기더미로 곳곳에 쌓여있는 걸 보면 더 이상 참는 게 비정상적으로 보일 만도 하군요.

일단 제 목적은 저한테 메일을 포워딩해주는 리눅스 서버에서 제목 필터링 등 간단한 설정을 통해 스팸 메일을 어느 정도 막아보자는 것입니다. 설정이 복잡해지면 현재 가동 중인 서버에 영향을 줄 수 있고 시간도 그리 넉넉치 않고 해서 milter 같은 본격 스팸 메일 필터링 프로그램을 사용하기보다는 시스템에 기본으로 깔려있는 procmail 등을 사용해 간단하게 설정해보는 것입니다
.

sendmail.cf
문법을 이용한 스팸메일 차단은?

'
간단하게'를 만족시키려면 (서버에 센드메일이 깔려있다면) 제일 먼저 떠오르는 것이 sendmail.cf 같은 설정 파일을 통해 제목을 필터링하는 것입니다. 센드메일 설정 파일의 복잡성은 악명이 높긴 하지만 어쩌면 소기의 목적을 달성할 수 있을 지도 모른다는 생각이 들어 인터넷을 검색해보고 다음의 자료를 찾았습니다
.

http://oops.org/?t=lecture&sb=sendmail&n=7
(cf
문법을 이용한 스팸메일 차단)

이대로 따라해보니 영어 제목은 필터링이 되는데 한글 제목은 필터링이 되지 않는다는 것을 확인했습니다. 가령 'sales' 같은 제목은 필터링해서 반송할 수 있지만, '판매' 같은 단어는 필터링할 수 없습니다. 한글 인코딩 문제도 있는 것 같고 센드메일에서 이런 인코딩까지 고려해서 필터링해주는 서비스는 해주지 않는 것 같습니다. 따라서 sendmail.cf 파일을 통한 한글 제목 필터링은 성공할 수 없었습니다.

milter
는 너무 복잡해!

그래서 참고한 자료가 KLDP의 한글 리눅스 팁 프로젝트의 이메일 부분입니다.

http://kltp.kldp.org/stories.php?topic=16

(한글 리눅스 팁 프로젝트: 이메일)

여기에 보면 'sendmail 에서 milter 사용해서 약간의 스팸과 바이러스 막기'라는 글이 있는데 메일 본문까지 검색해서 스팸 메일을 차단하는 방식으로, 시스템에 깔린 센드메일과 동일한 센드메일 소스를 가져와서, milter가 센드메일과 붙을 수 있도록 컴파일해줘야 하는 등 다소 복잡합니다. 제가 본격 시스템 관리자라면 시도해보겠지만 그렇지 않아서 컴파일까지 하는 방법은 일단 보류했습니다. 자신이 있는 분은 한번 시도해보시기 바랍니다. 하지만 중요한 업무를 처리하는 서버에서는 상당한 주의가 필요합니다.

procmail로 스팸 메일을 잡자!


위에 언급한 게시판에 보면 'procmail 을 이용해 스팸메일 필터링하기' 라는 글에 쓰레드 글이 붙어 있음을 알 수 있습니다. procmail을 사용한 필터링에 필요한 정보를 기본적으로 제공하고 있습니다.

procmail
의 장점은 센드메일을 사용하는 리눅스 시스템에 대부분 깔려있을 가능성이 많아서 따로 설치하지 않아도 된다는 점입니다. 이 경우 센드메일에서 procmail을 호출할 수 있도록 기본으로 설정되어 있기 때문에 아주 간단하게 작업을 할 수 있습니다.

저의 경우 데스크탑에 코어리눅스2004 워크스테이션을 사용하는데 여기에도 깔려 있군요. 그리고 서버로 사용하는 레드햇 리눅스 최근 버전에도 procmail 패키지가 기본으로 설치되어 있습니다. 센드메일 패키지에 필요한 부속 패키지로 그냥 따라다니는 모양입니다. procmail에서 사용하는 formailprocmail 패키지에 들어있기 때문에 따로 설치할 필요가 없습니다.

rpm -qa | grep procmail 
명령을 사용하면 현재 시스템에 procmail 패키지가 설치되어 있는지 알 수 있습니다. 또는 한텀 같은 쉘에서 procmail 이나 formail을 입력하고 탭 키를 눌러보면 해당 바이너리를 실행할 수 있는지 알 수 있습니다.

먼저 메일 제목을 인코딩 해야지!

, 이제 필요한 것은 한글 제목을 인코딩하는 데 필요한 hcode 입니다. 다른 인코딩 프로그램을 사용할 수 있지만 여기서는 구하기 쉬운 hcode를 사용하기로 하겠습니다. hcode 제작자 는 이전 hcode 버전에 심각한 보안 문제가 있으니 hcode 세번째 버전을 사용하라고 강력히 경고합니다. 그리고 버그 픽스된 버전이라도 시스템 전역에서 사용하지 말 것을 추천하고 있습니다. 가급적이면 자신의 계정에서만 hcode를 사용하라는 이야기지요. 시스템의 중요도에 따라 이것을 판단할 수 있겠습니다. 아래에서 언급하는 사이트의 자료는 버그 픽스된 것입니다. hcode와 간단한 예제는 다음에서 다운로드받을 수 있습니다.

http://www.intosea.com/
(hcode
를 이용한 spam 메일 차단 방법 및 hcode 자료)

이 사이트는 익스플로러 접근을 허용하지 않으니 모질라 등의 브라우저를 사용해서 들어가야 합니다. 이 사이트의 자료마당-리눅스 메뉴로 들어가서 hcode로 검색을 하면 자료가 나오니 내려받으시면 됩니다. 이 자료실 게시판에서 말하는 것처럼 해도 간단하게 procmailrc 파일을 설정해서 사용할 수 있습니다만, 다소 복잡한 문제가 남습니다. 이것은 뒤에 설명을 드리겠습니다.


bunzip2 hcode_spam_filter.tar.bz2
tar xvf hcode_spam_filter.tar

이런 식으로 압축을 풀면 파일 세 개가 나옵니다.


procmailrc.example : procmailrc 예제파 일로 그대로 사용해도 됨
hcode-2.1.3-2ea.i686.rpm : hcode RPM 바이너리
hcode-2.1.3-2ea.src.rpm : hcode RPM 소스

대부분의 경우 바이너리를 설치하면 될테니 rpm 소스는 사용할 일이 잘 없을 겁니다.


rpm -Uvh hcode-2.1.3-2ea.i686.rpm

이런 식으로 바이너리 rpm 을 설치할 수 있습니다.

<>

, 이제 어떻게 해야하나?

이제 필요한 소프트웨어는 다 구비를 했습니다
. /etc/mail/sendmail.mc 파일에 procmail 단어를 포함한 줄이 몇 줄 있는가 확인해 봅니다. 또는 아래 명령을 실행했을 때 이와 비슷하게 출력이 나오면 센드메일에서 procmail을 사용할 수 있도록 설정이 된 것입니다.

# cat /etc/mail/sendmail.mc | grep procmail

define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl
FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl
MAILER(procmail)dnl

참고로 sendmail.mc sendmail.cf가 너무 복잡하고 읽기 힘든 코드로 되어 있기 때문에 이를 쉽게 생성할 수 있도록 하는 설정 파일입니다. 대부분 sendmail.mc를 통해 설정한 다음 sendmail.cf를 생성하지, 직접 sendmail.cf를 손대지 않는 것이 좋습니다.

그리고 /etc/procmailrc 란 파일도 시스템에 있을 겁니다. 기본 설정 파일로 특별한 필터링을 하지는 않는 상태로 되어 있습니다.

이제는 기본 환경 구비는 끝났습니다. 마지막 설정만 남은 것입니다. 이제 센드메일이 메일을 받으면 procmail에게 권한을 넘겨줘 사용자 홈디렉토리의 .procmailrc 파일에 설정된 대로 실행하거나 시스템 전역의 /etc/procmailrc 파일의 지시사항 대로 실행할 겁니다.

간단히 테스트를 해보겠습니다. 위의 hcode를 내려받은 곳에서 설명한 대로 procmailrc.example/etc/procmailrc 파일이나 ~/.procmailrc 파일로 복사하고 /var/mail/spam이라는 파일을 만들어 둡니다.

% cp procmailrc.example ~/.procmailrc
% su
# touch /var/mail/spam
# chmod a+rw /var/mail/spam

이러면 스팸 메일들이 /var/mail/spam이라는 곳에 쌓입니다.


남은 문제는
?

일단 aliases 문제가 걸립니다. 즉 센드메일이 이메일을 받으면 /etc/mail/aliases 파일에 나열된 이메일 주소로 바로 보내버리기 때문에 필터링이 안됩니다. 가령 webmaster라는 주소를 몇 군데 다른 주소로 aliases 해놓았다면 webmaster 계정의 .procmailrc 파일을 참고도 하기 전에 해당 주소로 곧장 보내버리기 때문에 기대했던 필터링은 물건너가고 맙니다.

두번째 문제는 ~/.forward 파일 문제입니다. 보통 자기 계정으로 날라오는 이메일을 다른 곳으로 포워딩하는 데 사용하는 설정 파일인데 이 또한 필터링을 거치기도 전에 바로 해당 이메일 주소로 보내버리기 때문에 기대했던 필터링은 무위로 끝나고 맙니다. .forward 자체에 대해서도 몇 가지 이슈가 있습니다. .forward 파일을 그룹이 쓰기 가능하면 센드메일에서 호출을 하지 않는다고 하는군요. 저도 .forward 사용을 시도해보다가 필터링이 안되는 관계로 포기하고 말았습니다.

그럼, 이제 어떻게 해야 할까요?


기본 지식부터 쌓기

먼저 센드메일과 procmailrc 구동 방법에 대한 약간의 지식이 있으면 좋습니다. 이러한 정보는 아래에서 찾을 수 있습니다.

http://wiki.kldp.org/wiki.php/LinuxdocSgml/Sendmail-KLDP
sendmail 이야기

http://www.feep.net/sendmail/tutorial/
영문, sendmail Tutorial

http://userpages.umbc.edu/~ian/procmail.html
영문, Mail Filtering with Procmail

첫번째 한글 자료는 센드메일의 기본 구동 방법을 배우는 데 좋은 자료입니다. 두번째 영문 자료는 센드메일의 동작방법을 그림으로 보여주기 때문에 꽤 유익합니다. 마지막 자료는 procmailrc를 통한 필터링 방법을 초보자를 대상으로 쉽게 설명하고 있기 때문에 ‘강추!’입니다. 일단 기본적인 지식을 쌓았다면 다음으로 넘어가볼까요?

procmailrc 파일 건드리기

센드메일은 메일을 받으면 사용자 홈 디렉토리의 .procmailrc 파일을 살펴보고, 이 파일이 있으면 이 파일이 시키는 대로 실행을 합니다. 이 파일이 없으면 /etc/procmailrc 파일의 내용대로 실행합니다. 따라서 aliases 파일의 해당 알리아스 항목과 홈 디렉토리의 .forward 파일의 내용을 제거하고 순수하게 procmailrc 파일만으로 작업을 하는 게 여러 모로 권장할 만합니다. 즉 한군데서 모든 작업을 함으로써 여기저기에서 설정 작업을 할 필요가 없다는 말이지요.

위의 세번째 링크 자료는 정말 읽어보시기 바랍니다. procmailrc에 대해 이렇게 쉽고 유익하게 설명된 자료는 다른 데서 찾아보기 힘듭니다. 저도 그 문서에서 procmailrc 파일 설정법을 배웠고, 이후 내용도 그것을 참고해서 진행하겠습니다.

먼저 제가 작성한 procmailrc 파일을 중심으로 검토해보겠습니다. 간간히 아까 hcode와 함께 내려받았던 procmailrc 예제 파일도 들여다보겠습니다.

.procmailrc 파일의 제일 위에는 기본 환경 설정 부분입니다.


PATH=/usr/bin:/usr/local/bin:/bin

MAILDIR=$HOME/.mbox
DEFAULT=$HOME/.mbox/webmaster
LOGFILE=$MAILDIR/log
SHELL=/bin/sh

PATH.procmailrc 내부에 지정된 실행 파일이 있는 경로를 지정하는 것입니다. 보통 이 정도로 지정해 놓으면 문제 없습니다. MAILDIR은 메일을 저장할 공간으로 저는 홈디렉토리의 .mbox/ 디렉토리를 만들었습니다.

DEFAULT는 날아오는 메일을 기본으로 저장하는 파일을 지정하는 부분입니다. 저는 .mbox/webmaster 파일을 touch webmaster 명령으로 만들어 두었습니다. 그냥 빈 파일을 만드는 것은 touch 명령을 사용하면 됩니다.

LOGFILE은 날아오는 메일을 어떻게 분류했는지 기록하는 파일입니다. 저는 .mbox/log 파일로 지정했습니다. SHELL은 내부에서 사용하는 쉘을 지정한 것입니다.

일단 이렇게 기본 환경 설정이 끝나면 날아오는 메일의 제목을 인코딩해야 합니다. 제각기 다른 코드로 날아오는 메일을 인코딩해야 문자열을 비교할 수 있겠지요.


#
인코드되어 날아오는 헤더를 디코드 하는 부분.

:0 Efhw
*^(Subject|From|Cc):.*=\?EUC-KR\?(B|Q)\?
|formail -c | hcode -dk -m

:0 Efhw
*^(Subject|From|Cc):.*=\?ks_c_5601-1987\?(B|Q)\?
|formail -c | hcode -dk -m

이 부분은 우리가 내려받은 예제 파일의 내용을 그대로 사용했습니다. ‘:0’은 아래 조건에 맞는 명령을 실행한다는 지시자로 특정 조건을 검색하고 처리를 하려면 첫머리에 적어줘야 합니다. 뒤의 Efhw은 저도 잘 모르는 옵션인데 글자 한자한자가 특정 행동을 지시하는 옵션입니다. ‘*’는 조건 검색 시에 앞부분에 적어주는 지시자고, ‘^’는 정규표현식으로 문자열 첫머리를 의미합니다. ‘()’는 한 집단으로 묶는 것이고 ‘|’or 연산자입니다. ‘.’는 글자 한자를 의미하고 ‘*’는 앞서 나온 글자가 0번 이상 반복되는 것을 의미합니다. 즉 ‘*^(Subject|From|Cc).*’는 헤더 첫머리에 Subject 이나 From이나 Cc라는 글자가 나오고 그 다음에 아무 문자나 한개 이상이 나온 다음에 EUC-KR 류의 문자열을 검색하는 것입니다. 이 조건에 합당하면 다음 명령을 실행합니다.

여기서 ‘|’는 기존 내용물을 파이프로 넘겨준다는 것입니다. formail 프로그램이 -c 옵션으로 기존 내용물을 받아서 처리한 다음 hcode가 다시 이것을 받아서 적절한 처리를 한다는 명령입니다. 그 다음 부분도 ks_c_5601-1987 헤더 문자열에 대해 비슷한 처리를 하는 부분입니다.

이 부분은 잘 모르면 바꿀 필요가 없을 것으로 보입니다. 이후 부분이 우리가 신경을 써야할 부분입니다.


#
제목부분에 지정된 문자열이 걸리면, spam계정으로 메일전송

:0
* ^Subject: .*(광고|홍보|-|목록입니다|리스트입니다|성인 정보|몰카|\[.*\]|\[.*\]|\[.*\]|\(.*\)|\(.*\))
trash

:0
* ^Subject: .*(대출|대출해|전문대출|직장 인|무료로|로또|무료 상담|전용대출|전문상담|유망 직|공짜로|공짜|최신 유행|발송기|광고|자격 증|직장인대출|직장인대출상담|코웨 이|판매|트레이닝|건강 지킴이|랭킹닷컴|성인영화|성인 방송|성인소설|-|link exchange|PARTNER|유 망직종|0순위|전문컨설팅|최저 수수료|자연의힘|대출상담|카드 연체|신용불량|상담신청|자동 차|연체|카드|돈 마련|상담신청|숙취|다이 어트|신용대출전문|체질|대출 상품|돈이|취업|수수 료|관리사|시험)
trash

 

...이하 생략... 


 

'Linux > Mail' 카테고리의 다른 글

메일서버(sendmail,saslauthd,dovecot) 세팅  (0) 2009.03.30
SMTP error code  (0) 2009.03.06
Squirrelmail 설치하기  (0) 2008.10.09
sendmail 스팸처리  (0) 2008.10.09
Relaying denied. IP name lookup failed  (0) 2008.10.09