BBUWOO'S [ LIKE UNIX ] WORLD Home > Lecture > Sendmail > Sendmail-6  

HOME
WHAT's BBUWOO?
LInux AnNyung
Open Source
    GitHUB
    GitHUB (for PHP)
LECTURE
MINI LECTURE
QnA BOARD
ENGLISH POEM


WARNNING

강좌의 모든 권리는 본인 김정균에게 있으며 이 강좌를 상업적 목적 으로 이용
하거나 다른 곳으로 옮길시에는 본인의 허락이 있어야 한다. 이글의 가장 최신글은
http://oops.org 에서 확인할수 있다.



8. SMTP 인증


필자가 생각하는 8.10 버젼의 변화중의 꽃이라고 생각 되는 기능이 바로 SMTP 인증 부분이다.(솔직히 기술적인 부분에서는 Multiple queues 가 더욱 꽃일지는 모르겠지만 내 입장에서는 .. --) 필자가 hosting server를 관리하면서 문의받던 질문중에서 거의 대부분이 왜 smtp서버를 자신의 도메인으로 사용을 하지 못하느냐는 질문이었다.

원래 아는 사람들은 다 알겠지만 smtp server는 자신이 사용하는 ISP의 mail server를 사용하는 것이 속도상 가장 빠르다. 하지만 이에 대한 전문 지식이 없는 사람들은 이것을 이해하지를 못한다. 그렇다고 모든 대역에 대해서 relay를 열어 주자니 SPMAER의 공략 대상이 뻔하고 그저 관리자는 속만 탈뿐이었다. 그저 NT의 exchange에서 지원하는 stmp 인증을 왜 sendmail에서는 지원을 하지 않을까.. 하는 한탄 뿐이었다.

각설하고 사용법을 알아 보자. compile시에 이 기능을 넣었다면셋팅상 필요한 것은 따로 없다. 또한 필자의 FTP 에 있는 sendmail-8.10.0-2kr 이상 버젼을 설치하였다면 기본으로 셋팅이 되어 있으니 그냥 사용을 하면 된다.

그럼 간단하게 현재 나의 smtp 에서 smtp auth 기능이 사용이 가능한지 부터 살펴 보도록 한다. 일단 가장 간단한 방법은 또는 sendmail.cf 에서

# list of authentication mechanisms
O AuthMechanisms=LOGIN PLAIN DIGEST-MD5 CRAM-MD5

라인의 주석이 풀려 있거나 또는 해당 라인이 설정이 있는지를 확인하면 된다. 보통 RedHat 7.x 부터는 smtp auth 기능이 지원이 되지만 여기서 논하는 login 방식이 아니라 pam 인증 방식을 지원한다. 여기서는 login 방식을 지원 설명할 것이다.

일단 안되어 있다고 판단이 된다면 다음을 따라 하도록 한다. 다음은 sendamil 8.10 이상 버젼이 설치 되어 있고, libsasl 또는 cyrus-sasl package 가 설치가 되어 있는 상황에서 sendmail auth 가 안된다면 되게 하는 방법이다. 일단 /etc/mail 에 보면 sendmail.mc 라는 파일이 있을 것이다. 이 파일에 다음의 내용을 기술하도록 한다.

dnl # These are the allowed auth mechanisms. To allow relaying for a user
dnl # that uses one of them, you must set TRUST_AUTH_MECH.
define(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
dnl # These are the SMTP auth mechanisms which, if used,
dnl # Sendmail will allow relaying for. 
TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl

그리고 sendamil.cf file 을 다시 생성하면 된다. 단 주의 할것은 rpm 으로 설치를 했고 sendmail.mc 를 이용하여 sendmail.cf 를 다시 생성할 경우에는 sendmail-cf package 가 설치가 되어 있어야 한다.

일단 수정한 sendmail.mc 는 다음과 같다. 물론 조금식 틀릴수는 있지만 패키징 시에 넣은 옵션들에 따라 조금씩 차이가 날것이다.



 Hanterm - cat /etc/mail/sendmail.mc

 [root@oops mail]# cat sendmail.mc

  divert(-1)
  dnl This is the macro config file used to generate the /etc/sendmail.cf
  dnl file. If you modify thei file you will have to regenerate the
  dnl /etc/sendmail.cf by running this macro config through the m4
  dnl preprocessor:
  dnl
  dnl        m4 /etc/sendmail.mc > /etc/sendmail.cf
  dnl
  dnl You will need to have the sendmail-cf package installed for this to
  dnl work.
  include(`/usr/lib/sendmail-cf/m4/cf.m4')

 위의 라인의 path 를 주의하자. RH 7.x 의 경우에는 아마 m4 file 의 위치가
 /usr/share/sendmail-cf/m4/cf.m4 에 위치할 것이다.  나도 정확하게 기억은
 안나니 알아서 위의 경로를 확인하기 바란다.

  define(`confDEF_USER_ID',``8:12'')
  OSTYPE(`linux')
  undefine(`UUCP_RELAY')
  undefine(`BITNET_RELAY')
  define(`confAUTO_REBUILD')
  dnl #
  dnl # These are the allowed auth mechanisms. To allow relaying for a user
  dnl # that uses one of them, you must set TRUST_AUTH_MECH.
  define(`confAUTH_MECHANISMS', `LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
  dnl # These are the SMTP auth mechanisms which, if used,
  dnl # Sendmail will allow relaying for. 
  TRUST_AUTH_MECH(`LOGIN PLAIN DIGEST-MD5 CRAM-MD5')dnl
  dnl #
  define(`confTO_CONNECT', `1m')
  define(`confTRY_NULL_MX_LIST',true)
  define(`confDONT_PROBE_INTERFACES',true)
  define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')
  dnl Security improvement by disallowing VRFY, EXPN
  define(`confPRIVACY_FLAGS',`authwarnings,needmailhelo,novrfy,noexpn')dnl
  FEATURE(`smrsh',`/usr/sbin/smrsh')
  FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable')
  FEATURE(redirect)
  FEATURE(always_add_domain)
  FEATURE(use_cw_file)
  FEATURE(local_procmail)
  MAILER(smtp)
  MAILER(procmail)
  FEATURE(`access_db')
  FEATURE(`blacklist_recipients')
  dnl We strongly recommend to comment this one out if you want to protect
  dnl yourself from spam. However, the laptop and users on computers that do
  dnl not hav 24x7 DNS do need this.
  FEATURE(`accept_unresolvable_domains')
  dnl FEATURE(`relay_based_on_MX')
  dnl To use multiple queue feature of 8.10.x
  define(QUEUE_DIR,`/var/spool/mqueue/q*')
  dnl change Statistics file name from statistics to sendmail.st
  define(STATUS_FILE, `sendmail.st')
  dnl OOPS

 [root@oops mail]# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

 위의 명령을 이용하여 sendmail.cf 를 새로 생성을 할수 있다.

 [root@oops mail]



위의 sendmail.mc 내용 다음의 명령을 실행하면 sendmail.cf 가 새로 생성이 되게 된다. 다시 주의를 하건만 m4 명령을 이용하여 sendmail.cf 를 새로 생성할 경우 sendmail-cf package 가 설치 되어 있어야 한다는 것이다. (물론 이는 rpm package 로 sendmail 이 이미 설치 되어 있는 경우이다.)

다음은 sasl 에서 auth 의 방식을 지정하도록 한다. 일단 sasl 은 libsasl 또는 cyrus-sasl 이라는 이름으로 설치가 되어 있을 것이다. 만약 이 두패키지가 설치 되어 있지 않다면 sendmail 을 처음부터 다시 설치해 줘야 한다.

일단 rpm -qa | grep Sendmail.conf 명령을 실행 하여 Sendmail.conf 를 찾아서 다음의 내용을 삽입한다.

pwcheck_method: shadow

Sendmail.conf 가 존재하지 않을 경우에는 /usr/lib/sasl 이라는 directory 가 존재하면 /usr/lib/sasl/Sendmail.conf 를 생성하여 위의 내용을 넣어주면 된다. 그리고 sendmail 을 재시작 한다. (필자가 패키징한 sendmail 을 설치하면 위의 부분이 shadow 가 아니라 pam 으로 되어 있을 것이다. 이건 다른 기능을 추가했기 때문에 pam 으로 설정을 한 것이다. 위의 것이 shadow 이든 pam 이든 크게 문제가 될 것은 없다.)

그럼 운영하는 방법에 대해서 보도록 하겠다. sendmail에서 smtp server로 사용을 하기 위해서는 /etc/mai/access 에서 해당 대역에 대하여 RELAY를 허용을 해 줘야 한다. 하지만 smtp auth 기능이 정의가 되어 있으면 access에서 설정을 할 필요 없이 (이것은 RELAY설정을 안해 줘도 된다는 뜻이지 access file에서 REJECT로 막아서는 안된다는 의미이다) client side에서 mail client에서 설정만 해 주면 된다. 그럼 Netscape Mailer와 Outlook Express에서의 설정을 보도록 하자.

  • Netscpae mailer

    에서 Outgoing mail server user name 에 계정유저를 적어 주고 SSL 모드는 If Possible 로 잡아 주면 된다. 물론 Plain도 가능하다. 그리고 메일을 보내면 인증 창이 뜨게 되며 여기에 계정 name과 계정 password로 login을 하면 된다.

  • Outlook Express 98

    에서 "인증 필요"에 체크를 하고 옆의 "설정"을 클릭한후 로그온 정보에 계정 ID를 넣면 된다. 그리고 보안암호인증을 사용하여 로그온은 선택하면 안된다 ^^; Plain으로 해야 한다.

그럼 다음은 간단하게 sendmail에서 smtp auth기능이 제대로 작동을 하는지 살펴 보도록 한다. 붉은색 글자는 필자가 typing을 한 것이다.



 Hanterm - telnet localhost 25

[root@oops mail]# telnet localhost 25

 Trying 127.0.0.1...
 Connected to localhost.
 Escape character is '^]'.
 220 oops.org ESMTP Sendmail 8.10.0/8.10.0; Tue, 4 Apr 2000 15:31:05 +0900  
 ehlo localhost
 250-oops.org Hello localhost [127.0.0.1], pleased to meet you
 250-ENHANCEDSTATUSCODES
 250-EXPN
 250-VERB
 250-8BITMIME
 250-SIZE
 250-DSN
 250-ONEX
 250-ETRN
 250-XUSR
 250-AUTH LOGIN PLAIN
 250 HELP
 quit
 221 2.0.0 oops.org closing connection
 Connection closed by foreign host.

 [root@oops etc]# 



위에서 흰색 굵은 글자로 AUTH LOGIN PLAIN이 나오면 Plain 방식의 login이 가능하다는 의미이다. 물론 compile시에 어떠한 방식으로 하느냐에 따라 달라 지므로 꼭 위와같은 결과가 나오리라는 법은 없지만 어떠한 형태로든 auth와 비슷한 문구는 나와야 한다는 것을 알아야 한다.

자, 그럼 실제로 sendmail auth 가 작동하는지를 테스트 하는 것은 아래의 과정으로 테스트를 할 수가 있다.



 Hanterm - telnet localhost 25

 [root@oops mail]# php -r 'echo base64_encode("user")."\n";'
 dXNlcg==

 [root@oops mail]# php -r 'echo base64_encode("password")."\n";'
 cGFzc3dvcmQ=

 [root@oops mail]# telnet localhost 25

 Trying 127.0.0.1...
 Connected to localhost.
 Escape character is '^]'.
 220 work.oops.org ESMTP Sendmail 8.12.9/8.12.9; Sat, 23 Aug 2003 01:27:54 +0900
 AUTH LOGIN
 334 VXNlcm5hbWU6
 dXNlcg==
 334 UGFzc3dvcmQ6
 cGFzc3dvcmQ=
 235 2.0.0 OK Authenticated
 quit
 221 2.0.0 work.oops.org closing connection
 Connection closed by foreign host.

 [root@oops mail]#

sendmail auth 에서의 인증시 user name 과 password 는 base64 encoding 이 된 값을 이용해야 한다. 즉 위의 과정에서 처음 php 를 실행하는 것이 유저명과 패스워드의 base64 인코딩 값을 구하는 과정이며, 25번 포트로 접속을 한 부분에서 붉은색 글씨 부분이 바로 유저명과 패시워드를 입력하는 부분이다. 패스워드를 넣은 후에,

235 2.0.0 OK Authenticated

메세지가 나온다면 인증에 성공을 한 것이다.

이 외에도 25번 port로 직접 login하여 사용을 하는 명령들은 [ 여기 ] 를 참조 하도록 한다.



9. SSL + Sendamil



smtp auth 기능을 사용하기 위해서는 libsasl 과 openssl 을 연동을 하게 된다. 덕분에 TLS/TTS 를 이용하여 패킷을 암호화 하여 보낼수가 있다. 하지만 아쉽게도 우리가 가장 많이 사용하는 mail agent 인 OutLook 과 Netscape mail agent 의 경우에는 libsasl 에서 제공하는 암호화가 지원이 되지 않는다.

결국 패킷을 암호화 하여 사용을 하려면 또다른 프로그램의 도움을 받아야 한다. 그 대표적인 프로그램이 바로 sslwrap 과 stunnel 이 있다. 필자의 홈페이지에서는 sslwrap 을 이용하여 sendmail 과 ssl 을 연동시키는 방법을 제시하고 있다. 필자의 강좌란에서 [ Secure TCP with SSLWRAP ] 강좌를 참조 하도록 하라.



>> 이전 : local-host-names & DNS
>> 다음 : CF 문법을 이용한 SPAM Mail 차단



    



 Home > Lecture > Sendmail > Sendmail-6

Copyright 1997-2021 JoungKyun Kim 
LAST MODIFIED: 2017/01/18