Browse Source

+ /articles/2016/04/20/hardcore-mail-relay-5/

master
Alex 'AdUser' Z 9 years ago
parent
commit
f95b9a1c10
  1. 2
      articles/2016/04/10/hardcore-mail-relay-1/index.markdown
  2. 3
      articles/2016/04/15/hardcore-mail-relay-4/index.markdown
  3. 99
      articles/2016/04/20/hardcore-mail-relay-5/index.markdown
  4. BIN
      articles/2016/04/20/hardcore-mail-relay-5/update-known-domains.pl.gz

2
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

3
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]: Себя не попиаришь - так и помрёшь в безвестности.

99
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/)

BIN
articles/2016/04/20/hardcore-mail-relay-5/update-known-domains.pl.gz

Binary file not shown.
Loading…
Cancel
Save