Zimbra и обработка FBL уведомлений

Один из возможных вариантов автоматизации обработки уведомлений от FBL сервисов почтовых систем. Пишем на bash простую обработку и подсчёт таких сообщений на сервере с Zimbra.

Итак, у нас имеется хостинг-провайдер, который для работы с почтой использует Zimbra. Провайдер подписался на уведомления от FBL сервисов. Теперь ему приходят уведомления от почтовых систем с информацией о том, с какого IP отправлялись письма, помеченные пользователями как спам. При этом, уведомления присланные в один день могут содержать уже не актуальную информацию прошлой недели, например. Провайдеру хочется автоматизировать работу с такими уведомлениями, и вести подсчёт только актуальных спам-реакций. Попробуем сделать это с помощью скрипта.

Условимся, что скрипт будет обрабатывать уведомления пришедшие в указанную дату. При этом, скрипт будет проверять дату в самом уведомлении и учитывать только те инциденты, которые произошли в трёхдневный актуальный срок.

Для реализации нам потребуется:

  1. Ящик для уведомлений (artem@mail.com).
  2. Созданная в нём директория (inbox/mail-ru-fbl).
  3. Фильтр, который будет все пришедшие письма в директорию складывать.

Эти три пункта настраиваются в интерфейсе Zimbra на уровне пользователя. Далее нам придётся немного поковырять Zimbra, так как нам нужно научиться определять:

  • message id — идентификатор конкретного письма.
  • mailbox id — идентификатор почтового ящика.
  • mboxgroup — имя базы данных пользователя, которому принадлежит ящик.
  • file bits — параметр базы данных, который нужен для определения пути для письма.
  • непосредственно сам полный путь до конкретного письма.
ID письма.

ID конкретного письма (а нам нужно будет получить ID всех писем от FBL, попадающих под обозначенные ранее условия) можно получить с помощью поискового запроса:

$ zmmailbox -z -m artem@mail.com s -t message -l 1000 "in:inbox/mail-ru-fbl date:29.05.2018

Здесь мы в ящике artem@mail.com, в директории inbox/mail-ru-fbl ищем все письма от 29 мая 2018 года.

Запрос этот запоминаем, в скрипте мы будем использовать его, подставив нужные переменные.

ID ящика.

Идентификатор почтового ящика получаем так:

$ zmprov getMailboxInfo artem@mail.com
mailboxId: 6
Нужная база данных.

Для того, что бы найти правильную базу mboxgroup*, подсчитаем:

$ expr 6 % 100
6

В нашем случае, базой, в которую мы пойдём за остальными параметрами будет mboxgroup6.

Полный путь до письма.

Откроем БД, и найдём полный путь до письма (пусть ID письма будет 236223).

$ mysql mboxgroup6

MariaDB [mboxgroup6]> select * from zimbra.volume;

В результате выполнения этого запроса мы получаем ещё одну часть нужных нам параметров:

  • path — /opt/zimbra/store
  • file_bits — 12

С учётом особенностей хранения писем в Zimbra получим два значения, с помощью которых будет найден полный путь до сообщения:

$ perl -le 'print $ARGV[1] >> $ARGV[0]' 12 6 
0

$ perl -le 'print $ARGV[1] >> $ARGV[0]' 12 236223
57

Шестёрка здесь — это mailboxId, а 236223 — id письма. Составляем полный путь, и проверяем наличие файла по нему:

/opt/zimbra/store/первое_значение/id_ящика/msg/второе_значение/id_письма-*.msg
$ ls /opt/zimbra/store/0/6/msg/57/236223-*.msg 
/opt/zimbra/store/0/6/msg/57/236223-287348.msg

Полученные в ходе исследования всего этого добра команды оборачиваем в скрипт. При этом, так как уведомления от FBL всегда приходят на один и тот же ящик, оказываются в одной и той же директории, созданной пользователем, эти параметры мы может не обсчитывать каждый раз, а прописать их в скрипте сразу же.

Скрипт подсчёта.

В рамках самого скрипта мы действуем следующим образом:

  1. Получаем в качестве параметра дату поиска. Конвертируем её в удобный для работы формат. Получаем две предыдущих даты.
  2. Получаем список всех писем за указанную дату, забираем их ID.
  3. Для каждого письма получаем полный путь на сервере, выбираем из этого письма дату случившегося, и оставляем только те инциденты, которые произошли в последние три дня (от указанной даты поиска).
  4. Сортируем все попавшие под условия IP и составляем топ 10 тех, на кого в последние три дня пришло больше всего репортов.

В итоге, получился вот такой вот скрипт, который подсчитывает нужные данные. Запускается он будучи пользователем zimbra на сервере.

Что делать с полученными результатами уже решать хостеру — можно просто вручную связываться с самыми подозрительными, а можно добавить дополнительной автоматизации, при необходимости.

$ ./fbl.sh 03.05.2018
62 135.12.127.14
44 135.17.121.200
32 145.13.121.155
19 135.15.126.178
13 145.12.111.189
10 155.17.110.230
 5 125.18.121.254
 4 135.11.121.211
 4 135.13.121.144
 4 145.11.120.11

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *