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