[메일] sendmail.cf 문법을 이용해서 spam 막기

* 이는 oops.org 에 김정균님이 강의하신 sendmail 의 강의 내용중의 일부 입니다.

(원래 옮기면 안되는 것인데..좋은 내용이다 보니..별도의 허락은 받지 못했습니다.

시스밍 친구들 ~~ 꼬 바르면 안되요~^^;;;)

10. CF 문법을 이용한 SPAM Mail 차단

이 문서는 이미 문제화가 되어 왔던 spam mail을 차단하기 위한 방법을 기술해 보고자

한다. spam은 메일의 헤더를 판단하여 spam여부를 가릴수 있는 룰을 생 성하여 거부를

할수 있으며 header의 모든 항목을 사용할수가 있다. 또한 이를 이용하면 virus mail

역시 체크를 할수가 있다.

일단 간단하게 메일 제목을 filtering하여 포르노 스팸메일을 막아 보자.

작업 은 sendamil.cf 의 가장 마지막 부분에 다음의 내용을 attach하는 것으로 한다

Hanterm – cat /etc/mail/sendmail.cf

[root@oops /etc/mail]# cat sendamil.cf

  .. 생략 ..

  ##############################################

  ########    Porno spam mail filter    ########

  ##############################################

  HSubject: $>check_subject

  D{DENYPORN} “Deny porno spam mail. if not, plez email admins@$j”

  Scheck_subject

  R$*PORN$*        $#error $: 550 ${DENYPRON}

  R$*STAR$*        $#error $: 550 ${DENYPRON}

  R$*PORNO$*        $#error $: 550 ${DENYPRON}

  R$*STARS$*        $#error $: 550 ${DENYPRON}

  R$*STRIP$*        $#error $: 550 ${DENYPRON}

  R$*STRIPER$*        $#error $: 550 ${DENYPRON}

  .. 생략 ..

[root@oops /etc/mai]#

일단 메일 제목을 이용한 filtering은 위의 공식을 이용할수가 있다. 위의 경우는 메일 제목

에 PORN, PORNO, STAR, STARS, STRIP, STRIPS 라는 단어(대소문자 무시)가 포함되어

있을 경우 “Deny porno spam mail. if not, plez email admins@hostname” 이라는

에러

메세지를 첨부하여 리턴을 시키게 된다.

그럼 하나씩 분석을 해 보도록 하자.

1. HSubject: $>check_subject

제일 앞의 H는 header를 의미한다. 즉 Header에서 Subject: 부분을 check_subject로

정의한다.

2. D{DENYPORN} “Deny porno spam mail. if not, plez email admins@$j”

제일 앞의 D는 매크로를 의미한다. 위의 라인은 ${DENYPORN} 이라는 macro에

Deny porno spam mail. if not, plez email admins@$j 라는 내용을 넣어둔다.

변수를 정의하고 변수의 값을 할당한다고 생각해도 되겠다.

제일 마지막의 $j는 sendmail이 예약한 macro로서 이에는 몇가지가 존재한다.

이를 보자면 아래와 같다.

$w        로컬 호스트 네임

  $m        인터넷 도메인 네임

  $v        센드메일 버전

  $b        RFC822에서 규정한 날자

  $j        공식적인 도메인 네임

  $n        에러메세지가 발생했을 때 보내는 이

  $q        보내는 사람의 주소를 나타내는 형식 규정

3. Scheck_subject

위의 라인은 Header에서 check_subject로 정의한 부분을 Rule-set으로 지정을 한다.

4. R$*PORN$*       $#error $: 550 ${DENYPRON}

제일 앞의 R은 S로 지정된 rule-set 에 대한 rule을 정의한다.

위의 라인의 의미는 제목에 PORN 이라는 단어가 있을 경우 550 ${DENYPRON} 메세지를

첨부하여 에러를 발생시켜 반송을 시킨다. 여기서 ${DENYPRON}은 위에서 정의한

macro 이다. $* 은 모든 단어를 의미하여 이와 유사하게 사용을 할수 있는 것으로

$+s, $- $? 가 있다. 이에 대해서도 알아보자.

$*        여러개의 단어가 있든지 하나도 없던지

  $+        단어 한개 이상이 있을 경우

  $-        단어 하나가 있을 경우

  $?        단어 하나가 있든지 없던지

  $@    아무런 token 이 발생하지 않을 경우

rule을 정의 할때 주의할 점은 $#error 앞의 blnak는 white space가 아니라 tab을 이용

해서 띄어줘야 한다. 또한 주의할 것은 LHS (Left-Hand Symbol) 들의 opertate 들은

단어를 기준으로 하므로 $*STAR$* 으로 정의 하였을 경우 STARMAKER 는 걸리지 않는

다는 것이다. 위의 것은 aaa STAR maker 또는 STAR maker 가 걸리게 되는 것이다.

5. TEST RuleSET

대충 설정을 분석해 보았다. 그러면 snedmail을 restart하여 적용을 하기 전에 sendmail

의 test mode로 들어가서 제대로 설정이 되었는지를 테스트를 해 보도록 한다.

이 과정을 꼭 거치고 나서 sendmail 에 적용을 시키기 바란다. 아래를 참고하자.

Hanterm – sendmail -bt

[root@oops /etc/mail]# sendmail -bt

ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)

   Enter <ruleset> <address>

> check_subject Free porn star!!!

check_subject      input: Free porn star ! ! !

   check_subject    returns: $# error $: 550 Deny Porno spam mail ! ! !

   > ctrl+D를 누르고 종료한다

[root@oops /etc/mai]#

위에서 빨간색은 필자가 타이핑을 한 부분이다.

즉 -bt option으로 sendmail 의 테스트 모드로 들어간 다음 ruleset-name 문자열 의 형식

으로 넣었을때 위와 같이 returns 부분에 에러메세지가 나와야 정상적으로 설정이 된것이다.

위와 같이 되었으면 이제 sendmail을 restart 시켜서 적용을 시키면 된다.

6. 결론

메일 제목을 이용하여 필터링을 하고 싶다면

##############################################

########    Porno spam mail filter    ########

##############################################

HSubject: $>check_subject

D{DENYPORN} “Deny porno spam mail. if not, plez email admins@$j”

Scheck_subject

R$*PORN$*       $#error $: 550 ${DENYPRON}

R$*STAR$*       $#error $: 550 ${DENYPRON}

R$*PORNO$*      $#error $: 550 ${DENYPRON}

R$*STARS$*      $#error $: 550 ${DENYPRON}

R$*STRIP$*      $#error $: 550 ${DENYPRON}

R$*STRIPER$*    $#error $: 550 ${DENYPRON}

와 같이 적어준 다음 마지막 부분의 R$*원하는단어$* $#error $: 550 에러메세지 부분만

추가해 주면 바로 원하는데로 적용을 할수가 있다. 위의 $*, $-, $? 도 적절히 이용을 하면

되겠다.

이 외에도 Header의 여러가지 정보를 이용하여 필터링을 할수 있지만 그렇게 하기 위해서

는 mail에 대한 상당한 지식이 필요하다.

잘못하면 여러분의 메일 서버가 왕따가 될수도 있기 때문이다 ^^

H를 사용하여 header를 정의하여 위와 같이 사용을 하면 된다는 점을 인식하고 열심히 공부

하여 사용해 보기 바란다.

7. 참고

http://trade.chonbuk.ac.kr/~leesl/mail/

http://quanta.khu.ac.kr/~dacapo/sendmail/

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.