Фильтрафия спама в sendmail.

Установка sendmail

Сначала устанавливаем из портов sendmail c поддержкой cyrus sasl (система аутентификации). Это часть описана в предыдущей сатье.

Настройка freebsd.mc

Итак, после установки sendmail, мы приступаем к созданию эффективной защиты от спамеров. План работы будет следующий:
  1. Включить фильтрацию по IP адресам

  2. Отключить прием почты с диал-апов.

  3. Отключить прием почты с открытых релеев.

  4. Включить фильтрование почты по специфическим заголовкам.

Включаем фильтрацию по IP адресам.

Это - самый простой пункт нашего плана.
Чтобы включить фильтрациб по IP адресам, необходимо раскомментировать строчку
FEATURE(dnsbl)
После этого sendmail станет проверять IP адрес отправителя.

Отключаем прием почты с диал-апов.

Пользователи, подключающиеся к Интернет по коммутируемым линиям, должны пользоваться почтовым сервером своего провайдера.
Для России такая база данных доступна на сервере http://www.dul.ru/, а для остального мира - на сервере http://www.mail-abuse.org.
Механизм поверки IP адреса прост: если хост, представляющий собой обратно записанный IP адрес существует в зоне, то адрес является частью диал-ап пула.

Например, для адреса 195.42.160.237, мы получаем:
nslookup 237.160.42.195.dul.ru
Server:  hosting.akmosoft.com
Address:  213.221.4.135

Name:    237.160.42.195.dul.ru
Address:  127.0.0.3
Этот IP адрес является частью диал-ап пула.
Чтобы научить sendmail проверять IP адрес, мы лоджны вставить в файл freebsd.mc, следующие строчки:
FEATURE(dnsbl,`dialups.mail-abuse.org',`550 Mail from $&{client_addr} rejected; see http://mail-abuse.org/dul/enduser.htm')
FEATURE(dnsbl, `dul.ru', `550 Use mail relays of your ISP')dnl
Пересобираем файл конфигурации sendmail и проверяем результат:
cd /etc/mail
make all
make instal
sendmail -bt -C /etc/mail/sendmail.cf

ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> .D{client_addr}127.0.0.3
> Basic_check_relay <>
Basic_check_rela   input: < >
Basic_check_rela returns: $# error $@ 5 . 7 . 1 $: 550 Use mail relays of your ISP
>

Отключаем прием почты с открытых релеев.

Здесь все аналогично проверке диал-апа. Правила для фильтрафии будут такими (все пишется в одну строчку; знаком "\" указан перевод строки).
FEATURE(dnsbl,`blackholes.mail-abuse.org',`550 Mail from $&{client_addr} \
	rejected; see http://mail-abuse.org/cgi-bin/lookup?$&{client_addr}')dnl

FEATURE(dnsbl,`relays.mail-abuse.org',`550 Mail from $&{client_addr} \
	rejected; see http://work-rss.mail-abuse.org/cgi-bin/nph-rss?$&{client_addr}')dnl

FEATURE(dnsbl,`list.dsbl.org',`550 Mail from $&{client_addr} rejected; \
	see http://dsbl.org/listing.php?$&{client_addr}')

FEATURE(dnsbl,`multihop.dsbl.org',`550 Mail from $&{client_addr} rejected; \
	see http://dsbl.org/listing.php$&{client_addr}')

FEATURE(dnsbl,`unconfirmed.dsbl.org',`550 Mail from $&{client_addr} rejected;\
	 see http://dsbl.org/listing.php?$&{client_addr}')

FEATURE(`dnsbl', `relays.ordb.org', `Rejected - see http://ordb.org/')dnl
Пересобираем файл конфигурации sendmail и проверяем результат:
cd /etc/mail
make all
make instal
sendmail -bt -C /etc/mail/sendmail.cf

ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> .D{client_addr}127.0.0.2
> Basic_check_relay <>
Basic_check_rela   input: < >
Basic_check_rela returns: $# error $@ 5.7.1 $: 550 Mail from 127.0.0.2 rejected ;
see http://dsbl.org/listing.php?127.0.0.2
>

Фильтруем почту по содержимому заголовка.

Составим список слов (или частей слов), при наличии которых в теме письма мы будем отвергать прием почты.
define(`RxSPAMSUBJECT', `CASH|\ EARN|FAX|GUARANTEED|HGH|MILLION| \
	MONEY|URGENT|XXX|LOLIT|PENIS|PORN|ADV|NOW!| \
	TEEN|SLUT|DICK|!!!|WAREZ')
	
define(`RxSPAMTO', `rcptdomain|undisclosed|My\ Friend')
Добавим в файл freebsd.mc раздел "LOCAL_CONFIG", в котором перечислим наши регулярные выражения:
LOCAL_CONFIG

KSPAMSUBJECT			regex -a@MATCH -f RxSPAMSUBJECT
KSPAMTO				regex -a@MATCH -f RxSPAMTO
Ключ -f заставляет sendmail учитывать регистр при проверке регулярного выражения. Здесь он приведен исключительно ради примера.

(!) Важно!: Разделителями между названием регэкспов и их описанием должны служить знаки табуляции.

После этого мы должны добавить в файл freebsd.mc раздел "LOCAL_RULESETS", в котором будет производиться проверка заголовков:
LOCAL_RULESETS
HX-Mailer: $>CheckMailer
HX-Server: $>CheckMailer
HSubject: $>CheckSubject
HTo: $>CheckTo
HMessage-ID: $>CheckMessageID

SCheckMailer
RAdvanced Direct Remailer $*	$#error $@ 5.7.1 $: "554 Spam (ADR)"
RAdvanced Mass Sender $*	$#error $@ 5.7.1 $: "554 Spam (AMS)"
RSpammer $*			$#error $@ 5.7.1 $: "554 Spam (Spammer)"
R$* Bomber $*			$#error $@ 5.7.1 $: "554 Spam (Bomber)"
RMega-Mailer $*			$#error $@ 5.7.1 $: "554 Spam (Mega-Mailer)"
RMMailer $*			$#error $@ 5.7.1 $: "554 Spam (MMailer)"
RMailer $*			$#error $@ 5.7.1 $: "554 Spam (Mailer)"
RLigra Mailer $*		$#error $@ 5.7.1 $: "554 Spam (Ligra Mailer)"
RDynamic Opt-In Emailer $*	$#error $@ 5.7.1 $: "554 Spam (Dynamic Opt-In Emailer)"
R$* Group Spamer		$#error $@ 5.7.1 $: "554 Spam (WE Group Spamer)"
RMail Sender $*			$#error $@ 5.7.1 $: "554 Spam (Mail Sender)"
RMail Service $*		$#error $@ 5.7.1 $: "554 Spam (Mail Service)"
RMailloop $*			$#error $@ 5.7.1 $: "554 Spam (Mailloop)"
RPersMail $*			$#error $@ 5.7.1 $: "554 Spam (PersMail)"
RLK SendIt $*			$#error $@ 5.7.1 $: "554 Spam (LK SendIt)"
RWC Mail $*			$#error $@ 5.7.1 $: "554 Spam (WC Mail)"
RZUBA ZUB $*			$#error $@ 5.7.1 $: "554 Spam (ZUBA ZUB)"
RMailList Express $*		$#error $@ 5.7.1 $: "554 Spam (MailList Express)"
RCaretop $*			$#error $@ 5.7.1 $: "554 Spam (Caretop)"
RMailer Signature		$#error $@ 5.7.1 $: "554 Spam (Mailer Si)"
Rnone				$#error $@ 5.7.1 $: "554 Spam (none)"
RPG-MAILINGLIST			$#error $@ 5.7.1 $: "554 Spam (PG-MAILINGLIST)"
R$* advcomtest $*		$#error $@ 5.7.1 $: "554 Spam (advcomtest)"
Ryo yo mail			$#error $@ 5.7.1 $: "554 Spam (yo yo mail)"
RZanziMailer $*			$#error $@ 5.7.1 $: "554 Spam (ZanziMailer)"
RFiG$*				$#error $@ 5.7.1 $: "554 Spam (FiG)"
RMicrosoft Outlook Express 5.0	$#error $@ 5.7.1 $: "554 Spam (Microsoft Outlook Express 5.0)"
RVersion 5.0			$#error $@ 5.7.1 $: "554 Spam (Version 5.0)"

Rnethack			$@ OK
RZ-Mail-SGI			$@ OK
RDipost				$@ OK
R$-				$#error $@ 5.7.1 $: "554 Spam (one-word mailer)"

R$*				$: < $1 >
R< >				$#error $@ 5.7.1 $: "554 Illegal header (empty header)"
R$*				$@ OK

SCheckSubject
R$*				$: $(SPAMSUBJECT $&{currHeader} $: OK $)
ROK				$@ OK
R$*				$#error $@ 5.7.1 $: "550 Yep!"

SCheckTo
R$*				$: $(SPAMTO $&{currHeader} $: OK $)
ROK				$@ OK
R$*				$#error $@ 5.7.1 $: "550 No, thanks!"

SCheckMessageID
R<$+@$+>			$@ < $1 @ $2 >
R$*				$#error $@ 5.5.2 $: "553 Bad Message ID"
(!) Важно!: Здесь также разделителями между названием регэкспов и их описанием должны служить знаки табуляции.

Заключение.

В результате проделанной работы, при попытке отправить почту через открытый релей, будет выдано сообщение о том, что почту принять невозможно, а прием почты будет отвергнут.
wizard!stellar:~/public_html$ telnet mystmp.relay.com 25
Trying XXX.YYY.ZZZ.KKK...
Connected to mystmp.relay.com.
Escape character is '^]'.
220 mystmp.relay.com ESMTP Sendmail 8.12.6/8.12.6; Wed, 15 Jan 2003 15:57:04 +0300 (MSK)
helo stellar
250 mystmp.relay.com Hello spammer.host.com [AAA.BBB.CCC.DDD], pleased to meet you
mail from:
550 5.7.1 Mail from AAA.BBB.CCC.DDD rejected;see http://dsbl.org/listing.php?AAA.BBB.CCC.DDD
quit
221 2.0.0 mystmp.relay.com closing connection
Connection closed by foreign host.
wizard!stellar:~/public_html$
Соответствующая этому событию запись в maillog будет примерно такой:
Jan 15 15:57:04 genius sm-mta[20038]: ruleset=check_relay, arg1=spammer.host.com,
arg2=AAA.BBB.CCC.DDD, relay=spammer.host.com [AAA.BBB.CCC.DDD], reject=5
50 5.7.1 Mail from AAA.BBB.CCC.DDD rejected;see http://dsbl.org/listing.php?AAA.BBB.CCC.DDD
Если проверка на отсутсвия IP адреса во всех базах данных прошла успешно, но в самом теле письма содержится спамерское предложение или оно отослано программой- массовым рассыльщиком, sendmail также отвергнет такое письмо:
telnet mystmp.relay.com 25
Trying XXX.YYY.ZZZ.KKK...
Connected to mystmp.relay.com.
Escape character is '^]'.
220 mystmp.relay.com ESMTP Sendmail 8.12.6/8.12.6; Wed, 15 Jan 2003 17:09:42 +0300 (MSK)
helo stellar
250 mystmp.relay.com Hello spammer.host.com [AAA.BBB.CCC.DDD], pleased to meet you
mail from:
250 2.1.0 ... Sender ok
rcpt to:
250 2.1.5 ... Recipient ok
data
354 Enter mail, end with "." on a line by itself
subject: super sexual offer!!!
from:
to:


super sexual offer!!!

.
550 5.7.1 Yep!
quit
221 2.0.0 hosting.akmosoft.com closing connection
В логах мы увидим такое сообщение:
Jan 15 17:10:46 genius sm-mta[20272]: h0FE9eWQ020272: ruleset=CheckSubject, 
arg1=super sexual offer!!!, relay=spammer.host.com [AAA.BBB.CCC.DDD], reject=550
 5.7.1 Yep!
Jan 15 17:10:55 genius sm-mta[20272]: h0FE9eWQ020272: from=,
size=116, class=0, nrcpts=1, msgid=<200301151410.h0FE9eWQ020272@hos
ting.akmosoft.com>, proto=SMTP, daemon=MSA, relay=spammer.host.com [AAA.BBB.CCC.DDD]
Jan 15 17:10:55 genius sm-mta[20272]: h0FE9eWQ020272: to=,
delay=00:00:45, pri=30092, stat=Yep!

© 2002 stellar.
При воспроизведении материала поставьте ссылку на http://stellar.df.ru.