[메일] 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/