강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

SMTP 인증을 통한 Relay 문제 해결

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

SMTP 인증을 통한 Relay 문제 해결

 

서버를 운영할 때 만나게 되는 문제 중 하나는 보내는 메일 서버(SMTP)의 구성이다


회사면 회사, 조직이면 조직 내 구성원들에게 SMTP를 제공하여야 하는데, 잘못 설정할 경우에는 스팸 메일 발송의 경유지가 되어 심각한 문제를 유발할 수 있기 때문이다.


 전통적으로 가장 많은 사용자층을 확보하고 있는 sendmail을 이용하여 보내는 메일서버(SMTP) 서비스를 제공하려면 허용하고자 하는 사용자에 대해 relay를 허용해 주어야 하는데, 이는 클라이언트의 ip 또는 ip 대역으로 인증하는 방법과 아이디/암호로 인증하는 등의 방법이 있을 수 있다



이들 각각의 방법은 다음과 같은 장단점이 있다.

 

* 오직 고정 ip를 사용하는 회사 내에서만 메일을 발송하도록 할 경우에는 ip로 인증하는 것이 편하다.

 

* SMTP를 사용하여야 할 유저의 ip가 정해지지 않거나 유동 ip인 경우에는 아이디/암호로 인증하는 것이 효과적이다.

 

* 또한 최근과 같이 웜 바이러스가 기승을 부리는 경우에도 고려해 보아야 하는데. 만약 ip 로 인증되어 있는 환경에서 인증된 pc가 웜 바이러스에 감염되었을 경우 아무런 제한 없 이 바이러스 메일이 SMTP를 통해 발송되지만, 아이디/암호로 인증하였을 경우에는 SMTP 서버로 바이러스 메일이 발송 시도는 하지만 relay가 거부된다.

 

따라서 아이디/암호를 이용한 SMTP AUTH 방법이 최근에는 자주 사용되고 있다.

 

3.1.1 SMTP AUTH 설정방법

 

먼저 현재 시스템의 배포판이 레드햇 계열이고 sendmail이 설치되어 있는지 확인한다.

 

# cat /proc/version 또는 cat /etc/redhat-release

Linux version 2.6.18-53.1.13.el5 (mockbuild@builder6.centos.org) (gcc version 4.1.2 20070626 (Red Hat 4.1.2-14)) #1 SMP Tue Feb

# rpm -q sendmail

sendmail-8.13.8-2.el5

 

위의 예의 결과에서 보듯이 RHEL5기반의 centos 배포판에 sendmail 8.13.8인 것을 알 수 있다.

 

SMTP AUTH를 제공하기 위해서는 sendmail.cf 파일을 다시 생성하여야 한다


이를 위해 먼저 /etc/mail/sendmail.mc 파일을 열어 아래와 같이 두 줄의 앞부분에 있는 dnl을 삭제한다. 앞의 dnl은 일종의 주석이라고 생각하면 된다.

 

변경 전)

dnl define(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl

dnl TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl

 

변경 후)

define(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl

TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl

이후 m4를 이용하여 sendmail.cf를 다시 생성한다.

# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

 

이후 sendmail을 재가동하여 해당 서버의 25번 포트로 접속하여 정상적으로 SMTP 인증이 되는지 확인하면 되는데, 25번으로 telnet 접속을 한 후 아래와 같이 "ehlo localhost"와 같이 입력하였을 때 “AUTH LOGIN PLAIN”이라는 메시지가 보이면 된다.

 

sendmailSMTP 인증을 제공하지 않는 경우

 

# telnet server.com 25

Trying 192.168.3.4...

Connected to server.com (192.168.3.4).

Escape character is '^]'.

220 www.server.com ESMTP

ehlo localhost <-- ehlo localhost 입력

250-www.server.com Hello [192.168.3.4], pleased to meet you

250-ENHANCEDSTATUSCODES

250-8BITMIME

250-SIZE

250-DSN

250-ONEX

250-ETRN

250-XUSR

250 HELP

 

sendmailSMTP 인증을 제공하는 경우

 

# telnet server.com 25

Trying 192.168.3.4...

Connected to server.com (192.168.3.4).

Escape character is '^]'.

220 www.server.com ESMTP

ehlo localhost <-- ehlo localhost 입력

250-www.server.com Hello [192.168.3.4], pleased to meet you

250-ENHANCEDSTATUSCODES

250-8BITMIME

250-SIZE 7000000

250-DSN

250-ONEX

250-ETRN

250-XUSR

250-AUTH LOGIN PLAIN <-- 이 부분이 있어야 한다.

250 HELP

 

 

그리고 인증을 담당하고 있는 데몬은 cyrus-sasl(Simple Authentication and Security Layer)를 아래와 같이 가동하도록 한다.

# /etc/rc.d/init.d/saslauthd start

 

새롭게 생성된 sendmail.cf 파일에서 몇 가지를 추가 설정하여 변경 하면 된다.

 

이후 sendmail을 재가동하여 25/tcp에서 리슨하고 있는지 확인하기 바란다.

 



3.1.2 메일 서버의 릴레이 체크

 

만일 관리하는 서버 중 특정 서버의 릴레이가 허용되어 스팸 메일의 중간 경유지로 악용될 경우 이로 인한 피해는 단지 해당 스팸 메일의 수신자뿐만 아니라 경유지로 악용된 서버에게 다음과 같은 직접적인 피해를 유발하게 된다.

 

과도한 스팸 메일 발송으로 인한 서버 성능 저하

 

과도한 메일 발송 또는 리턴 메일 수신으로 인하여 서버의 CPUMemory를 많이 소모하므로 서버의 성능이 급격하게 저하되고 심할 경우 시스템이 다운될 수도 있다.

 

스팸 메일 발송으로 인한 과도한 DNS Query 발생

 

메일을 송수신 할 때마다 많은 DNS Query를 유발하므로 해당 서버가 참조하고 있는 DNS 서버(통상적으로 IDCISP에서 제공하는 DNS 서버)에 과도한 부하가 유발될 수 있다.

 

불필요한 트래픽 유발로 인한 비용 증가

 

스팸 메일 발송으로 인한 해당 ip 또는 ip 대역 차단 가능성

 

스팸 메일이 발송되면 발송된 ip 뿐만 아니라 심지어는 속해있는 ip 대역까지 전체가 차단되어 선의의 피해가 유발될 수 있으며 일단 spamhaus.org와 같은 Black list에 등록되면 해제하기가 쉽지 않다.

 

최근에는 릴레이가 허용된 서버가 거의 없지만 관리상의 실수로 허용될 수도 있으니

자신의 메일 서버에 릴레이가 허용되어 있지는 않은지 점검하는 것이 좋다. 만약 특정한

서버에서 릴레이가 허용되어 있는지 여부는 아래의 URL에 접속하여 체크하도록 한다.

 

http://www.antispam-ufrj.pads.ufrj.br/test-relay.html

 

그러나 관리하는 서버가 여러 대인 경우 특정 대역의 릴레이 여부를 한꺼번에 체크하여야 할 필요가 있는데, 이러한 경우에는 다음과 같은 방법을 이용하면 된다.

 

먼저 http://david.weekly.org/code/relaycheck.txt 파일을 다운로드 받아 relaycheck.pl로 이름을 변경 후 700등의 퍼미션으로 조정하여 서버에서 다음과 같이 실행한다.

 

형식 : ./relaycheck.pl C Class ip 대역

실행 예 : 아래의 경우 192.168.64.0/24 대역을 조회한다.

 

# ./relaycheck.pl 192.168.64

relaycheck v0.3 by dave weekly <dew@cs.stanford.edu>

 

Expanding class C 192.168.64

SMTP host 192.168.64.82 [erp] does not relay.

SMTP host 192.168.64.84 [lywin] does not relay.

SMTP host 192.168.64.116 [test.server.com] does not relay.

SMTP host 192.168.64.115 [web1.server.com] does not relay.

SMTP host 192.168.64.123 [web2.server.com] does not relay.

SMTP host 192.168.64.60 [synsmex] does not relay.

SMTP host 192.168.64.214 [intranet] relays.

.......

 

만약 릴레이가 허용된 서버만을 보고 싶다면

./relaycheck.pl ip대역|grep -v "does not"으로 검색하면 될 것이다. 또는 위의 스크립트를 cron에 두어 정기적으로(이를테면 매주 월요일) 실행하도록 하여 만약 릴레이가 허용된 서버를 발견하면 자동으로 해당 정보를 관리자메일로 발송되도록 하면 유용할 것이다


아래는 필자가 사용하는 스크립트인데 192.168.0.0/24 대역을 스캔하여 릴레이가 허용된 서버가 있으면 메일로 통보하도록 한 간단한 스크립트이다.

 

#!/usr/bin/perl

 

$TO_MAIL = 'antihong@gmail.com';

$SUBJECT = "[경고] Relay Allowed";

$MAIL_PROGRAM = "/usr/sbin/sendmail";

 

for($i=1;$i<=254;++$i){

$TASKS[$i] = `./relaycheck.pl 192.168.0.$i`;

if ($TASKS[$i] =~ /relays/){

&scan_print;

}

}

 

sub scan_print {

open(MAIL, "|$MAIL_PROGRAM -t");

print MAIL "To: $TO_MAIL \n";

print MAIL "Subject: $SUBJECT \n";

print MAIL "Content-type: text/html\n\n";

print MAIL "<p>\n";

print MAIL "SMTP RELAY Allowed <b>192.168.0.$i</b> Server\n";

close(MAIL);

}

 

, 위의 스크립트를 주기적으로 실행되도록 cron에 넣어두면 relay가 허용된 서버가 존재할 경우에 관리자 메일로 그 사실을 알려주게 된다.

 


3.1.3 sendmail.cf 보안 설정

 

sendmail의 주 설정파일인 sendmail.cf 설정을 변경함으로써 몇 가지 간단한 보안 설정을 할 수 있다.

 

보내고 받는 메일의 양(사이즈) 제한하는 방법

 

sendmail은 로컬에서 외부로 메일을 발송하는 보내는 메일서버로서의 기능도 있지만 외부에서 서버 내 계정으로 전송되는 메일을 받아서 메일 박스에 저장하는 기능도 있다. 이때 기본적으로는 보내거나 받는 메일의 양에 대한 제한이 전혀 없어 10메가 이상이 넘는 큰 사이즈의 메일이 다량 송수신 될 경우 서버의 디스크 부족을 유발하거나 과부하가 걸릴 수 있으므로 아래와 같이 각각의 설정(보내는 메일과 받는 메일의 양)을 적절히 제한하는 것이 좋다.

 

* SMTP 서버에서 보내는 양 제한하는 법

/etc/mail/sendmail.cf (또는 /etc/sendmail.cf. 이는 sendmail의 패키징 방법에 따라 다르다.) 파일에서 다음과 같이 MaxMessageSize 부분의 주석을 제거하고 제한하고자 하는 적절한 값을 입력한다.

 

# maximum message size

O MaxMessageSize=5024000

 

위와 같이 설정하였을 경우 현재의 서버를 보내는 메일 서버로 이용할 때 첨부 파일이 5M 이상 초과하거나 웹에서 /usr/sbin/sendmail을 실행하여 외부로 메일을 발송하는 메일링 리스트 등의 프로그램에서도 메일 발송시 5메가 이상의 메일은 보낼 수 없게 된다.


5024000byte 단위이며 설정 변경 후 변경된 내용을 적용하려면 killall HUP sendmail sendmail 데몬을 refresh하면 된다. 만약 지정한 사이즈를 초과하였을 경우에는 아래와 같은 메시지가 보이게 된다.

 

Sep 30 19:42:57 smtp sendmail[19413]: i8UAgtpn019413: message size (7233231) exceeds maximum (5024000)

 

* 받는 메일 서버에서 받는 양 제한하는 법

 

외부에서 서버로 들어오는 메일에 대해서 용량을 제한하고 싶다면 같은 파일(sendmail.cf) 에서 "Local and Program Mailer specification" 부분을 설정 해주면 된다.

 

Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=10/30,

R=20/40, M=5024000, T=DNS/RFC822/X-Unix, A=procmail -Y -a $h -d $u


위와 같이 T=DNS/RFC822/X-Unix 앞부분에 M=5024000 부분을 추가 해주면 된다.


마찬가지로 5024000byte 단위이며 각자의 시스템 환경에 따라 원하는 용량만큼 적절히 설정 해주면 된다. 역시 설정 변경 후 sendmail을 재가동해 주면 적용이 된다.

 

위의 경우 서버에서는 5메가 이상의 메일은 수신하지 않으며 5메가 이상의 메일을 보낸 이는 아래와 같은 에러 메시지를 회신 받게 된다.


552 5.2.3 Message is too large; 5024000 bytes max

554 5.0.0 Service unavailable

 

동시에 발송 가능한 메일의 개수 제한방법

 

sendmail.cf 파일을 보면

# maximum number of recipients per SMTP envelope

O MaxRecipientsPerMessage=20

 

와 같은 부분이 있는데, 이 부분은 한 번에 메일 발송 시 동시 발송(참조 발송)이 가능한 메일 계정의 수를 뜻하는 것으로 SMTP 서비스를 제공한다면 이 설정을 적용하는 것이 좋다


기본적으로 이 값의 제한이 없으므로 먼저 주석을 제거한 후 적절한 값을 설정해 주면 한 번에 동시 발송 가능한 메일의 수를 제한할 수 있다. (위의 경우에는 한 번에 참조 발송이 가능한 메일 유저를 20명으로 제한)

 

설정이 끝난 후에는 killall HUP sendmailsendmail을 재가동해주면 적용된다. 만약 지정한 동시 발송수를 초과하였을 경우에는 아래와 같은 메시지가 보이게 된다.

 

Sep 30 19:48:58 cofw sendmail[19459]: i8UAmweo019459: Too many recipients

 


메일 용량 쿼터 설정방법

 

각 유저의 홈페이지 공간에 대한 쿼터 설정 방법은 잘 알고 있는데, sendmail 제공시 메일 용량 쿼터에 대한 설정은 잘 모르는 경우가 많이 있다


메일 쿼터에 대한 설정은 다소 어려워 보이지만 의외로 설정은 간단하다. 기본적으로 각 유저의 메일은 /var/spool/mail/ 디렉토리에 자신의 계정 소유로 저장이 되게 되는데, 바로 이 특성을 이용하여 쿼터 설정을 하면 된다


, 쿼터는 각 파일 시스템별로 별도의 설정이 가능하므로 각 유저의 홈 디렉토리 외에 /var 파티션에도 추가적으로 쿼터를 설정하면 되는 것이다. 쿼터를 설정하는 방법은 일반적인 방법과 동일하다


먼저 /etc/fstab 파일을 열어 /var 파티션이 별도로 설정되어 있다면 /var 파티션에, 별도로 없으면 / 파티션에 유저쿼터나 또는 그룹쿼터 설정을 하면 된다.


 

/dev/sda1 /home ext3 defaults,usrquota=/home/.quota

/dev/sda8 /var ext3 defaults,usrquota=/var/.mailquota


위에서는 /home 파티션에도 쿼터 설정을 하고, /var 파티션에도 쿼터를 설정한 예를 볼 수 있다.


 이후 “touch /home/.quota” “touch /var/.mailquota”로 사이즈가 0인 파일을 각각 생성한 후 “quotacheck a”를 실행하면 파일 시스템을 스캔하고, 디스크 사용량을 체크하여 해당 파일에 정보를 저장한다.

 

edquota user를 실행하면

/dev/sda1: blocks in use: 0, limits (soft = 99980, hard = 99980)

inodes in use: 0, limits (soft = 0, hard = 0)

/dev/sda8: blocks in use: 0, limits (soft = 29980, hard = 29980)

inodes in use: 0, limits (soft = 0, hard = 0)

 

위와 같이 쿼터 설정내역이 나오는데, 여기에서 /dev/sda1/home/ 디렉토리에 대한 쿼터 설정이고, /dev/sda8/var/ 디렉토리에 대한 쿼터 설정이다.


 위 설정으로 각각 /home 디렉토리에는 100메가로, 메일 용량은 30메가로 총 130메가를 할당하여 쿼터를 설정한 것을 알 수 있다


만약 별도의 /var 파티션과 /home 파티션이 없이 / 파티션만 있으면 /100 메가로 쿼터 설정을 했을 경우, 이 용량은 홈페이지의 용량과 메일 용량을 합쳐서 100메가로 적용이 되므로 주의하여야 한다


만약 쿼터가 초과되면 로그파일에는 local mailer (/usr/bin/procmail) exited with EX_TEMPFAIL와 같은 메시지가 출력된다.

버전 정보 변경

 

sendmail이 리슨하고 있는 25번으로 접속하면 아래와 같이 sendmail의 버전 정보를 알 수 있는데, 이는 굳이 보여줄 필요가 없으므로 이 정보를 삭제하거나 다른 정보로 보여주도록 하는 것이 좋다.

 

# telnet mail.server.com. 25

Trying 192.168.1.11...

Connected to mail.server.com..

Escape character is '^]'.

220 mail02.server.com ESMTP Sendmail 8.11.6/8.11.6; Thu, 30 Sep 2004 19:59:23 +0900

 

이를 위해서는 아래와 같이 주석을 제거한 후 관련 부분을 삭제하거나 임의의 문자열을 추가한 후 sendmail을 재가동하도록 한다.

 

변경 전)

# SMTP initial login message (old $e macro)

#O SmtpGreetingMessage=$j Sendmail $v/$Z; $b

 

변경 후)

# SMTP initial login message (old $e macro)

O SmtpGreetingMessage=$j 또는 임의의 문자열

 

재가동한 후에는 아래와 같이 버전 정보가 보이지 않게 된다.


# telnet mail.server.com. 25

Trying 192.168.1.11...

Connected to mail.server.com..

Escape character is '^]'.

220 mail02.server.com ESMTP


그러나 이 상태에서 HELP를 입력하면 버전 정보를 알 수는 있는데, 만약 이 때 보이는 버전 정보까지 변경하려면 소스파일에서 직접 수정하여야 한다.


# telnet mail.sever.com 25

Trying 192.168.1.11...

Connected to mail.server.com..

Escape character is '^]'.

220 mail02.server.com ESMTP

HELP

502 5.3.0 Sendmail 8.13.8 -- HELP not implemented


그리고 /etc/mail/helpfile이 있을 경우 HELP를 입력하면 사용할 수 있는 명령어에 대한 설명이 나와 불필요한 정보를 제공하므로 삭제하도록 한다


삭제하면 위와 같이 도움말 대신 “HELP not implemented”라는 메시지가 나오게 된다.



관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,159 명
  • 현재 강좌수 :  36,520 개
  • 현재 접속자 :  246 명