Alex 'AdUser' Z
9 years ago
4 changed files with 102 additions and 2 deletions
@ -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/) |
Binary file not shown.
Loading…
Reference in new issue