Настройка серых списков (Greylisting) в Zimbra при помощи Policyd
Серые списки (англ. Greylisting) - способ автоматической блокировки спама, основанный на том, что если почтовый сервер получателя отказывается принять письмо и сообщает о «временной ошибке», сервер отправителя обязан позже повторить попытку. Спамерское программное обеспечение в таких случаях, обычно, не пытается этого делать. (с) Wikipedia.
В Zimbra управление серыми списками возможно через плагин Pilicyd. Как установить плагин с web-интерфейсом можно прочитать в статье Установка плагина Policyd с web-интерфейсом в Zimbra.
После установки плагина доступ к управлению можно получить по ссылке http://mail.example.org:7780/webui/index.php.
Для начала заполним группы internal_ips и internal_domains, которые создаются после установки (Policies - Groups). Добавьте локальные подсети и домены, которые обслуживает ваш почтовый сервер соответственно.
По умолчанию помимо прочих создаётся политика Default Inbound, в нее попадают письма, отправленные извне, и предназначенные для нашего сервера:
Создание правила Greylisting
Создадим правило проверки серых списков (Greylisting - Configure - Action: Add) для политики Default Inbound (параметр Link to policy):
Логика работы Greylisting заключается в том, что при первоначальной попытке доставить письмо в вашу систему, сервер-получатель обрывает соединение, а серверу отправителю выдаётся сообщение о временной недоступности вашего сервера.
Данные об отправителе попадают в базу данных Policyd, такая запись называется «триплет» (triplet), данные могут заноситься на основе ip-адреса отправителя или его подсети (за это отвечает параметр Track).
Если через оговоренный промежуток времени (Greylist Period) или позднее отправитель снова попытается отправить письмо, то Policyd в случае наличия триплета, доставит данное письмо получателю, отметив триплет как успешный. Следующие сообщения от отправителя будут приниматься без задержек (при наличии успешного триплета).
После того как количество удачных триплетов от отправителя станет больше определенного значения (AWL After Count) его адрес добавится в белый список, где будет храниться определенное количество секунд (AWL For Period).
Аналогичная ситуация с черным списком (Auto-Blacklisting).
Включим использование Greylisting в Zimbra:
$ zmprov mcf zimbraCBPolicydGreylistingEnabled TRUE
Перезапускаем плагин Policyd
# su - zimbra -c "zmcbpolicydctl restart"
Как посмотреть результат работы Policyd Greylisting
Посмотреть результат работы Greylisting можно по логам:
# cat /opt/zimbra/log/cbpolicyd.log | grep "module=Greylisting"
[2017/01/27-11:21:38 - 19099] [CORE] INFO: module=Greylisting, action=defer, host=94.58.111.82, helo=mx.itzx.ru, from=info@itzx.ru, to=test@example.org, reason=greylisted
[2017/01/27-11:28:01 - 21325] [CORE] INFO: module=Greylisting, action=pass, host=94.58.111.82, helo=mx.itzx.ru, from=info@itzx.ru, to=test@example.org, reason=authenticated
[2017/01/27-11:28:10 - 19681] [CORE] INFO: module=Greylisting, action=pass, host=94.58.111.82, helo=mx.itzx.ru, from=info@itzx.ru, to=test@example.org, reason=authenticated
Как видно сначала письмо откинуто (action=defer) по причине занесения в серый список (reason=greylisted), затем спустя несколько минут уже принято (action=pass), все последующие письма от info@itzx.ru с адреса 94.58.111.82 будут приняты сразу.
Теперь посмотрим, что добавилось в базу данных:
# su - zimbra
$ sqlite3 /opt/zimbra/data/cbpolicyd/db/cbpolicyd.sqlitedb
sqlite> select * from greylisting_tracking;
SenderIP:94.58.111.82/32|info@itzx.ru|test@example.org|1485501698|1485515309|1|2
Оптимизация работы Policyd
Параметры сервера
Чтобы оптимизировать работу плагина для ваших нужд установите параметры в соответствии с рекомендациями:
Small mailserver: 2, 2, 4, 10, 1000
Medium mailserver: 4, 4, 12, 25, 1000
Large mailserver: 8, 8, 16, 64, 1000
Например для Small mailserver:
zmprov mcf zimbraCBPolicydMinServers 2
zmprov mcf zimbraCBPolicydMinSpareServers 2
zmprov mcf zimbraCBPolicydMaxSpareServers 4
zmprov mcf zimbraCBPolicydMaxServers 10
zmprov mcf zimbraCBPolicydMaxRequests 1000
zmcbpolicydctl restart
Описание параметров можно найти в файле /opt/zimbra/conf/cbpolicyd.conf.in.
Периодическая очистка базы данных
Для автоматической очистки базы добавьте в crontab задание:
35 3 * * * /opt/zimbra/cbpolicyd/bin/cbpadmin --config=/opt/zimbra/conf/cbpolicyd.conf --cleanup >/dev/null
Скрипт для очистки таблицы session_tracking
При большой активности сервера таблица session_tracking может сильно разрастись и ее придётся периодически чистить, например раз в день.
Для этого создайте скрипт:
# mcedit /opt/zimbra/log/scripts/purge_cbpolicyd_daily.sql
delete from session_tracking where ((strftime('%s','now') - UnixTimestamp) > 86400);
vacuum;
Добавьте задание в zimbra.crontab:
su - zimbra
$ crontab -e
после строки:
# ZIMBRAEND -- DO NOT EDIT ANYTHING BETWEEN THIS LINE AND ZIMBRASTART
вставьте:
0 * * * * cat /opt/zimbra/log/scripts/clean_cbpolicyd_daily.sql sqlite3 /opt/zimbra/data/cbpolicyd/db/cbpolicyd.sqlitedb