postfix를 이용한 스팸및 바이러스 필터링 서버 구축하기

   조회 39651   추천 3    

최근에 스팸메일때문에 잠깐 구축해본 결과를 강좌로 남깁니다. qmail로도 구성이 가능한데 qmail로 설명하려면 구축단계부터 길어질 것 같아서  
postfix로 구성한 과정을 정리해봤습니다. 강좌는 경어가 생략되어 있습니다. 자체적으로 메일서버를 운용하시는 분들은 참고해보시기 바랍니다.


회사에서 사용하는   MS Exchange Edge Server를 이용한 스팸 및 바이러스 필터링 시스템에 몇가지 부족한 부분과 수정이 안되는 문제 때문에 필터링 시스템을 Postfix로 변경하기 위해 작업을 해보았다.

MS제품군은 편리하기는 하지만 필자처럼 리눅스 환경에 익숙한 사람들에게는 자유도가 너무 부족하다...^^;

전체적인 구성도는 아래와 같다. 물론  DNS에서 MX레코드 설정을 변경하여  제일 먼저  Postfix필터서버가 메일을 받도록 설정해줘야 된다.

각각에 대한 간단한 설명은 아래와 같다.

Postfix - MTA(mail tranfer agent) 로 메일메시지를 전송하는 역할을 한다.

Amavis - 펄로 제작된 프로그램으로 외부의 스팸필터링 프로그램,백신들을 호출할 수 있도록 해준다.

ClamAV - 오픈소스 백신 프로그램으로 메일에 첨부된 바이러스를 필터링 한다.

Spamassassin - 오픈소스 스팸 필터링 프로그램으로 스팸룰과 스팸학습기능을 제공해준다.


간단히 설명하자면 외부로 부터 오는 모든 메일메시지는 제일 앞단에 위치하는  Postfix  server로 들어오고Postfix서버에 설치된  amavis 시스템을 통해 스팸과 바이러스를 필터링 한 이후 다시 최종적으로 실제 메일서버에 전달해주는 형태가 되겠다.  amavis는  다른 상용프로그램들도 연결하기가 아주 쉽다.

필자의 경우 우분투 서버를 기준으로 구성했다. 다른 배포판도  설치는 간단하니 그냥 환경설정 정도만 변경해 주면 된다.

Postfix설치 및 설정하기

sudo apt-get install postfix

postfix 설정하기

/etc/postfix/main.cf   및 /etc/postfix/master.cf  에서 설정을 해주면 된다.

main.cf 수정하기

myhostname = 스팸필터링호스트 네임을 적어준다.(ex. spamgw.abc.com)
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = 메일을 받을 도메인을 적어준다. (ex. abc.com mail.abc.com localhost)
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
smtpd_recipient_restrictions = permit_mynetworks reject_unauth_destination

# 메일을 전송할 호스트 설정
transport_maps = hash:/etc/postfix/transport 
# 로컬 수신설정
local_recipient_maps =
# 필터링 설정
content_filter = smtp-amavis:[127.0.0.1]:10024 

아래 3라인 transport_maps,local_recipient_maps,content_filter부분은 필터링 시스템에서 가장 중요한 부분이다.

transport_maps설정

transport_maps는 /etc/postfix/transport  파일에 설정된 메일서버로 메일을 전송하는 설정이다. 따라서 스팸 필터를 모두 마치고 나서 실제 최종 메일서버로 메일을 전송하도록 설정해 줘야 한다.

아래 예제를 참고해서 /etc/postfix/transport파일을 반드시 작성하도록 한다. 192.168.30.85는 Exchange server의 IP address 이다.

mydomain.com smtp:[192.168.30.85]
abc.com      smtp:[192.168.30.20]

각각 메일 도메인에 대해서 라우팅을 설정해 주는 것이다.


로컬메일 recipient 설정

기본적으로 postfix는 계정이 존재하지 않은 메일메시지에 대해서는 모두 반송을 하게 되어있다. 스팸 필터링 서버에는 리눅스 계정이나 가상메일 계정이 존재할 필요가 없고 단순히 필터링만 하기 때문에 들어오는 모든 메일 메시지를 허용해줘야 하며 아래의 설정이 바로 그것이다. 따라서 아래의 설정이 없으면 모든 메일은 반송이 된다.

local_recipient_maps =


필터링 설정

content_filter = smtp-amavis:[127.0.0.1]:10024

필터링 엔진에 대한 설정이며 amavis에 메시지를 전달해주는 설정이다.

/etc/postfix/master.cf에 추가해준다. 아래는 smtp를 이용해서 메시지를 전달해주며  lmtp를 이용해도 된다.

smtp를 이용하는 방법

smtp-amavis unix - - - - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20

lmtp를 이용하는 방법

smtp-amavis unix - - n - 2 lmtp
-o disable_dns_lookups=yes
-o lmtp_send_xforward_command=yes
-o lmtp_data_done_timeout=1200

postfix  설정

/etc/postfix/master.cf 에 아래와 같이 추가해 준다.

127.0.0.1:10025 inet    n       -       -       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_delay_reject=no
        -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o smtpd_end_of_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks


위의 설정까지 마무리하면 기본적인 스팸 필터링 구조는 만들어둔 것이다.

이제 실제 필터링을 하는 amavis 와 clamav,spamassassin  을 설치해 보자.

apt-get install amavisd-new spamassassin clamav-daemon
sudo adduser clamav amavis 
sudo adduser amavis clamav


설치가 되었다면 amavis  설정을 해준다.

/etc/amavis/conf.d/15-content_filter_mode 파일을 열어서  아래와 같이 주석을 제거해주자.

@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);


amavis 데몬 시작

/etc/init.d/amavis start

Postfix 재시작

/etc/init.d/postfix restart


최종 메일 서버의 설정

메일이 최종적으로 저장이 되는 메일서버는 Postfix메일서버로 부터의 연결을 허용해줘야 한다.

익스체인지 서버의 경우 수신커넥터 설정을 해주면 되고 qmail,postfix,sendmail서버의 경우 postfix필터서버를 relay를 허용해주면 된다.

잘 구성이 되었다면 메일 로그에 아래와 같이 나오게 될 것이다.

Nov 16 12:40:58 host1 amavis[21780]: (21780-07) Passed CLEAN {RelayedInbound}, 
[xxx.xxx.xxx.xxx]:41666 [xxx.xxx.xxx.xxx] <********@***.com> -> <*****@***.net>, 
Queue-ID: 6BEB2340011, Message-ID: <************************************@*********.com>, 
mail_id: U_w6o4Gmz7Mz, Hits: 1.277, size: 3983, queued_as: 7EBDD340016, 2654 ms

나머지 기타 세세한 부분들은 각자 테스트 해보기 바란다.

스팸어세신의 학습 기능을 이용한다면 저장된 스팸메일을 학습시켜서 거의 대부분의 스팸메일을 자동으로 걸러낼 수 도 있다. 그리고 clamav 뿐만 아니라 기타 상용 백신엔진들도 사용하도록 amavis 에서 제공하고 있으니 참고해 보기 바란다.


왕머슴 2016-12
오 제가 찾던 자료 입니다.  빨리해봐야겠네요
왕머슴 2016-12
우분트 용인가요?  Centos는 amavisd-new 패키지가 없네요.
     
centos에서 설치하시려면 EPEL  repo를 추가하셔야 합니다.
https://fedoraproject.org/wiki/EPEL
 참고하시기 바랍니다.
왕머슴 2016-12
어렵네요 설치는 했는데.. 

잘 동작 하는지 안하는지 잘 모르겠네요 ㅎㅎㅍ
     
메일 송수신 해보면서 로그 살펴보시면 됩니다.
왕머슴 2016-12
보안팀에서 바이러스메일 5가지 보냈는데 제건 4개 패스하네요 ㅜㅜ
왕머슴 2016-12
자꾸 문의만 드리네요...

혹시 도메인이 1개 이상일때 어떤걸  수정해야 하는지 알려주실수 있나요?
     
/etc/postfix/main.cf
에서  mydestination 변수에 받을 도메인을 쭉 추가해주시면 됩니다.
          
왕머슴 2016-12
감사합니다


제목Page 18/28
2018-06   23059   TLaJ3KtYGr
2016-03   20294   채영진
2021-11   17900   딥러닝서버
2013-12   15754   김윤술
2017-04   24009   Ansyncic
2014-07   12556   user
2017-06   23692   무아
2015-04   34022   HEUo김용민
2016-04   17364   박문형
2015-05   19078   죠짱
2015-05   14392   김황중
2015-05   35636   죠짱
2013-03   78112   안형곤
2016-04   24057   캡틴아메리카노
2017-07   554422   세벌쉭
2023-06   71783   딥러닝서버
2016-10   15869   엠브리오
2018-09   21953   하얀고니
2014-01   37885   황진우
2015-08   37488   witbox