Тема: Базовая защита от спама на backup MX'е
Есть вторичный MX (backup) задача которого принимать все для определенных доменов и передавать первичному как только тот окажется доступным. Проблема что он передает письма от себя и они не всегда трактуются как спам, хотя и являются таковыми. Фильтров много, я выбрал те которые настраиваются легко и достаточно эффективны:
1. Greylist
2. DNSBL
3. SpamAssasin
Инсталлируем и подключаем postgrey, по пути и DNSBL
# yum -y install postgrey
# /etc/init.d/postgrey start
# chkconfig postgrey on
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
reject_non_fqdn_helo_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_rbl_client safe.dnsbl.sorbs.net,
reject_rbl_client bl.spamcop.net,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client xbl.spamhaus.org,
check_policy_service unix:postgrey/socket,
permit
перегружаем, пробуем отправить письмо, получаем 400 ошибку, порядок.
Dec 6 15:07:51 baltic postfix/smtpd[6216]: NOQUEUE: reject: RCPT from aaa[111.111.111.111]: 450 4.2.0 <[email protected]>: Recipient address rejected: Greylisted, see http://postgrey.schweikert.ch/help/xxx.lt.html; from=<[email protected]> to=<[email protected]> proto=SMTP
Обычно greylist блокирует на 5 минут, пока настраиваем SpamAssasin
# yum -y install spamassassin
# /etc/init.d/spamassassin start
# chkconfig spamassassin on
# adduser -N spamchk
Поправить команду запуска, там нет по умолчанию сокета, а по другому я не хочу с ним общаться
# cat /etc/sysconfig/spamassassin
# Options to spamd
SPAMDOPTIONS="-d -c -m5 -H --username spamchk --socketpath /var/run/spamassassin/spamd.sock"
берем скрипт
# -----------------------------------------------------------------
# File: spamchk
#
# Purpose: SPAMASSASIN shell-based filter
#
# Location: /usr/local/bin
#
# Usage: Call this script from master.cf (Postfix)
#
# Certified: GENTOO Linux, Spamassassin 3.0, Postfix
# -----------------------------------------------------------------
и выбрасываем все что ненужно, получается
# cat /etc/postfix/contentfilter/spamchk
#!/bin/sh
SENDMAIL="/usr/sbin/sendmail -i"
EGREP=/bin/egrep
EX_UNAVAILABLE=69
trap "/bin/rm -f /tmp/spamchk_out.$$" 0 1 2 3 15
/bin/cat | /usr/bin/spamc -u spamchk --socket=/var/run/spamassassin/spamd.sock | /bin/sed 's/^\.$/../' > /tmp/spamchk_out.$$
$SENDMAIL "$@" < /tmp/spamchk_out.$$
exit $?
минус подачи письма с "sendmail -i" в том что письмо появляется в очереди из воздуха и с другим ID'ом, но поскольку система не массового использования и я вообще сомневаюсь что логи кто то будит смотреть, так и оставлю. Позже напишу как делать правильно.
Прикрепляем все это к postfix'у. В master.cf добавляем
smtp inet n - n - - smtpd
-o content_filter=spamchk:dummy
spamchk unix - n n - 20 pipe
flags=Rq user=spamchk argv=/etc/postfix/contentfilter/spamchk -f ${sender} -- ${recipient}
Перегружает и проверяем, DNSBL работает
Dec 6 15:16:05 baltic postfix/smtpd[6637]: NOQUEUE: reject: RCPT from unknown[94.156.195.78]: 554 5.7.1 Service unavailable; Client host [94.156.195.78] blocked using safe.dnsbl.sorbs.net; Currently Sending Spam See: [url]http://www.sorbs.net/lookup.shtml?94.156.195.78[/url] / Exploitable Server See: [url]http://www.sorbs.net/lookup.shtml?94.156.195.78;[/url] from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<[94.156.195.78]>
Тут по пути вылезла ошибка, sendmail, в смысле почтовый демон, нам не нужен
lrwxrwxrwx 1 root root 21 Nov 21 12:30 /usr/sbin/sendmail -> /etc/alternatives/mta
lrwxrwxrwx 1 root root 27 Nov 21 12:30 /etc/alternatives/mta -> /usr/sbin/sendmail.sendmail
переделываем в
# rm /usr/sbin/sendmail
# ln -s /usr/sbin/sendmail.postfix /usr/sbin/sendmail
все, проверяем, работает.
Dec 6 15:20:37 baltic postfix/smtpd[11026]: connect from aaa[111.111.111.111]
Dec 6 15:20:42 baltic postgrey[6003]: action=pass, reason=triplet found, client_name=aaa, client_address=111.111.111.111, [email protected], [email protected]
Dec 6 15:20:42 baltic postfix/smtpd[11026]: BFCA11AE2ECE: client=aaa[111.111.111.111]
Dec 6 15:20:47 baltic postfix/cleanup[11020]: BFCA11AE2ECE: message-id=<>
Dec 6 15:20:47 baltic postfix/qmgr[11012]: BFCA11AE2ECE: from=<[email protected]>, size=196, nrcpt=1 (queue active)
Dec 6 15:20:47 baltic spamd[9508]: spamd: got connection over /var/run/spamassassin/spamd.sock
Dec 6 15:20:47 baltic spamd[9508]: spamd: processing message (unknown) for spamchk:500
Dec 6 15:20:48 baltic postfix/smtpd[11026]: disconnect from aaa[111.111.111.111]
Dec 6 15:20:51 baltic spamd[9508]: spamd: identified spam (6.2/5.0) for spamchk:500 in 4.6 seconds, 216 bytes.
Dec 6 15:20:51 baltic spamd[9508]: spamd: result: Y 6 - MISSING_DATE,MISSING_HEADERS,MISSING_MID,MISSING_SUBJECT,RCVD_IN_BRBL_LASTEXT scantime=4.6,size=216,user=spamchk,uid=500,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=/var/run/spamassassin/spamd.sock,mid=(unknown),autolearn=no
Dec 6 15:20:51 baltic postfix/pickup[11011]: B90691AE2ED2: uid=500 from=<[email protected]>
Dec 6 15:20:51 baltic postfix/pipe[11013]: BFCA11AE2ECE: to=<[email protected]>, relay=spamchk, delay=10, delays=5.6/0/0/4.6, dsn=2.0.0, status=sent (delivered via spamchk service)
Dec 6 15:20:51 baltic postfix/qmgr[11012]: BFCA11AE2ECE: removed
Dec 6 15:20:51 baltic postfix/cleanup[11020]: B90691AE2ED2: message-id=<[email protected]>
Dec 6 15:20:51 baltic postfix/qmgr[11012]: B90691AE2ED2: from=<[email protected]>, size=1124, nrcpt=1 (queue active)
Dec 6 15:20:51 baltic spamd[9506]: prefork: child states: II
Dec 6 15:20:52 baltic postfix/smtp[11040]: B90691AE2ED2: to=<[email protected]>, relay=baltic.lt[333.333.333.333]:25, delay=1, delays=0.02/0.01/0.01/1, dsn=2.6.0, status=sent (250 2.6.0 <[email protected]> [InternalId=748885] Queued mail for delivery)
Dec 6 15:20:52 baltic postfix/qmgr[11012]: B90691AE2ED2: removed
осталось сказать spamassasin'у ничего не удалять, только помечать.
# cat /etc/mail/spamassassin/local.cf
required_hits 5
report_safe 0
#rewrite_header Subject [SPAM]
P.S.
Если кто то не согласен что тут должно быть именно так
smtp inet n - n - - smtpd
-o content_filter=spamchk:dummy
вспомним что у меня вторичный MX где пользователи не авторизуются, но даже если бы они и авторизовались то на smpt это должно быть запрещено так как этот порт (25) нужен для общения сервер-сервер, для общения клиент-сервер используется submission (587)
#submission inet n - n - - smtpd
# -o smtpd_tls_security_level=encrypt
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
Добавлено: 23-06-2014 18:25:47
А тут Directadmin и greylist как это делается c exim'ом