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 ${DENYPORN}
R$*STAR$* $#error $: 550 ${DENYPORN}
R$*PORNO$* $#error $: 550 ${DENYPORN}
R$*STARS$* $#error $: 550 ${DENYPORN}
R$*STRIP$* $#error $: 550 ${DENYPORN}
R$*STRIPER$* $#error $: 550 ${DENYPORN}
.. 생략 ..
[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 ${DENYPORN}
제일 앞의 R은 S로 지정된 rule-set 에 대한 rule을 정의한다. 위의
라인의 의미는 제목에 PORN 이라는 단어가 있을 경우 550 ${DENYPORN}
메세지를 첨부하여 에러를 발생시켜 반송을 시킨다. 여기서
${DENYPORN}은 위에서 정의한 macro 이다. $* 은 모든 단어를 의미하여
이와 유사하게 사용을 할수 있는 것으로 $+, $- $? 가 있다. 이에
대해서도 알아보자.
$* 여러개의 단어가 있든지 하나도 없던지
$+ 단어 한개 이상이 있을 경우
$- 단어 하나가 있을 경우
$? 단어 하나가 있든지 없던지
$@ 아무런 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 ${DENYPORN}
R$*STAR$* $#error $: 550 ${DENYPORN}
R$*PORNO$* $#error $: 550 ${DENYPORN}
R$*STARS$* $#error $: 550 ${DENYPORN}
R$*STRIP$* $#error $: 550 ${DENYPORN}
R$*STRIPER$* $#error $: 550 ${DENYPORN}
와 같이 적어준 다음 마지막 부분의 R$*원하는단어$* $#error $: 550 에러메세지
부분만 추가해 주면 바로 원하는데로 적용을 할수가 있다. 위의 $*, $-, $?
도 적절히 이용을 하면 되겠다.
이 외에도 Header의 여러가지 정보를 이용하여 필터링을 할수 있지만
그렇게 하기 위해서는 mail에 대한 상당한 지식이 필요하다. 잘못하면
여러분의 메일 서버가 왕따가 될수도 있기 때문이다 ^^ H를 사용하여
header를 정의하여 위와 같이 사용을 하면 된다는 점을 인식하고 열심히
공부하여 사용해 보기 바란다.
7. 참고
http://trade.chonbuk.ac.kr/~leesl/mail/
http://quanta.khu.ac.kr/~dacapo/sendmail/
>> 이전 : SMTP 인증
>> 다음 : AUTO REPLY 구현
|