본문 바로가기

개발/서버

sendmail

기본 보안 설정

1. 설정파일 속성 변경

# chattr +i /etc/mail/sendmail.cf or /etc/sendmail.cf
# chattr +i /etc/mail/local-host-nameds
# chattr +i /etc/mail/aliases or /etc/aliases
# chattr +i /etc/mail/access

2. 스팸 방지를 위한 SMTP relay 인증발송
- /etc/mail/access 에서
spammer@test.com    (REJECT,OK,RELAY)
예)
211.115.89 RELAY -> 211.115.89 네트워크에 속하는 C클래스 허가
spam.com REJECT -> spam.com 도메인에 속한 모든 호스트 거부

makemap hash /etc/mail/access < /etc/mail/acces

- 발신전용 메일서버 일경우
스팸릴레이 방지 - dnl 부분을 해제
vi /etc/mail/sendmail.mc
48라인
dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

릴레이 서버 구성
[root@ns mail]# telnet localhost 25         
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 ns.smartflex.co.kr ESMTP Sendmail 8.13.8/8.13.8; Sat, 5 Nov 2011 05:42:28 +0900
ehlo localhost
250-ns.smartflex.co.kr Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP


릴레이서버 구성 안했을경우 
[root@ns mail]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 ns.smartflex.co.kr ESMTP
chlo localhost
500 5.5.1 Command unrecognized: "chlo localhost"
ehlo localhost
250-ns.smartflex.co.kr Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP
 

 
3. formmail 웹 app 취약성
-  ngrep(http://ngrep.sourceforge.net/) 또는 http://rpmfind.net/ rpm 다운로드
# ngrep –qi –c 80 port80
(포트80으로 보내지는 메일을 80칼럼으로 보여준다,
웹호스팅 서버에 폼메일로 과다하게 발생하는 메일추적)

4. sendmail.cf 보안설정
- 스팸릴레이 방지를 위한 인증발송

C{E}root
C{TrustAuthMech}LOGIN PLAIN CRAM-MD5 <<=========== 새로 추가된 라인

#O AuthMechanisms=GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5
O AuthMechanisms=LOGIN PLAIN GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5 <== 새로 추가된 라인

- O MaxMessageSize = 5024000  -> 밖으로 나가는메일의 메시지 크기설정
- Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|qSpfhn9, S=10/30 R=20/40 M=5024000, T=DNS………
- O MaxRecipientsPerMessage=20  -> 동보메일주소(최대수신자) * 기본무제한
- O SmtpGreetingMessage=$j welcome to HanMain.net™ -> 버전정보숨김
- O QueueDirectory=/var/spool/mqueue/q*  -> 다중큐 사용
- O Timeout.ident=0s  -> 인증데몬(응답속도 증가)
- O BadRcptThrottle=5 ( 없는유저로 발송되어진 메일이 오면 5번째후 1초동안중지 응답을 느리게 한다)


5. 인증되지 않은 사용자의 Sendmail Deamon사용을 제한하기

Sendmail에는 Anti-Spam Feature를 포함하고 있습니다. 
이 기능을 제대로 사용하기 위해서는 /etc/mail/sendmail.cf 또는 /etc/sendmail.cf파일에서 옵션을 바꾸어 주어야 합니다.

# privacy flags
O PrivacyOptions=authwarnings, goaway

Sendmail에서 goaway 옵션을 사용할 경우에 SMTP의 EXPN, VRFY명령어를 제한하게 됩니다. 이로 인해서 VERB명령어도 더불어 제한하게 됩니다. 처음 SMTP에 접하시는 분들은 이 명령어에 대해서 생소할 수 있으므로 약간의 설명을 덧붙이겠습니다. STMP에 접속하여서 MAIL을 전달하기 위해서는 여러 가지 명령어를 사용하게 되어 있습니다.
아래와 같이 접속 후 HELP 명령어를 타이핑하면 HELO, EHLO, MAIL, RCPT, DATA, RSET, NOOP, QUIT, HELP, VRFY, EXPN, VERB ETRN, DSN, AUTH, STARTTLS등의 사용 가능한 명령어를 보실 수 있습니다.

자세한 사용법과 내용은 HELP <Command>하시면 알 수 있습니다.
HELP AUTH <- 입력
214-2.0.0 AUTH mechanism [initial-response]
214-2.0.0 Start authentication.
214 2.0.0 End of HELP info

EXPN test <- 입력 (Mail list의 관계된 메일 계정을 보여줄 수 있는 명령어입니다.)
250 2.1.5 <test@smartflex.co.kr>
VRFY test <- 입력(Alias에 관계된 메일 계정을 보여줄 수 있는 명령어입니다.)
250 2.1.5 <test1@smartflex.co.kr>

보안설정 후에는 아래와 같은 메시지가 나타납니다.
EXPN test <- 입력
502 5.7.0 Sorry, we do not allow this operation


6. mailq command의 제한하기

/usr/bin/mailq 명령어를 제한하기 위해서는 
/etc/mail/sendmail.cf or/etc/sendmail.cf 파일에서 옵션을 바꾸어 주어야 합니다.
# privacy flags
O PrivacyOptions=authwarnings, goaway, restrictmailq

또한, queue디렉토리를 root권한으로 막아주고 재시작합니다.
#chmod 0700 /var/spool/mqueue
#/etc/rc.d/init.d/sendmail restart

mailq명령어를 실행시키면 아래와 같은 메시지가 나타납니다.
aroma$ mailq
You are not permited to see the queue


7. Queue 프로세스를 root권한으로 제한하기

Queue프로세스를 root권한으로 제한하기 위해서는 /etc/mail/sendmail.cf 또는 /etc/sendmail.cf파일에서 아래와 같이 옵션을 바꾸어 줍니다.
# privacy flags
O PrivacyOptions=authwarnings, goaway, restrictmailq, restrictqrun


파일을 저장후 재시작합니다.
#/etc/rc.d/init.d/sendmail restart

8. SMTP Greeting Message를 수정하기

Sendmail의 Version 정보라든지 여러 가지 이유로 Connected중에 보여주는 아래와 같은 메시지들을 바꾸어주므로, 불필요한 정보를 숨길 수 있습니다.
telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 ns.smartflex.co.kr ESMTP Sendmail 8.13.8/8.13.8; Sat, 5 Nov 2011 04:26:11 +0900


/etc/mail/sendmail.cf 또는 /etc/sendmail.cf파일에서 옵션을 바꾸어 주어야 합니다.
# SMTP initial login message (old $e macro)
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b

를 아래와 같이 수정
# SMTP initial login message (old $e macro)
O SmtpGreetingMessage=$j

파일을 저장후 Sendmail을 재시작합니다.
# /etc/rc.d/init.d/sendmail restart

수정후에는 아래와 같은 메시지가 출력됩니다.
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 ns.smartflex.co.kr ESMTP


9. 웹을 통해 발송되는 sendmail  스팸 대책 

1. 웹을 통해 임의로 발송 되는 메일들은 릴레이위치가 로컬클래스라서 MTA단계에서 클래스 제한이 불가능
2. yahoo  메일의 http://en.wikipedia.org/wiki/Captcha 으로 대체 

팁 . 
1. sendmail 을 호출하게 되면 다른 fake 프로그램이 뜹니다.
2. fake 프로그램은 stdin에서 들어오는 메일을 읽어봅니다.
3. fake 프로그램은 스팸어세신등의 스팸컨트롤툴을 이용해서 스팸인지 확인합니다.
4. 스팸이면 버리고 레포트 하고 스팸이 아니면 보냅니다.



설정1)  sendmail.cf는 m4를 사용해서 만들기
sendmail 소스 디렉토리
/tmp/sendmail-8.11.0/cf/cf 에 각 OS에 맞는 mc파일 확인
vi 에디터로 mc파일 생성
-----  linux.mc 내용 ---------

    divert(0)dnl
    VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')   
    OSTYPE(linux)dnl
    DOMAIN(generic)dnl
    MAILER(local)dnl
    MAILER(smtp)dnl
    FEATURE(`access_db', `dbm /etc/mail/access.db')
-----------------------------
 linux.mc 파일을 이용해서 sendmail.cf파일을 생성

# /tmp/sendmail-8.11.0/cf/cf$ m4 ../m4/cf.m4 linux.mc > sendmail.cf

 sendmail.cf를 /etc/mail에 복사한후  /etc/sendmail.cf를 /etc/mail/sendmail.cf로 심볼릭링크를 생성
 (ln -s /etc/mail/sendmail.cf /etc/sendmail.cf)

 
sendmail의 기본적인 명령어
 

▶ 메일 시스템의 Aliases 상태 
   - praliases
▶ rpm sendmail의 구동과 정지
   - /etc/rc.d/init.d/sendmail start
   - /etc/rc.d/init.d/sendmail stop 
▶ sendmail의 동작 확인
   - ps -aef | grep sendmail
     ( sendmail: accepting connections 이란 문구가 나오면 정상적으로 동작중이다. )

▶ mqueue에 있는 메일들 확인
   - mailq

▶ queue에 있는 메일들 강제로 보내기
   - /usr/sbin/sendmail -q

▶ mailer 통계
   - mailstats

▶ sendmail.cf 설정

   - #O MaxDaemonChildren=12 (앞의 주석을 제거 해주고 활성화 시킨다)

     O MaxDaemonChildren=30 ( 최대 sendmail프로세서가 생성할수 있는 프로세서의 숫자를 제한한  다. 프로세서숫자가 제한되면, 메일이 한번에 수발신 될 수 있는 양이 줄어들므로 DoS 공격이나 spam relay에 의해서 공격을 당했을 때 서버의 다운을 방지할 수 있다. 숫자는 임의 조정가능)


  -  O DaemonPortOptions=Port=smtp, Addr=127.0.0.1, Name=MTA

     O DaemonPortOptions=Port=smtp, Name=MTA or ( Addr=자신의 서버 아이피 ) 로 변경해 준  다. 이것을 하는 이유는 앞서서 이미 설명되었지만 기본 sendmail은 로컬에서만 메일이 수발신이 되어지도록 설정되어 있으므로 외부로 메일을 보내기 위해서 설정하는 것이다.


  -  #MaxMessageSize=1000000

      MaxMessageSize=1000000 ( 최대 전송할 수 있는 메일 사이즈의 값을 활성화 시킨다. 송수신   하는 메일의 양을 줄이는 것은 서버의 부하를 줄일 수 있는 방법 중 하나이다. 설정값은 변경가능 하다.)


  -  O Timeout.initial=2m

     O Timeout.connect=1m

     O Timeout.iconnect=1m

     O Timeout.helo=2m  (최적화에 관련된 부분들이다.)



- #O MaxRecipientsPerMessage=100

     O MaxRecipientsPerMessage=30 ( 한번에 메일 발송시 동시발송이(참조나 전달등) 가능한 메일계정의 수를 말하는 것으로 SMTP을 서비스 하는 곳에서는 동시발송을 하게 되면 그만큼 프로세서를 많이 쓰게 되므로 적절하게 조절해 주는 것이 좋다. )


  - #O QueueLA=8

    O QueueLA=8 ( 서버의 Load Average가 8이상 증가하게 되면, 부하를 줄이기 위해서 메일을 발송하지 않고 queue에 쌓아둔다. 후에 load가 낮아지면 발송을 재개한다. 숫자는 조절 가능)


  - #O RefuseLA=12

    O RefuseLA=12 ( 서버의 Load Average가 12이상 높아지게 되면, sendmail의 동작을 멈춘다.

       외부의 공격으로부터 서버가 다운되지 않도록 하기 위한 조치이다. 숫자는 조절 가능하다 )

'개발 > 서버' 카테고리의 다른 글

ipconfig /flushdns  (0) 2011.12.13
공개 네트워크 모니터링 툴 [Ethereal]  (0) 2011.12.13
vsftp  (0) 2011.12.05
아파치 모듈 추가하기 (apax)  (0) 2011.12.05
libqrencode  (0) 2011.11.15