Спам-фильтр - это не одна проверка. Это несколько десятков небольших проверок, каждая из которых добавляет или отнимает баллы, и порог, превращающий сумму в решение: доставить, положить в Junk или отказать. Проверки, которые делают основную работу, вообще не касаются слов в письме. Они о том, откуда письмо пришло - нет ли подключающегося адреса в блок-листе, проходят ли SPF, DKIM и DMARC, ведёт ли себя отправляющий сервер как настоящий почтовый сервер, - и решаются они ещё до того, как тело письма успеет прийти целиком. Анализ содержимого и обученный статистический классификатор отлавливают большую часть оставшегося. Задача того, кто управляет сервером, - в основном выбрать пороги, кормить классификатор хорошими примерами и разбираться с ложными срабатываниями, потому что законный счёт в Junk обходится дороже, чем десять спамных писем во входящих.
Как складывается спам-балл#
Любой серьёзный фильтр - SpamAssassin, Rspamd и фильтр, встроенный в Stalwart, - в общих чертах работает одинаково. У каждого сработавшего правила есть вес; веса складываются; сумма сравнивается с порогами. К типичному оценённому письму прикреплена дюжина правил:
| Сигнал | Типичный эффект | Почему это работает |
|---|---|---|
| IP подключения в DNS-блок-листе | Большой плюс | Известные взломанные или рассылающие спам хосты |
| SPF fail, DKIM fail, DMARC fail | Плюс | Поддельный или неправильно настроенный отправитель |
| DMARC pass с выровненным доменом | Минус | Владелец домена за него ручается |
| Нет обратной DNS-записи или она шаблонная | Плюс | Домашние подключения и ботнеты |
| Ссылки на домены из URI-блок-листа | Большой плюс | Полезная нагрузка - это ссылка |
| Байесовский классификатор считает спамом | Плюс, пропорционально | Обучен на вашей собственной почте |
Кривые заголовки, нет Date или Message-ID | Небольшой плюс | Инструменты массовых рассылок срезают углы |
| Отправитель уже писал этому пользователю | Минус | Репутация по каждому корреспонденту |
Пороги в разных продуктах разные. Традиционное значение по умолчанию в SpamAssassin для пометки письма как спама - 5.0; Rspamd поставляется с отдельными действиями для greylisting, добавления заголовка и отклонения, причём порог отклонения намного выше порога пометки. Точные числа важны меньше, чем общая форма: один порог, выше которого почта идёт в Junk, и гораздо более высокий, выше которого она отклоняется сразу. В промежутке между ними живёт сомнительная почта, и именно то, что её кладут в Junk, а не отклоняют, позволяет пользователю спасти ложные срабатывания.
Ни одно правило не должно в одиночку перетаскивать письмо через линию отклонения, кроме тех, которым вы доверяете абсолютно. Попадание в блок-лист плюс поддельная подпись DKIM - уверенное отклонение. Одно лишь попадание в блок-лист, известный ложными срабатываниями, должно тянуть только на Junk.
Отказать у дверей или положить в Junk#
У почтового сервера есть два момента, чтобы отреагировать на спам, и последствия у них разные.
Во время SMTP-диалога, вплоть до ответа в конце фазы DATA включительно, сервер может отказать в приёме письма ответом 5xx. Тогда проблема переходит к отправляющему серверу: если письмо было законным, отправитель получает от своего же сервера уведомление о недоставке с объяснением, что письмо отклонено, и знает, что надо попробовать по-другому. Ничего не теряется молча.
После приёма письма сервер может только положить его в Junk, пометить или выбросить. Возвращать его отправителю нельзя: к этому моменту адрес отправителя, скорее всего, подделан, и уведомление о недоставке уйдёт ни в чём не повинной третьей стороне, чьим адресом воспользовались. Это называется backscatter, и за него в блок-листы попадают уже сами серверы.
Поэтому правило такое: всё, в чём вы уверены, отклоняется во время SMTP, а всё сомнительное принимается и раскладывается. Молча выбрасывать принятую почту почти никогда не правильно, потому что об этом никто не узнает - ни отправитель, ни получатель.
DNS-блок-листы#
DNS-блок-лист (DNSBL) - это список IP-адресов, публикуемый через DNS. Чтобы проверить 198.51.100.23 по Spamhaus ZEN, сервер записывает октеты в обратном порядке и запрашивает имя в зоне списка:
$ dig +short 23.100.51.198.zen.spamhaus.org127.0.0.4Нет ответа - адреса в списке нет. Ответ из 127.0.0.0/8 означает, что он там есть, а конкретное значение говорит, почему: для ZEN 127.0.0.2 - это SBL (известные источники спама), 127.0.0.4-127.0.0.7 - XBL (взломанные машины), а 127.0.0.10 и 127.0.0.11 - PBL (диапазоны адресов, которые не должны отправлять почту напрямую, например домашние подключения). Каждый список документирует собственные коды, а тестовая запись 127.0.0.2 позволяет проверить, что запросы работают: dig +short 2.0.0.127.zen.spamhaus.org должен возвращать ответы.
Стоит знать три вида списков:
- IP-списки проверяют подключающийся сервер. Самый известный - Spamhaus ZEN; список Barracuda требует бесплатной регистрации; список SpamCop формируется по жалобам пользователей.
- Списки доменов и URI проверяют домены в ссылках и заголовках. Обычно это Spamhaus DBL, SURBL и URIBL, и они ловят спам, отправленный с чистых, только что арендованных серверов, потому что ссылка всё равно ведёт куда-то известное.
- Allow-листы (DNSWL) делают обратное и снижают балл для адресов, о которых известно, что они отправляют законную почту.
Блок-листы - самая дешёвая и самая эффективная отдельно взятая защита, и они же источник большинства ложных срабатываний на небольших серверах. Почта небольшой компании иногда идёт с сервера общего хостинга, адрес которого попал в список из-за соседа. Взвешивайте списки по степени доверия к ним, а не отклоняйте письмо при любом попадании.
Greylisting#
Greylisting использует разницу между настоящими почтовыми серверами и спам-программами. Когда письмо приходит с комбинации IP отправителя, адреса отправителя и получателя, которую сервер раньше не видел, оно временно отклоняется ответом 4xx, например 451 4.7.1 Try again later. Настоящий почтовый сервер ставит письмо в очередь и через несколько минут повторяет попытку, и повторная попытка принимается. Спам-программа, которая выстрелила и забыла, не возвращается никогда.
Когда-то он сам по себе отсекал большую долю спама. Теперь эффект меньше - спам всё чаще отправляют через настоящую почтовую инфраструктуру, включая взломанные учётные записи у крупных провайдеров, которые повторяют попытки как все, - и собственная документация Stalwart говорит то же самое. Издержки же не изменились:
- Первое письмо от любого нового корреспондента задерживается на интервал повтора отправителя, а он бывает от минуты до получаса и больше.
- Крупные отправители повторяют попытку с другого IP из пула, поэтому тройка не совпадает и задержка повторяется. Из-за этого некоторые фильтры ослабляют сравнение до сети, а не одного адреса.
- Коды входа и письма для сброса пароля приходят, когда уже истекли. Именно эту жалобу вы и будете слышать.
Разумный компромисс - применять greylisting только к почте, которая уже набрала подозрительный балл, а не ко всем новым отправителям. Так отсекаются программы «выстрелил и забыл», которые и без того выглядят плохо, а одноразовый код из банка остаётся в покое.
Результаты аутентификации как сигналы спама#
SPF, DKIM и DMARC создавались для аутентификации отправителя, а не для обнаружения спама, но их результаты - одни из самых полезных входных данных для балла. Как они работают, описано в статье SPF, DKIM и DMARC простыми словами; на принимающей стороне важно, какой вес им давать.
- DMARC pass означает, что владелец домена взял на себя ответственность за письмо. Это полезный отрицательный балл, хотя он ничего не говорит о том, не спамер ли сам владелец домена. Спамеры прекрасно аутентифицируют собственные домены.
- DMARC fail для домена с `p=reject` означает, что владелец попросил получателей отказывать такой почте. Выполните просьбу и отклоняйте во время SMTP.
- SPF fail без DMARC - более слабое свидетельство, чем кажется, потому что пересылка регулярно ломает SPF. Небольшой положительный балл, а не отклонение.
- Полное отсутствие аутентификации у домена, который отправляет много почты, подозрительно; у крошечного домена это просто старомодность.
На практике аутентификация делит почту на «за это кто-то ручается» и «никто не ручается», а остальная часть балла решает внутри каждой группы.
Байесовская фильтрация и обучение#
Статистический классификатор - это часть фильтра, которая изучает вашу почту, а не почту всех подряд. Он разбивает письма на токены - слова, фрагменты заголовков, части URL - и ведёт счёт тому, как часто каждый токен встречается в спаме и в законной почте. Новое письмо получает по своим токенам вероятность, и эта вероятность превращается в балл. Классификатор Stalwart - гибрид наивного Байеса и метода обратного хи-квадрата, и он обучается автоматически по мере того, как через него проходит почта.
Требования у статистических классификаторов хорошо известны:
- Обе стороны спора. Ему нужна законная почта наряду со спамом, в сопоставимых количествах. Классификатор, обученный только на спаме, усваивает, что спамное каждое слово.
- Минимум, прежде чем ему доверять. Большинство реализаций игнорируют классификатор, пока он не увидит по несколько сотен писем каждого вида. Новый сервер первые недели опирается на блок-листы и правила.
- Правильные исправления. Когда пользователь перемещает письмо в Junk или из него, это самый ценный обучающий сигнал, какой вы только получите. Позаботьтесь о том, чтобы пользователи знали: исправление - это перемещение письма, а удаление спама из входящих ничему не учит.
- Свой у каждого или общий. Общий классификатор обучается быстрее; персональный справляется с человеком, чья работа связана с почтой, похожей на маркетинг. На небольшом сервере обычно выбирают общий.
Если классификатор начинает уплывать - серия ложных срабатываний на одну и ту же тему, - причина почти всегда в пачке неправильного обучения, например пользователь перетащил в Junk целую папку рассылки, потому что она ему больше не нужна. Для ненужных рассылок правильный инструмент - отписка; обучение - для спама.
Правила по содержимому и почему они значат меньше, чем раньше#
Классические правила по содержимому - темы капслоком, «бесплатно» и «победитель», картинка без текста, скрытый текст в HTML - по-прежнему срабатывают, но каждое имеет небольшой вес, потому что законный маркетинг делает всё то же самое. Что в анализе содержимого всё ещё окупается:
- Ссылки. Письмо, где видимый текст ссылки называет один домен, а
hrefведёт на другой, или где ссылки идут через сокращатель или только что зарегистрированный домен, гораздо подозрительнее любых формулировок. - Вложения. Исполняемые файлы, скрипты, документы Office с макросами и архивы с ними - механизм доставки большинства вредоносных программ. Многие серверы сразу отклоняют самые опасные типы файлов.
- Структура. Письма только с HTML-частью и без обычного текста или с заголовками в порядке, который не выдаёт ни один настоящий клиент, выдают инструменты массовой рассылки.
Службы нечётких хешей, такие как Pyzor и Razor, сравнивают дайджест письма с дайджестами, о которых сообщили другие серверы, и это ловит одинаковый спам, разосланный многим получателям. Фильтр Stalwart тоже поддерживает такие совместные проверки дайджестов.
Ложные срабатывания: как их найти и исправить#
Ложное срабатывание - дорогой вид ошибки. Кто-то не получил коммерческое предложение, уведомление о доставке или договор, и никто об этом не узнал. Находить их - это привычка:
- Попросите пользователей заглядывать в Junk первые несколько недель и сообщать обо всём неправильном, а не очищать папку не глядя.
- Прочитайте заголовки неправильно разложенного письма. Фильтр записывает свой вердикт и балл в заголовки - ищите в исходнике письма статус спама и список сработавших правил, а также заголовок
Authentication-Resultsс результатами SPF, DKIM и DMARC. - Устраняйте причину, а не симптом. Если один блок-лист постоянно помечает поставщика, снизьте вес этого списка. Если DKIM не проходит, потому что у поставщика сломана почта, скажите ему; обычно достаточно переслать копию заголовков.
- Добавляйте в allow-лист узко. Разрешайте отправляющий домен, только если он проходит DKIM или DMARC для этого домена, и никогда - по одному лишь адресу
From:. Спамеры свободно подделываютFrom:, а запись в allow-листе для голого адреса - это приглашение.
Обратная проблема - ваша почта попадает в Junk к другим людям - это отдельная тема с другими решениями, она разобрана в статье почему письма попадают в спам.
Раскладка спама с помощью Sieve
Sieve - стандартный язык серверных правил для почты, и Stalwart его поддерживает, вместе с ManageSieve для клиентов, которые умеют редактировать правила. Правило, которое кладёт помеченную почту в Junk, выглядит так:
require ["fileinto"];if header :contains "X-Spam-Status" "Yes" { fileinto "Junk"; stop;}Имя заголовка, который пишет фильтр, зависит от продукта и конфигурации, поэтому, прежде чем полагаться на правило, откройте исходник помеченного письма и скопируйте точное имя и значение. Персональные правила Sieve - это ещё и место, где пользователи могут раскладывать шумного, но законного отправителя в отдельную папку, а это гораздо лучше, чем учить классификатор, что его почта - спам.
Спам-фильтр на почтовом сервере RE:NODE#
Линейка Mail Server работает на Stalwart, и спам-фильтр - его часть, настраиваемая из той же веб-админки, что и домены, почтовые ящики и DKIM. Блок-листы, greylisting и поведение классификатора - всё это настройки там же; сверяйтесь с документацией Stalwart для той версии, которую показывает ваш сервер, потому что структура конфигурации менялась от релиза к релизу. Чтобы вообще принимать почту, нужен порт 25, который поддержка по запросу перенаправляет на ваш сервер, - и как только он открыт, сканеры и спам приходят в течение нескольких часов, так что первую неделю следите за Junk, а не надейтесь, что настройки по умолчанию подходят вашей почте. Если вы ещё решаете, стоит ли вообще держать собственный сервер, честная версия этого решения - в руководстве по собственному почтовому серверу.
FAQ#
Отклонять спам или класть его в папку Junk?
И то и другое, при разной степени уверенности. Отклоняйте во время SMTP-диалога, когда уверены, чтобы законный отправитель получил уведомление о недоставке и узнал об этом. Сомнительную почту кладите в Junk, чтобы пользователи могли её спасти. Никогда не возвращайте почту после приёма, потому что адрес отправителя обычно подделан и уведомление уйдёт невиновному.
Стоит ли ещё включать greylisting?
Отчасти. Он по-прежнему останавливает спам-программы «выстрелил и забыл», но много спама теперь идёт через настоящие почтовые серверы, которые повторяют попытки. Его цена - задержанные первые письма и истёкшие коды входа - всё та же. Если применять greylisting только к почте, которая уже выглядит подозрительно, остаётся большая часть пользы при малой части издержек.
Почему вдруг каждое письмо получает балл спама?
Обычно это проблема DNS-блок-листа. Если сервер запрашивает блок-листы через публичный резолвер, некоторые списки отвечают кодом ошибки, который неправильно настроенный фильтр читает как «в списке». Посмотрите баллы в заголовках письма: если на каждом письме срабатывает одно и то же правило блок-листа, причина в этом.
Через сколько байесовское обучение начинает помогать?
Через недели, а не дни. Большинство классификаторов не участвуют в балле, пока у них нет нескольких сотен примеров и спама, и законной почты. До тех пор нагрузку несут блок-листы и результаты аутентификации. Позаботьтесь, чтобы пользователи перемещали неправильно разложенную почту, а не удаляли её, потому что это и есть обучение.
Можно ли добавить в allow-лист поставщика, чья почта постоянно попадает в фильтр?
Да, но добавляйте аутентифицированный домен, а не адрес From:, и сначала выясните, почему его почта застревает. Неработающая подпись DKIM или отправляющий IP в блок-листе - это его проблема, и короткое письмо с заголовками обычно исправляет её для всех получателей, а не только для вас.




Комментарии
Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.