|
|
|
---
|
|
|
|
title: Почтовый шлюз: задание со звёздочкой (Обратная связь и переобучение системы)
|
|
|
|
tags: mail, spam, exim, репост
|
|
|
|
---
|
|
|
|
|
|
|
|
Антиспам - это конечно хорошо, но это всего лишь тупой робот с набором правил.
|
|
|
|
Ошибки в настройке случаются и у наших корреспондентов.
|
|
|
|
|
|
|
|
Типовая ситуация: юзеру лень писать тему в письме из 2х pdf'ок.
|
|
|
|
Антиспам про лень юзера ничего не знает и видя отсутствие Subject'а - задирает ему итоговый балл.
|
|
|
|
|
|
|
|
Ещё пример: секретарша Марина херачит рассылку на всех 200 клиентов компании одним письмом.
|
|
|
|
Может ей домой побыстрее надо, или курить - не важно, получается письмо с 200 адресами.
|
|
|
|
Антиспам опять отреагирует в меру своего разумения: задерёт балл такому письму.
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
Репутация доменов
|
|
|
|
-----------------
|
|
|
|
|
|
|
|
Так вот, чтобы такого не случалось - можно привлечь к переобучению системы самих пользователей,
|
|
|
|
причём не требуя от них ничего сверх их обычной работы - писать письма и отвечать на них.
|
|
|
|
|
|
|
|
Логика такая: если юзер регулярно пишет почту на какой-нибудь домен - давать этому домену определённый бонус на антиспаме.
|
|
|
|
Если писать перестал - через какое-то время удалять.
|
|
|
|
|
|
|
|
Вот небольшой [скриптик](update-known-domains.pl.gz), который на основе логов exim'а ведёт базу "хороших" доменов,
|
|
|
|
по окончании работы выгружая результат в файлик, который может быть использован в качестве domainlist'а exim'а.
|
|
|
|
|
|
|
|
Запускать в самом конце дня, но перед ротацией логов. Схему sqlite-базы смотри в самом файле, в конце.
|
|
|
|
Все настройки - в начале скрипта.
|
|
|
|
|
|
|
|
Останется в антиспаме добавить правило, которое будет искать заголовок `X-Known-Domain` и реагировать соответственно.
|
|
|
|
|
|
|
|
Настройки exim'а смотри ниже.
|
|
|
|
|
|
|
|
Хранилище спама
|
|
|
|
---------------
|
|
|
|
|
|
|
|
Для удобства обслуживания и контроля работы неплохо бы периодически мониторить систему в части "какие письма попадают в спам".
|
|
|
|
Здесь показывается, как донастроить exim, что он откладывал копию подозрительных писем в отдельный ящик.
|
|
|
|
|
|
|
|
В данном случае ящик в виде стандартного maildir находится на пересылающем сервере.
|
|
|
|
К нему можно подцепиться mutt'ом или отдавать по pop3/imap через dovecot наружу.
|
|
|
|
Это очень удобно -- в почтовом клиенте рядом с "рабочей" просто заводится вторая учётка.
|
|
|
|
С утра проглядел "улов" за ночь, если надо - поправил настройки, Ctrl-A, Del.
|
|
|
|
|
|
|
|
В секцию с роутерами. Порядок роутеров важен, так что их нужно вставить ДО роутера, который непосредственно доставляет почту.
|
|
|
|
``no_verify`` - не проверять получателя, ``unseen`` - продолжать поиск роута дальше.
|
|
|
|
|
|
|
|
# отлавливаем подозрительное для последующего разбора
|
|
|
|
# с этим роутом совпадает всё, что а) идёт в нашу сторону, б) мы посчитали спамом в check_data
|
|
|
|
gw_possible_spam:
|
|
|
|
driver = manualroute
|
|
|
|
condition = ${if eq{$header_x-spam-status:}{Yes} {yes}{no}}
|
|
|
|
domains = +our_domains
|
|
|
|
route_list = * localhost
|
|
|
|
transport = spamarchive
|
|
|
|
no_verify
|
|
|
|
unseen
|
|
|
|
|
|
|
|
# отлавливаем заведимо "хорошие" письма (ham), с ограниченного набора хостов, для обучения байеса
|
|
|
|
gw_certainly_ham:
|
|
|
|
driver = manualroute
|
|
|
|
condition = ${if match_ip{$sender_host_address}{+relay_from_hosts} {yes}{no}}
|
|
|
|
condition = ${if match_domain{$sender_address_domain}{+our_domains} {yes}{no}}
|
|
|
|
condition = ${if <{$message_body_size}{512K} {yes}{no}}
|
|
|
|
domains = !+our_domains
|
|
|
|
route_list = * localhost
|
|
|
|
transport = hamarchive
|
|
|
|
no_verify
|
|
|
|
unseen
|
|
|
|
|
|
|
|
В секцию с транспортами:
|
|
|
|
|
|
|
|
hamarchive:
|
|
|
|
driver = appendfile
|
|
|
|
user = spamarchive
|
|
|
|
group = spamarchive
|
|
|
|
create_directory = true
|
|
|
|
maildir_format = true
|
|
|
|
directory = /usr/home/spamarchive/ham/
|
|
|
|
|
|
|
|
spamarchive:
|
|
|
|
driver = pipe
|
|
|
|
user = spamarchive
|
|
|
|
group = spamarchive
|
|
|
|
delivery_date_add
|
|
|
|
envelope_to_add
|
|
|
|
command = /usr/lib/dovecot/deliver -d spamarchive -f $sender_address
|
|
|
|
temp_errors = 64 : 69 : 70 : 71 : 72 : 73 : 74 : 75 : 78
|
|
|
|
log_output
|
|
|
|
|
|
|
|
Последний тоже можно заменить на ``appendfile``, но я предпочитаю отдать его dovecot'у с sieve.
|
|
|
|
Тот же dovecot потом используется для копания в архиве по imap'у, и управления правилами sieve.
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
[К оглавлению](/articles/2016/04/10/hardcore-mail-relay-1/),
|
|
|
|
[Далее: Базовая настройка rspamd](/articles/2016/04/29/hardcore-mail-relay-6/)
|