diff --git a/articles/2016/04/10/hardcore-mail-relay-1/index.markdown b/articles/2016/04/10/hardcore-mail-relay-1/index.markdown index 7ac7a1c..8ff2818 100644 --- a/articles/2016/04/10/hardcore-mail-relay-1/index.markdown +++ b/articles/2016/04/10/hardcore-mail-relay-1/index.markdown @@ -20,7 +20,7 @@ tags: mail, spam, exim, zabbix, rspamd, репост * DKIM * антиспам * антивирус -- Обратная связь и переобучение системы +- [Обратная связь и переобучение системы](/articles/2016/04/10/hardcore-mail-relay-1/) * переобучение антиспама * репутация доменов - Базовая настройка rspamd diff --git a/articles/2016/04/15/hardcore-mail-relay-4/index.markdown b/articles/2016/04/15/hardcore-mail-relay-4/index.markdown index aa272b3..a90d786 100644 --- a/articles/2016/04/15/hardcore-mail-relay-4/index.markdown +++ b/articles/2016/04/15/hardcore-mail-relay-4/index.markdown @@ -232,6 +232,7 @@ spamassassin прикручивается почти так же, надо по --- -[К оглавлению](/articles/2016/04/10/hardcore-mail-relay-1/) +[К оглавлению](/articles/2016/04/10/hardcore-mail-relay-1/), +[Далее: Обратная связь и переобучение системы](/articles/2016/04/10/hardcore-mail-relay-1/) [^fn1]: Себя не попиаришь - так и помрёшь в безвестности. diff --git a/articles/2016/04/20/hardcore-mail-relay-5/index.markdown b/articles/2016/04/20/hardcore-mail-relay-5/index.markdown new file mode 100644 index 0000000..559a66d --- /dev/null +++ b/articles/2016/04/20/hardcore-mail-relay-5/index.markdown @@ -0,0 +1,99 @@ +--- +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/) diff --git a/articles/2016/04/20/hardcore-mail-relay-5/update-known-domains.pl.gz b/articles/2016/04/20/hardcore-mail-relay-5/update-known-domains.pl.gz new file mode 100644 index 0000000..7a9311e Binary files /dev/null and b/articles/2016/04/20/hardcore-mail-relay-5/update-known-domains.pl.gz differ