커피닉스, 시스템 엔지니어의 쉼터
  Qmail에 procmail을 붙여보자(스팸,바이러스방지) 작성일 : 2003/09/16 00:12
 
  • 글쓴이 : 이강우 ( http://koov.net/ )
  • 조회수 : 7718
     
    
    ==============================================================================
    제  목 : Qmail에 procmail을 붙여보자.
    작성일 : 2003-08-22
    마지막수정일 : 2003-09-08
    작성자 : 이강우(coolseed_AT_hotmail.com) http://koov.net
    
    ==============================================================================
    
    ----------------------------------------------------------------------
    우선 Qmail과 procmail이 있다는 가정하에 연동하여 스팸을 방지하고
    바이러스를 방지하는 법을 소개하겠습니다.
    
    # Procmail을 사용하는 이유?
    qmail-scan이나 mailscanner보다 속도가 빠르다고 합니다. 따라서 대용량 메일처리시
    유용하며 시스템 자원도 적게 든다고 합니다.
    (이부분에 있어서는 다른것과 비교를 해본적이 없으므로 확신할수는 없습니다.)
    
    목표 : procmail을 통하여 모든 사용자에게 가는 메일을
           한개의 설정파일(/etc/procmailrc)로 제어한다.
    
    준비 : Qmail (멋진 MTA). 그외에는 필요한게 없음.
    
    *Vpopmail같은 가상매니저를 설치한경우는 이곳에서 다루지 않음.
    *Qmail을 기본셋팅으로 설치하여 로컬계정을 이용하는 경우가 아니면 작동하지 않을수 있습니다.
    *필자의 경우 Qmail + Checkpassword + Daemontools만 설치한 상태에서 진행하였습니다.
    
    
    Qmail설치와 procmail설치는 다른 문서를 참조하시기 바랍니다.
    
    PS:레드햇 계열에서는 기본적으로 procmail이 설치되어있습니다.
    PS:hcode는 자료실에서 받아서 컴파일하시기 바랍니다.
    
    ----------------------------------------------------------------------
    
    우선 우리는 Qmail의 완벽한 셋팅법을 숙지할 필요가 있습니다.
    먼저 해당머신의 Qmail구동 스크립트를 아래와 같이 수정해야 합니다.
    
    /var/qmail/rc
    #!/bin/sh

    # Using splogger to send the log through syslog.
    # Using procmail to deliver messages to /var/spool/mail/$USER by default.
    # 위의 영문에 보면 procmail은 기본적으로 /var/spool/mail/$USER로 보낸다고 되어있습니다.
    # 이걸 우리는 ./Maildir/로 보내야 하기에 아래와같이 셋팅합니다.
    # 사실 /etc/procmailrc에서 다시한번 선언해주기 때문에 여기에서의 선언은 무의미하다고 볼수도
    # 있습니다. ^^

    exec env - PATH="/var/qmail/bin:$PATH" \
    qmail-start '|preline procmail -p -m /etc/procmailrc ./Maildir/' splogger qmail
    
    
    붉은 부분이 수정된 부분입니다.
    이 파일은 Qmail을 구동하는 가장 기본적인 파일로서 Qmail의 기본적인 셋팅을 담고 있습니다.
    위의 명령줄을 살펴보시면 procmail을 통해 /etc/procmailrc라는 룰을 이용하여 메일을
    제어하겠다고 선언되어있는것입니다.
    또한 Qmail에서 기본적으로 ./Maildir/을 사용하겠다고 선언한것도 보입니다.
    
    ####### 이 부분이 아주 중요합니다. ###
    # 일반적으로 Qmail을 처음설치하시거나 설정을 잘 모르시는분들께서는 rc파일에 이와같이 설정해놓고
    # 별도로 사용자 디렉토리에 .qmail 파일을 생성하고 내용에 ./Maildir/ 을 추가하시는분들이 있습니다.
    # 이런경우는 중복설정이 되기때문에 엉뚱한 결과가 생기게 됩니다.
    # 메일이 procmail에 의해 필터링 되지 않고 바로 ./Maildir/로 들어가게 되지요. :(
    # 따라서 rc파일에 위와같이 ./Maildir/을 선언해준경우에는 별도로 사용자 디렉토리에 .qmail파일을 생성할
    # 필요가 없습니다. 또한 procmail로 걸러주기 위해서는 반드시 없어야 합니다.
    
    이렇게 설정해주고 모든 사용자 홈의 .qmail의 내용중 ./Maildir/이라고 된 줄을 없애야 합니다.
    다른사용자로 리다이렉션 하기위한 설정은 놔두셔도 무방합니다.
    다시 말씀드리지만 사용자 홈디렉토리의 .qmail파일안에 ./Maildir/이라는 내용이 있을경우
    procmail을 무시하고 메일이 전달됩니다.
    
    
    이제 설정파일을 만들차례이다. 그전에 우리에게 필요한 유틸이 있는데 그것은 바로
    formail과 hcode라는 유틸이다. formail은 qmail에 포함되어있으므로 상관 없지만
    hcode는 소스를 가져다가 컴파일 해야 한다. 자료실에서 소스를 받아다 컴파일하자
    $ make
    $ cp hcode /var/qmail/bin
    
    그리고 아래와같은 전체사용자 설정파일을 작성한다.
    ## (그대로 복사해서 만들면 된다.)
    /etc/procmailrc
    MAILDIR=$HOME/Maildir/
    DEFAULT=$MAILDIR
    # Maildir(qmail) 형식의 폴더는 맨뒤에 /를 붙여주어야한다.(man procmailrc)

    LOCKFILE=$HOME/.lockmail
    LOGFILE=/var/log/qmail/procmail
    # 로그파일의 경우 퍼미션을 777로 줘야한다. 왜냐하면 로그를 하는 프로세스의 소유과 그룹이
    # 해당 메일의 소유자로 만들어지기 때문이다. 따라서 모든 메일에 대한 로그를 적어야 하기 때문에
    # 권한을 777로 줘야 한다. :(
    # 보안상 조금 문제가 있을수도 있는 부분이다.

    ################################################################################
    # 스팸메일 필터링 룰 #
    ################################################################################

    ################################################
    # 인코드되어 날아오는 헤더를 디코드 하는 부분. #
    ################################################
    :0 Efhw
    *^(Subject|From|Cc):.*=\?EUC-KR\?(B|Q)\?
    |formail -c | /var/qmail/bin/hcode -dk -m

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

    :0 Efhw
    *^(Subject|From|Cc):.*=\?KSC5601\?(B|Q)\?
    |formail -c | /var/qmail/bin/hcode -dk -m

    :0 Efhw
    *^(Subject|From|Cc):.*=\?ISO-8859-1\?(b|B|Q)\?
    |formail -c | /var/qmail/bin/hcode -dk -m

    # Body의 파일명 디코딩
    :0 BfHw
    *^*.filename=.*=\?euc-kr\?(B|Q)\?
    |formail -c | /var/qmail/bin/hcode -dk -m

    ### 디코딩 끝

    #######################
    # 광고, 스팸메일 제거 #
    #######################
    :0
    *^Subject: .*(\{광|\[광|\(광|포르노|포X노|광고|광\ 고|홍보|광-고|성인|광1고|廣告|sex|SEX)
    /dev/null # 널로 보내버린다. 로그로 남기고 싶으면 아래줄처럼 한다.
    #/var/log/qmail/spam

    ######################
    # 바이러스 메일 제거 #
    ######################
    :0 BH
    *^*.filename=.*(\.pif|\.scr|\.lnk)
    /dev/null # 널로 보내버린다. 로그로 남기고 싶으면 아래줄처럼 한다.
    #/var/log/qmail/virus

    :0
    *^Subject: .*(Return|Thank|Wicked|Detail|Approved|application|Delivery|movie)
    /dev/null

    ## 새로운 바이러스 탐색
    :0 BH
    *^*.filename=.*(height.exe|nerosys.exe)
    /var/log/qmail/virus
    # 모든 필터링 룰은 순차적으로 적용이 된다.
    # 즉 위쪽에 있는 필터링 룰 일수록 먼저 필터링 대상이된다.
    ################################################################################
    
    여기까지가 설정파일의 끝입니다만 이건 극히 일부분을 이용한것에 불과합니다.
    더욱더 많은 설정을 원하신다면 다른 문서를 참조하시거나 
    $ man procmailrc
    
    로 옵션을 살펴보시면 되겠습니다.
    *** 위의 설정파일은 파일명 디코딩 패치를 한 hcode를 적용한것입니다.
    *** 파일명 디코딩 패치를 하지 않은 hcode로는 정상작동 하지 않을수도 있습니다.
    
    $ chmod 777 /var/log/qmail/spam
    $ chmod 777 /var/log/qmail/virus
    
    이 두화일의 권한은 모두 쓰기옵션이 되어있어야 합니다.
    위의 로그화일과 마찬가지로 메일소유주의 권한으로 작성이 되기 때문입니다.
    별로 필요하거나 중요한 파일이 아니므로 777로 주셔도 무방합니다.
    또한 이 파일로 리다이렉션되는걸 원치 않으시는분은
    
    /dev/null
    
    로 모두 보내는 방법도 있습니다. (깔끔해욧!!)
    
    자 이제 Qmail을 다시 구동시키시면 스팸메일과 바이러스 메일이 죄다 걸러지는것을 볼수 있습니다.
    
    #!. 마치며
    온라인상에서 쓰는거라 어리숙하지만 나중에 차차 수정하여 보완하도록하겠으며 문의사항이나
    버그, 또는 더 좋은 정보가 있으면 아래 연락처로 메일주시면 감사하겠습니다.
    모두 행복하십시요.
    
    ==============================================================================
    작성일 : 2003-08-22
    마지막수정일 : 2003-09-08
    작성자 : 이강우(coolseed_AT_hotmail.com) http://koov.net
    ==============================================================================
    


    커피닉스, 시스템 엔지니어의 쉼터 / URL : http://coffeenix.net/board_view.php?bd_code=69