앞서서 Apache James를 이용하여 메일 서버를 운영하는 방법에 대해서 정리하였다.

이렇게 메일 서버를 운영하면, 어떻게 아는지 몰라도 매일 매일 많은 스팸 메일들을 수신하게 된다.

이 스팸 메일들을 차단하기 위해 스팸 서버를 이용하거나 메일 서버내에 스팸 필터를 적용해서 이용하는데, 여기에서는 오픈 소스인 Apache SpamAssassin를 이용하여 스팸 서버를 구축하는 방법에 대해서 정리한다.

 

메일 관련 내용들

1. 메일 서버 구축 : Apache James

2. 스팸 메일 서버 구축: Postfix & Apache SpamAssassin

3. 메일 서버와 스팸 필터 : Apache James & SpamAssassin

 

구축 방법은 다음과 같이 인터넷 검색으로 쉽게 찾을 수 있기 때문에 여기에서는 정리하지 않고, 스팸 메일 서버를 이용해서 실제로 테스트하는 방법만 정리한다.

스팸 서버 구축에 필요한 SpamAssassin은 리눅스에서 운영되며 여기에서는 Centos 7에 설치하고 정리하였다.

Ubuntu도 설치법은 유사하다.

 

Centos 설치
https://tweenpath.net/configuring-spamassassin-postfix-centos/
https://devopspoints.com/centos-7-installing-and-configuring-spamassassin.html

Ubuntu 설치
https://hostadvice.com/how-to/how-to-secure-postfix-with-spamassassin-on-an-ubuntu-18-04-vps-or-dedicated-server/

스팸 서버도 메일을 주고 받는 서버이기 때문에 메일 서버랑 기본적으로 동일하다.

따라서 인터넷 자료는 Postfix, Dovecot등으로 메일 서버를 구축하고,

SpamAssassin으로 스팸 메일을 체크를 하는 식으로 구현하는 자료가 많은데, 이러한 내용들은 설치만 해도 제법 복잡하다 (이런 구축은 스팸 서버라기 보다 스팸 필터라고 생각한다).

스팸 서버는 메일을 주고 받는 SMTP와 스팸 여부를 확인하는 기능만으도 충분하다.

(각종 메일 처리나 IMAP, POP3등을 구현하지 않는다.)

메일 송수신에 사용되는 SMTP는 Postfix를 이용하고, 송수신하는 메일에 대한 스팸 여부는 SpamAssassin으로 확인하도록 구축한다.

 

Postfix는 운영체제와 같이 설치되어 있고, SpamAssassin만 위 인터넷 자료를 따라서 설치한다 (Ubuntu에서 spamc는 굳이 설치하지 않아도 되는 것 같다).

설치 문서의 핵심은 메일을 발송하는 Postfix와 SpamAssassin을 연결하는 것으로, Postfix에서 메일을 송수신 하면 SpamAssassin으로 검사 하기 위한 것이다.

 

다만, 이 문서에서 SpamAssassin 설정(/etc/mail/spamassassin/local.cf)을 다음과 같이 수정한다 (CentOS).

            > vi /etc/mail/spamassassin/local.cf

required_hits 2
report_safe 0
rewrite_header Subject [SPAM]

SpamAssassin은 지정되거나 학습된 규칙에 의해서 메일을 평가해서 점수로 환산하고, 지정된 값(required_hits) 이상이면 스팸으로 표시한다.

위 설정외에도 다양한 설정을 할 수 있는데, 설정에 대한 상세한 내용은 이 사이트에 정리된 내용을 참고하면 된다.

기본 값은 5인데, 이렇게 지정되면 테스트하기 어렵기 때문에 2으로 수정해서 진행한다.

수정내용을 반영하기 위해서 SpamAssassin을 재가동 한다.

         > sudo service spamassassin restart

 

스팸 메일을 테스트하려면 스팸 메일을 만들어야 한다.

스팸 메일을 만들려면 SpamAssassin의 규칙을 알아야 하는데, 다음 그림과 같이 Futurequest 사이트에 잘 정리되어 있다.

위 내용들은 메일이 어떤 내용을 가지고 있는 냐에 따라 점수를 부여하는지를 나타낸 것으로

특정 메일이 위 사항을 위반했는지 확인해서 점수들을 부여하고, 이 점수들을 합산하여 스팸으로 평가한다.

위 리스트 중에 메일 본문에 "dear winner"란 글자가 있으면 3.099의 점수를 부여 받는다는 것을 알 수 있다.

앞서 SpamAssassin 설정에서 기준 점수를 2점으로 지정했으니 "dear winner"를 입력하면 스팸 메일로 처리할 수 있다.

 

이 문장을 포함한 메일을 메일서버나 스팸 서버에서 수신하도록 하면 되는데, 도메인을 등록하고 MX 레코드등을 지정하지 않으면 메일을 수신할 수 없다.

이 문제 때문에 스팸 서버 설치만 있고 테스트가 없는 것 같은데,

여기에서는 스팸 서버로 수신하는 것이 아니고, 송신하는 방식으로 테스트 한다.

스팸 서버는 송신을 하던 수신을 하던, 스팸 여부를 확인하기 때문이다.

그리고, Apache James에서 정리한 것과 같이 메일을  송신하는 것은 별도의 도메인이나 MX 레코드등을 지정하지 않아도 가능하기 때문이다.

 

Postfix와 SpamAssassin이 잘 실행되었으면 (스팸 서버가 구축되었으면), 실제로 메일을 보내기 위해 텔넷으로 이 스팸(?)서버에 접속한다.

        > telnet localhost 25

Postfix등 메일 서버는 기본적으로 25번 포트를 사용한다.

 

텔넷 접속후 다음 내용을 순서데로 입력한다.

ehlo aaa
mail from:<gujc1@forest71.com>
rcpt to:<gujc~~~@gmail.com>
data
subject:dear winner

dear winner

.

ehlo는 메일을 보내겠다고 Postfix에 알리는 것으로 아무 값(aaa)이나 지정하면 된다.

메일을 보내는 사람(from)과 받는 사람(to)을 입력한다.

보내는 사람은(from) 아무 값이나 입력해도 되다.

아무 값이나 입력해도 되기 때문에 스팸 발송자들이 다양하게(?) 활용한다.

받는 사람은(to) 메일을 받아야 하기 때문에 실제 사용하는 계정을 지정한다.

data를 지정하고 엔터키를 치면 메일 제목(subject)과 본문을 입력할 수 있다.

제목(subject)을 입력한 뒤에는 빈 라인 하나를 입력해야 제목(subject)으로 인식된다.

그렇지 않으면 본문으로 처리되어 제목없는 메일이 발송된다.

본문까지 입력한 뒤에는 점(.)을 입력하고 엔터키를 쳐서 다음과 같이 메일을 발송한다.

 

여기에서는 gmail로 메일을 보냈으니 gmail에 접속해서 보낸 메일을 확인한다.

대부분 스팸 메일함에 있을 텐데, SpamAssassin 때문이 아니고, 구글의 스팸 서버가 그렇게 처리한 것이다.

위 그림과 같이 메일 제목에 [SPAM]이 붙은 것을 볼 수 있다.

일반적인 문장으로 보내면 [SPAM]이라는 문자열이 없다.

위 메일은 메일을 보낼때 SpamAssassin이 스팸으로 판단해서 메일 제목에 붙인 것으로, 앞서 설정한 SpamAssassin  설정에서 지정한 문자열이다.

 

그림 우측의 메뉴(점 3개)를 클릭해서 [원본보기]를 선택한다.

메일 보기 화면은 필요한 사항만 추출하여 잘 정리하여 보여주는 것이고, 실제 수신해서 저장한 EML 메일 내용은 다음과 같이 다양한 정보들을 포함하고 있다.

실행된 별창에서 스크롤을 내리면 다음과 같이  X-Spam~~으로 시작하는 메일 헤더들을 볼 수 있다.

생략 ~~~
Received: by localhost.localdomain (Postfix, from userid 1001) id 30AEC811148; Sat,
  9 Jan 2021 15:44:19 +0900 (KST)
X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on localhost.localdomain
X-Spam-Flag: YES
X-Spam-Level: ****
X-Spam-Status: Yes, score=4.5 required=2.0 tests=ALL_TRUSTED,DEAR_WINNER, DKIM_ADSP_NXDOMAIN,MISSING_HEADERS,NO_DNS_FOR_FROM,TVD_SPACE_RATIO autolearn=no autolearn_force=no version=3.4.0
X-Spam-Report: * -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP *
  0.8 DKIM_ADSP_NXDOMAIN No valid author signature and domain not in DNS *
  1.2 MISSING_HEADERS Missing To: header *
  3.1 DEAR_WINNER BODY: Spam with generic salutation of "dear winner" *
  0.4 NO_DNS_FOR_FROM DNS: Envelope sender has no MX or A DNS records *
  0.0 TVD_SPACE_RATIO No description available.
Received: from aaa (localhost [IPv6:::1]) by localhost.localdomain (Postfix) with ESMTP id 3DA12811149 for <gujc71@gmail.com>; Sat,
  9 Jan 2021 15:43:30 +0900 (KST)
subject: [SPAM] dear winner
Message-Id: <20210109064341.3DA12811149@localhost.localdomain>

메일을 발송하기 전에 SpamAssassin이  처리한 결과를 메일 헤더에 저장한 것으로

X-Spam-Status에 기준값이(required) 2인데, 이 메일은 4.5 (score)이기 때문에 스팸(yes)이라고 저장되어 있다.

X-Spam-Report에는 어떻게 4.5점이 되었는지 이유가 정리되어 있다.

다른 이유도 있지만 "dear winner"가 3.1점으로 가장 큰 이유가 되었다.

 

이상으로 스팸 서버를 구축해서 테스트 하는 방법을 정리하였다.

메일을 수신하지 못하기 때문에 발신으로 테스트 하였지만, 실제 스팸 서버를 구축하고 수신으로 처리하여도 동일한 결과를 얻을 수 있다.

실제로 스팸 서버로 사용하기 위해 빠진 내용은 스팸 서버가 메일을 받아서 스팸 여부를 확인하고 나면 확인한 메일을 실제 메일서버로 전달(relay)한다.

또, 실제 메일 서버에서는 메일의 헤더를 확인하고 스팸이면 삭제하거나 해당 수신자의 스팸 메일함에 넣게 된다.

도메인 관련 설정도 필요하고 메일 서버도 정리해야 하기 때문에 메일서버로 전달(relay)하는 기능은 여기서 정리하지 않았고,

스팸 메일함에 저장하는 방법은 SpamAssassin을 스팸 필터로 사용하는 방법을 정리하는 부분에서 조금 정리하였다.


추가적으로 정리하지 못한 내용은 [한글] 메일에 대한 스팸 처리이다.

SpamAssassin은 베이지안(Bayesian) 알고리즘으로 스팸 메일을 학습해서 성능을 향상시킬 수 있다.

영어 메일은 학습해서 기본적인 규칙을 만들어 가지고 있지만, 한글에 대한 규칙은 제공되는 것이 없다 (못 찾은 것일 수도 있다).

한글 스팸 규칙을 만들기 위해서는 한글 스팸 메일들을 학습시켜야 하는데, 제법 많은 메일이 필요해서 테스트를 하지 못했다.

 

덧붙이는 글

한글 스팸 메일들을 SpamAssassin으로 학습시켜서 스팸 메일을 테스트하는 내용에 대해서 공유할 계획입니다.

자신의 메일 함에 있는, 또는 회사 스팸 서버에 있는 스팸 메일들을 공유해주시면 감사하겠습니다.

net_forest@hanmail.net 으로 보내주세요.

 

 

+ Recent posts