Один из возможных вариантов автоматизации обработки уведомлений от FBL сервисов почтовых систем. Пишем на bash простую обработку и подсчёт таких сообщений на сервере с Zimbra.
Итак, у нас имеется хостинг-провайдер, который для работы с почтой использует Zimbra. Провайдер подписался на уведомления от FBL сервисов. Теперь ему приходят уведомления от почтовых систем с информацией о том, с какого IP отправлялись письма, помеченные пользователями как спам. При этом, уведомления присланные в один день могут содержать уже не актуальную информацию прошлой недели, например. Провайдеру хочется автоматизировать работу с такими уведомлениями, и вести подсчёт только актуальных спам-реакций. Попробуем сделать это с помощью скрипта.
Условимся, что скрипт будет обрабатывать уведомления пришедшие в указанную дату. При этом, скрипт будет проверять дату в самом уведомлении и учитывать только те инциденты, которые произошли в трёхдневный актуальный срок.
Для реализации нам потребуется:
- Ящик для уведомлений (artem@mail.com).
- Созданная в нём директория (inbox/mail-ru-fbl).
- Фильтр, который будет все пришедшие письма в директорию складывать.
Эти три пункта настраиваются в интерфейсе 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 всегда приходят на один и тот же ящик, оказываются в одной и той же директории, созданной пользователем, эти параметры мы может не обсчитывать каждый раз, а прописать их в скрипте сразу же.
Скрипт подсчёта.
В рамках самого скрипта мы действуем следующим образом:
- Получаем в качестве параметра дату поиска. Конвертируем её в удобный для работы формат. Получаем две предыдущих даты.
- Получаем список всех писем за указанную дату, забираем их ID.
- Для каждого письма получаем полный путь на сервере, выбираем из этого письма дату случившегося, и оставляем только те инциденты, которые произошли в последние три дня (от указанной даты поиска).
- Сортируем все попавшие под условия 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