ДЕНИС НАЗАРОВ
Режем спам
Дополнительные методы
Идет бабулька по подворотням, видит два парня третьего пинают, она cпрашивает:
– За что это вы его так, сынки?
– Бабка, да это спамер!
– А ну тогда по почкам его! По почкам!
Знакомый анекдот? А в реальной жизни вы пробовали подсчитать количество «спама», проходящего через ваш почтовый сервер? Недавний аудит одной финансовой компании показал, что через почтовый сервер прошло больше 22 Гб почтового трафика в месяц. Я информировал об этом начальство и со спокойной душой решил, что аудит окончен, но я ошибся, руководство компании уверяло меня в том, что это просто невозможно, т.к. раньше у них был гораздо меньший объем почтового трафика, а новых сотрудников они не набирали. Пришлось разбираться дальше. Проанализировав протоколы за месяц, я пришел к выводу, что 20 из этих 22 Гб были просто «спамом». Решено было избавлять компанию от этой назойливой почты...
Итак, мы имеем в наличии
- OpenBSD 3.6.
- Postfix 2.1.5 (считаю этот МТА одним из лучших благодаря гибкости настройки и возможностям).
- DrWeb 4.32 (отличный антивирус, никогда не подводил, идеально работает с OpenBSD).
- Пользователи: примерно 500 человек.
Задача: Обеспечить максимальную защиту от спама и вирусов, которые вам стремятся подсунуть по электронной почте.
Система
Настройка системы начинается с файла /etc/rc.conf. С версии 3.3 OpenBSD имеет встроенный механизм защиты от спама, называемый spamd. Именно о настройке данного компонента системы мы и поговорим. Что есть spamd? Это демон, который пропускает через себя весь почтовый поток и принимает решения – отдать ли письмо на обработку «реальному» МТА или же отбросить, как «спам».
Как работает spamd? В его распоряжении имеются 2 или 3 списка (в зависимости от того, что вы выберете в конфигурационном файле) – «черный список», «белый список», «серый список». Последний («серый список») может быть отключен, если вам нужен более жесткий контроль над спамерами. Демон spamd при запуске начинает слушать порт 8025 на интерфейсе 127.0.0.1 (переопределить порт можно, отредактировав файл /etc/services). Затем при помощи PF (OpenBSD Packet Filter) мы перенаправляем весь трафик с 25-го порта на порт 8025. И видим следующую картину:
Trying 127.0.0.1...
Connected to localhost.
Escape character is "^]".
220 bastion ESMTP spamd IP-based SPAM blocker; Tue Feb 15 12:57:50 2005
|
С виду похоже на приветствие обычного МТА, если не считать строчку: IP-based SPAM blocker.
Вот теперь начинается самое интересное. Возвращяемся к спискам.
- «Черный список» – думаю все понятно. IP-адреса, перечисленные тут, будут вежливо отвергнуты.
- «Белый список» – IP-адреса из этого списка будут иметь доступ к «реальному» МТА напрямую, без прохождения спам-фильтра. Подразумевается, что в этот список вы вносите те IP-адреса, в которых уверены на 99,97%.
- Grey List – динамический список. Приходящее письмо с IP-адресом, не входящее ни в «черный список», ни в «белый список», будет помечено как «grey», и отвергнуто с ошибкой: «450. Temporary failure. Try again later.» Получая данный ответ, удаленный хост, отправивший вам сообщение, должен будет снова попытаться переслать сообщение через некоторое время. Обычно интервал ожидания может быть от 10 до 30 минут. Spamd следит за этим и, получая письмо второй раз, передает его почтовой системе, занося отправителя в «белый список». Зачем все это нужно? Получив в ответ ошибку, спамер будет настойчиво пытаться впихнуть нам свое сообщение. Возможно, даже выполняя множество попыток в течение одной минуты. Spamd считает такие попытки. При превышении определенного количества хост тут же попадает в «черный список».
Чтобы окончательно понять, как это работает, приступим к конфигурированию.
/etc/rc.conf
spamd_flags="" # for normal use: "" and see spamd-setup(8)
spamd_grey=YES # use spamd greylisting if YES
Влючаем spamd и указываем на то, что мы хотим использовать Grey Listing.
Crontab
0 * * * * /usr/libexec/spamd-setup
В crontab для root прописываем запуск утилиты spamd-setup таким образом, чтобы она выполнялась в начале каждого часа. Данная утилита скачивает из Интернета списки с IP-адресами спамерских релеев и автоматически заносит их в ваш «черный список».
/etc/spamd.conf
all:\
:spamhaus:spews1:spews2:china:korea:whitelist:blacklist:
# Mirrored from http://spfilter.openrbl.org/data/sbl/SBL.cidr.bz2
spamhaus:\
:black:\
:msg="SPAM. Your address %A is in the Spamhaus Block List\n\
See http://www.spamhaus.org/sbl and\
http://www.abuse.net/sbl.phtml?IP=%A for more details":\
:method=http:\
:file=www.openbsd.org/spamd/SBL.cidr.gz
# Mirrored from http://www.spews.org/spews_list_level1.txt
spews1:\
:black:\
:msg="SPAM. Your address %A is in the spews level 1 database\n\
See http://www.spews.org/ask.cgi?x=%A for more details":\
:method=http:\
:file=www.openbsd.org/spamd/spews_list_level1.txt.gz
# Mirrored from http://www.spews.org/spews_list_level2.txt
spews2:\
:black:\
:msg="SPAM. Your address %A is in the spews level 2 database\n\
See http://www.spews.org/ask.cgi?x=%A for more details":\
:method=http:\
:file=www.openbsd.org/spamd/spews_list_level2.txt.gz
# Mirrored from http://www.okean.com/chinacidr.txt
china:\
:black:\
:msg="SPAM. Your address %A appears to be from China\n\
See http://www.okean.com/asianspamblocks.html for more details":\
:method=http:\
:file=www.openbsd.org/spamd/chinacidr.txt.gz
# Mirrored from http://www.okean.com/koreacidr.txt
korea:\
:black:\
:msg="SPAM. Your address %A appears to be from Korea\n\
See http://www.okean.com/asianspamblocks.html for more details":\
:method=http:\
:file=www.openbsd.org/spamd/koreacidr.txt.gz
# Whitelists are done like this, and must be added to «all» after each blacklist from which you want
# the addresses in the whitelist removed
whitelist:\
:white:\
:file=/var/mail/whitelist.txt
blacklist:\
:black:\
:msg="SPAM! Go fsck anyone else!":\
:file=/var/mail/blacklist.txt
relaydb-black:\
:black:\
:msg="SPAM. Your address %A is in my relaydb list.":\
:method=exec:\
:file=relaydb -4lb:
relaydb-white:\
:white:\
:method=exec:\
:file=relaydb -4lw:
Данный файл отвечает за обработку этих самых «черных», «белых» и «серых» списков. Я перечислил основные самые крупные «черные списки» для спамеров, вы можете их смело использовать.
Переходим к настройке ваших «черных» и «белых» списков.
blacklist:
:black:
:msg="SPAM! Go fsck anyone else!":
:file=/var/mail/blacklist.txt
Директива msg отвечает за то сообщение, которое мы будем отправлять во время сессии, в том случае если хост находится в «черном списке». Директива file определяет путь для файла со списком IP-адресов, которые автоматом при загрузке попадают в «черный список».
# cat /var/mail/blacklist.txt
81.213.107.93
212.112.102.194
81.195.250.132
212.19.145.86
|
Конфигурационный файл похож и для «белого списка», за исключением директивы msg – она отсутствует.
# cat /var/mail/whitelist.txt
Важно.
all:
:spamhaus:spews1:spews2:china:korea:whitelist:blacklist:
Решение принимается на основе последнего совпадения IP-адреса и записи в списках.
Все. Основная конфигурация для spamd закончена. Так как мы перенаправляем письма в spamd при помощи PF (Packet Filter), то конфигурируем сам фильтр:
/etc/pf.conf
table persist
table persist
rdr pass inet proto tcp from to any port smtp -> 127.0.0.1 port 8025
rdr pass inet proto tcp from ! to any port smtp -> 127.0.0.1 port 8025
Тем, кто читал в журнале мои предыдущие статьи о пакетном фильтре операционной системы OpenBSD, все будет понятно. Для остальных поясню – фильтр перенаправляет весь трафик с 25-го порта на порт 8025. Но если трафик на 25 порт идет с IP-адреса, который находится в «белом списке», то PF пропускает трафик сразу «реальному» МТА.
Готово. Теперь осталось запустить spamd.
Можно запустить spamd вручную, но лучше будет – перезагрузить сервер, т.к. при запуске spamd создает нужные файлы в /var/db, а также «привязывает» себя к пакетному фильтру.
# ps ax | grep -i spa
3123 ?? Is 3:52.08 spamd: (pf update) (spamd)
17434 ?? I 17:44.88 /usr/libexec/spamd -g
11229 ?? I 0:01.86 spamd: (/var/db/spamd update) (spamd)
26245 ?? Is 0:00.00 /usr/libexec/spamlogd
23886 p0 I+ 0:00.00 grep -i spa
|
Отлично. Спам-фильтр, основанный на проверке IP-адресов, это, конечно, хорошо и будет работать в связке с любым МТА, но мы сделаем еще лучше.
Идем дальше.
Postfix
Я не буду рассказывать, почему Postfix такой замечательный и гибкий, и быстрый, и мощный – просто сразу начнем его настраивать.
/etc/postfix/main.cf
#
# Our stuff for coniguring Postfix goes here
#
Запрещаем использование команды VRFY для проверки наличия пользователя в системе.
disable_vrfy_command = yes
Обязываем удаленный хост здороваться с нами, а не сразу начинать нас забрасывать почтой. Софт, разработанный для рассылки спама, зачастую не умеет работать с smtp-командой helo.
smtpd_helo_required = yes
Проверяем наличие «верного» имени хоста для отправителей. Иначе отказываем отправителю.
smtpd_helo_restictions = permit_mynetworks,
reject_invalid_hostname,
reject_unknown_hostname,
reject_non_fqdn_hostname
Проверяем наличе «верного» домена у отправителя, иначе отказываем.
smtpd_sender_restrictions = reject_unknown_sender_domain,
check_sender_access hash:/etc/postfix/reject
Если же намеренно хотим отказать отправителю – заносим его домен в файл /etc/postfix/reject и выполняем команду:
# postmap /etc/postfix/reject
Утилита postmap создаст хеш из файла /etc/postfix/reject, который будет использоваться самим Postfix для отказа в приеме почты.
Проверяем наличие «верного» имени домена для получателей, отказываем всем, чьё имя домена не соответствует требованиям FQDN, или не существует вообще.
smtpd_recipient_restrictions = reject_invalid_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
permit_mynetworks,
reject_unauth_destination,
reject_rbl_client relays.visi.com,
reject_rbl_client relays.ordb.org,
reject_rbl_client list.dsbl.org,
reject_rbl_client dnsbl.sorbs.net,
reject_rbl_client dnsbl.void.ru,
reject_rbl_client blackholes.mail-abuse.org,
reject_rbl_client relays.mail-abuse.org,
reject_rbl_client dul.mail-abuse.org,
reject_rbl_client relays.ordb.org,
reject_rbl_client blackholes.wirehub.net,
reject_rbl_client dynablock.wirehub.net,
reject_rbl_client dnsbl.njabl.org,
reject_rbl_client list.dsbl.org,
reject_rbl_client opm.blitzed.org,
reject_rbl_client http.dnsbl.sorbs.net,
reject_rbl_client socks.dnsbl.sorbs.net,
reject_rbl_client misc.dnsbl.sorbs.net,
reject_rbl_client smtp.dnsbl.sorbs.net,
reject_rbl_client web.dnsbl.sorbs.net,
reject_rbl_client bl.spamcop.net,
reject_rbl_client dev.null.dk,
reject_rbl_client blackholes.mail-abuse.com,
reject_rbl_client relays.mail-abuse.com,
reject_rbl_client dialups.mail-abuse.com,
reject_rbl_client relays.ordb.org,
reject_rbl_client list.dsbl.org,
reject_rbl_client multihop.dsbl.org,
reject_rbl_client argentina.blackholes.us,
reject_rbl_client brazil.blackholes.us,
reject_rbl_client china.blackholes.us,
reject_rbl_client cn-kr.blackholes.us,
reject_rbl_client hongkong.blackholes.us,
reject_rbl_client japan.blackholes.us,
reject_rbl_client korea.blackholes.us,
reject_rbl_client malaysia.blackholes.us,
reject_rbl_client mexico.blackholes.us,
reject_rbl_client nigeria.blackholes.us,
reject_rbl_client singapore.blackholes.us,
reject_rbl_client taiwan.blackholes.us,
reject_rbl_client thailand.blackholes.us,
reject_rbl_client turkey.blackholes.us
Строчка reject_rbl_client relays.visi.com … добавляет так называемую RBL-проверку. Принцип тот же, что и у spamd. Хост проверяется в «черном списке» у всех добавленных нами «reject_rbl_client», и, если будет обнаружен там, письмо отбрасывается, как спам.
После данной настройки системы и Postfix в качестве MTA в протоколах мы можем наблюдать следующее:
# tail /var/log/daemon
Feb 15 12:10:22 bastion spamd[17434]: 66.94.237.32: connected (1/0)
Feb 15 12:10:23 bastion spamd[17434]: 66.94.237.32: disconnected after 1 seconds.
Feb 15 12:13:29 bastion spamd[17434]: 222.67.37.40: connected (103/100), lists: china
Feb 15 12:13:32 bastion spamd[17434]: 222.67.37.40: disconnected after 3 seconds. lists: china
Feb 15 12:13:53 bastion spamd[17434]: 63.209.157.52: connected (1/1), lists: spamhaus
Feb 15 12:21:11 bastion spamd[17434]: 63.209.157.52: disconnected after 438 seconds. lists: spamhaus
|
Из протоколов видно, какой IP-адрес и сколько раз пытался соединиться и отправить нам спам.
# grep –i spam /var/log/maillog
Feb 15 01:19:34 bastion postfix/smtpd[8447]: NOQUEUE: reject: RCPT from domain.name[195.2.80.59]: 554 Service unavailable;
Client host [195.2.80.59] blocked using dnsbl.sorbs.net; Spam Received See: http://www.dnsbl.sorbs.net/lookup.shtml?195.2.80.59;
from= to= proto=SMTP helo=
|
Система работает, как часы, все четко и точно. Если вам не нравится, как spamd распределяет IP-адреса отправителей по «черному» и «белому» списку, используем утилиту spamdb.
# spamdb | more
WHITE|12.111.30.74|||1105460517|1105466496|1108576943|2|0
WHITE|129.215.166.64|||1106681432|1106683445|1109793856|2|0
WHITE|13.16.138.21|||1105587869|1105591107|1108701528|3|0
WHITE|130.126.232.30|||1106168619|1106170545|1109281002|6|0
WHITE|134.130.3.130|||1107270887|1107274487|1110384920|2|0
WHITE|138.220.29.7|||1105954380|1105956190|1109066641|6|0
|
Данный листинг показывает ваши «белый список» и Grey Lists. Если вы намеренно хотите добавить в таблицу хост, помеченный как White, используем параметр -a, чтобы удалить -d:
spamdb –a xxx.xxx.xxx.xxx
spamdb –d xxx.xxx.xxx.xxx
Примечание. Добавить или удалить можно только IP-адреса, помеченные как White. Для добавления IP-адреса в ваш «черный список» отредактируйте файл, указанный в директиве file файла /etc/spamd.conf.
Основная настройка закончена. Остаются «рюшечки». Спам это, конечно, вредная вещь, но вирусы, трояны и прочее может принести вам еще больше проблем. Приступим.
Берем последнюю версию DrWeb на сайте http://download.drweb.com/unix/OpenBSD+3.6 и оттуда же фильтр для Postfix.
Установка DrWeb очень проста. Нужно распаковать архив и расположить файлы в системе так, как это сказано в readme. Также вам потребуется наличие демонстрационного ключа для запуска антивируса в демо-режиме. Если понравится работа DrWeb (а я надеюсь, так и будет), то вы можете без проблем приобрести нормальный ключ.
Переходим к Postfix. Тут тоже все довольно просто.
/etc/postfix/master.cf
Заменяем строчку:
smtp inet n - n - - smtpd
на
smtp inet n - n - - smtpd -o content_filter=filter:dummy
и добавляем в конец файла:
filter unix - n n - - pipe
flags=R user=drweb argv=/usr/local/drweb/drweb-postfix -f ${sender} -- ${recipient}
Вот, в общем-то, и все. Отличная антивирусная защита к вашему Postfix готова.
На сим заканчиваю, надеюсь, описанные мной способы помогут отбить все почки вашим спамерам.