Postfix를 이용한 스팸 및 바이러스 필터링 시스템 구성하기

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

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

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

spamfilter

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

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] <Andy.Kim@abc.com> -> <stone@abc.net>, 
Queue-ID: 6BEB2340011, Message-ID: <83B36BA2-D05C-43A9-A440-45BCE51EE141@raon-tech.com>, 
mail_id: U_w6o4Gmz7Mz, Hits: 1.277, size: 3983, queued_as: 7EBDD340016, 2654 ms

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

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

 

 

 

WDS를 활용한 Linux 시스템 네트워크 설치-Kickstart

기본적으로 레드햇 리눅스 계열은  kickstart라는 네트워크 설치 프로세서를 제공한다.

대부분의 경우  tftp서버 및 nfs,http,dhcp서버등을 리눅스로 구성한 다음 네트워크 설치를 구성하지만 필자의 경우 windows 시스템과 리눅스 시스템이 혼용이 되어 있어서 간략한 시스템을 구성하기 위해 통합 작업을 하였다.  아래 포스트에 WDS와 syslinux를 이용한 네트워크 설치 서버 구성편을 읽어보고 구성이 되어 있다고 가정한다.

http://www.nuxinfo.net/wdssyslinux%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%84%A4%EC%B9%98%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0/

전체적인 작업 순서

  1. WDS에 리눅스 부팅 이미지를 적당한 곳에 위치한다. 리눅스 부팅 이미지는 설치CD/images/pxeboot/ 에  커널(vmlinux) 과 초기화램디스크 이미지(initrd.img)  두개의 파일을 이용해서 네트워크 부팅을 시작
  2. 자동설치를 위해서 kickstart  설정파일(ex. ks.cfg) 파일을 생성하고 적당한 위치에 둔다. ks파일은 http,ftp,nfs등을 이용해서 접근하도록 구성하면 된다.
    ex)  http://example.com/ks/rhel6-32bit.ks.cfg ,ftp://example.com/ks/rhel6-32bit.ks.cfg,nfs://nfsserver/ks/ks.cfg
  3. 네트워크 부팅 후 initrd 에 kickstart 설치 값을 전달한다.(WDS설치디렉토리(RemoteInstall)\Boot\x86\pxelinux.cfg\default 파일에서 설정해 준다.)
    예제)

    LABEL CentOS 6.8(64bit)
    MENU LABEL CentOS 6.8 64bit
    KERNEL /Linux/CentOS/6.8/x86_64/vmlinuz
    APPEND initrd=/Linux/CentOS/6.8/x86_64/initrd.img ks=ftp://192.168.30.100/ks/cent6-ks.cfg

     

 

Kickstart환경설정 파일 생성

kickstart설치를 위한 환경설정 파일은 미리 만들어진 파일을 참고하여 만들어도 되고 가장 편한 방법은 레드햇 계열의 시스템을 설치하면 자동으로 생성되는 anaconda-ks.cfg(/root 디렉토리에 자동생성된다.) 를 이용하는 방법이 있다.

아래는 Centos 6 ks.cfg 예제이다.  Centos 7버전은 형식이 조금 달라졌으니 확인하기 바란다.

install #설치할 것인지 업그레이드 할 것인지 선택
text # text모드로 설치
url --url http://ftp.daumkakao.com/centos/6.8/os/x86_64 #미러서버 경로(내부에 구성했다면 내부서버경로를 잡아주자)
lang en_US.UTF-8 #설치 언어
keyboard us #키보드 설정
network --onboot no --device eth0 --bootproto dhcp --noipv6 #네트워크 설정
rootpw --iscrypted $6$bsimcTMIypuVEJKu$yeYkKkqQUSW8nwhx4HbCL8x9V6KqBC9.nMVMlTLwfO.# root사용자 비번
firewall --service=ssh #방화벽 설정
authconfig --enableshadow --passalgo=sha512 # 인증 및 암호화 알고리즘
selinux --disabled # selinux설정
timezone --utc Asia/Seoul # 시간설정
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" # 부트로더 설정

clearpart --all --drives=sda #sda의 기존 파티션을 모두 삭제한다.주의할 것!

part /boot --fstype=ext4 --size=500
part pv.008002 --grow --size=1

volgroup vg_lvs --pesize=4096 pv.008002
logvol / --fstype=ext4 --name=lv_root --vgname=vg_lvs --grow --size=1024 --maxsize=51200
logvol swap --name=lv_swap --vgname=vg_lvs --grow --size=1638 --maxsize=1638

%packages --nobase #설치할 패키지
@core #패키지 및 패키지 그룹을 적어준다.
%end

참고)  암호화된 rootpw 생성방법

anaconda로 생성된 ks 파일에 이미 설치할때 입력한 root패스워드를 이용하지 않고 새롭게 입력하고 한다면 아래의 방법을 사용하도록 하자. 생성된 암호를  rootpw 라인에 넣어주면 된다.

  •  암호화 알고리즘을  md5 로 설정한 경우(authconfig --enableshadow --enablemd5)

    openssl passwd -1 "사용할패스워드"
    
    grub-crypt --md5
  • 암호화 알고리즘을 sha512 로 사용하는 경우(authconfig –enableshadow –passalgo=sha512)
    grub-crypt --sha-512