Блог‎ > ‎

Как я с BCC-спамом боролся

Отправлено 17 мар. 2014 г., 04:24 пользователем Константин Ханкин
Привет, мои маленькие любители электронной почты. Сегодня я расскажу вам о том, что такое BCC-спам и как я его заборол (Осторожно! Имеются побочные эффекты!).

BCC-спам - это письмо, которое вы получаете только потому, что ваш адрес оказался в списке Blind Carbon Copy (скрытая копия). А письмо на самом деле от Ивана Ивановича к Ивану Никифоровичу, и вы недоумеваете, почему оно попало вам. Случаются вещи и поинтереснее - письмо от некоего Х самому этому Х. Но приходит вам. И можно до слепоты смотреть в заголовки - своего адреса электронной почты вы там не увидите, потому что заголовок BCC вырезается почтовым сервером отправителя (ну, почти всегда). Соответственно, ваш адрес будет фигурировать только в строке RCPT TO в SMTP-диалоге вашего принимающего MTA со спамерским отправляющим.

С BCC-спамом я столкнулся достаточно давно, когда-то даже вопрошал об этом на LOR.

Казалось бы, решение очевидно: проверять адрес получателя в заголовке To, и если такового получателя нет в базе получателей, отклонять письмо. Но, как обычно есть нюансы:
  1. база получателей может быть просто недоступна - не у всех получатели являются реальными пользователями (то есть есть в passwd) или хранятся в БД, напрямую доступной с почтового сервера;
  2. в письмах, отправляемых вашими пользователями, в заголовке To может быть всё, что угодно.
Условие усложняется: надо проверять комбинацию заголовков From и To. Круто, в любимом мною postfix есть замечательная вещь header_checks. Но и тут не всё просто: фильтр, указанный в header_checks, проверяет заголовки строчку за строчкой! То есть сохранить состояние мы не можем, а значит, и проверить комбинацию заголовков тоже.

Тут у нетерпеливого читателя уже явственно прослеживается на зубах что-то вроде DSpam или SpamAssassin. А вот нет. Не хочу я устанавливать этих прожорливых монстров (а DSpam надо ещё и обучать, и он ещё и вероятностный) только ради фильтрации одного вида спама - остальное на ура забарывает Greylisting.

В postfix есть ещё одна чудесная вещь - After-Queue Content Filter. Есть, конечно, один нюанс: пользование этим фильтром вызывает (может вызывать) создание временной копии письма на диске, а это лишние тормоза. В документации написано - снижение производительности в 4 раза. Сервер у меня ненагруженный, поток корреспонденции небольшой - отчего бы не попробовать!

Реализация на bash даже заработала. Но код приводить не хочу, честное слово. Начал делать реализацию на python, но вовремя решил почитать ещё и вспомнил про другую замечательную вещь - Before-Queue Content Filter, а точнее сказать, Before-Queue Milter (mail filter). Решил писать милтер на python, но задумался снова - а не решена ли эта проблема уже в каких-то милтерах? И нашёл просто восхитительную штуку - milter-regex. Позволяет фильтровать письма, применяя произвольный набор условий, задаваемых в том числе регшулярными выражениями. В общем, чудо, а не штука. Демон легковесный, много памяти и процессора в работе не кушает, набор правил ограничивается только вашими потребностями. Не SpamAssassin, конечно, но свою работу делает и делает отменно.

Чтобы milter-regex заработал в CentOS 6 с включенным SELinux, пришлось немного модифицировать политику. При наличии audit2allow это дело 5 минут :) Простая строчка конфигурации:
# BCC Spam
reject "BCC Spam detected"
header /^From$/i /comp.susu.ac.ru/in and (not header /^To$/i /comp.susu.ac.ru/i) and (not header /^Cc$/i /comp.susu.ac.ru/i)
творит чудеса:
germaseriosd.ru[193.105.174.36]: 5.7.1 BCC Spam detected;
germaseriosd.ru[193.105.174.36]: 5.7.1 BCC Spam detected;
germaseriosd.ru[193.105.174.36]: 5.7.1 BCC Spam detected;
germaseriosd.ru[193.105.174.36]: 5.7.1 BCC Spam detected;
fep-mail-smtpout-l2e.virgilio.net[212.48.21.155]: 5.7.1 BCC Spam detected;
mailout09.t-online.de[194.25.134.84]: 5.7.1 BCC Spam detected;
eastrmfepi202.cox.net[68.230.241.206]: 5.7.1 BCC Spam detected;
ask.lipowa.net[83.19.180.34]: 5.7.1 BCC Spam detected;
spamfilter2.starnet.md[178.168.2.134]: 5.7.1 BCC Spam detected;
vps3390.inmotionhosting.com[69.174.115.191]: 5.7.1 BCC Spam detected;
out06.smtpout.orange.fr[193.252.22.215]: 5.7.1 BCC Spam detected;
smtprelay0215.hostedemail.com[216.40.44.215]: 5.7.1 BCC Spam detected;
germaseriosd.ru[193.105.174.36]: 5.7.1 BCC Spam detected;
germaseriosd.ru[193.105.174.36]: 5.7.1 BCC Spam detected;
germaseriosd.ru[193.105.174.36]: 5.7.1 BCC Spam detected;
germaseriosd.ru[193.105.174.36]: 5.7.1 BCC Spam detected;
germaseriosd.ru[193.105.174.36]: 5.7.1 BCC Spam detected;
germaseriosd.ru[193.105.174.36]: 5.7.1 BCC Spam detected;

Естественно, если ваш почтовый сервер обслуживает более одного почтового домена, надо добавить исключения и для них тоже.

А теперь обещанный побочный эффект: к вам больше не дойдут никакие письма, отправленные вам как BCC. В самом деле, ну нет способа отличить, письмо пришло к вам с благородными целями (например, вы взломали почтовик микрософта и перенаправили с помощью always_bcc - у них на границе postfix! - всю почту Баллмера себе) или это лютый спам. Есть, конечно, белые списки, но давать пользователям редактировать белые списки - это смертоубийство, а администрировать чёрно-белые списки самому - глупо. В общем, нет BCC - ну и фиг с ним, пусть люди видят, кому ещё было отправлено это письмо, кроме них.
Comments