[exim-conf] ratelimit на количество попыток SMTP аунтентификации при отсутствии анонса аутентификации

Victor Ustugov victor на corvax.kiev.ua
Ср Ноя 28 02:26:36 EET 2018


Victor Ustugov wrote on 26.11.2018 22:45:
приветствую

реализовано ограничение на попыток SMTP аунтентификации при отсутствии
анонса аутентификации.

речь идёт о ситуациях, когда SMTP клиент не обращает внимание на
отсутствие AUTH в ответе на EHLO и пытается аутентифицироваться. т. е.
речь идёт не о чём ином, как о подборе паролей.

в этом случае в лог файл выводится сообщение типа такого:

2018-11-28 00:53:40 SMTP protocol error in "AUTH LOGIN" H=(CFsXKBQBaN)
[36.25.218.210] AUTH command used when not advertised


для включения рейтлимита нужно добавить значение
AUTH_WHEN_NOT_ADVERTISED в параметр confRATELIMIT и пересобрать конфиг.

настройки ratelimit'ов на количество несуществующих адресов получателей
в письмах от аутентифицированных отправителей в файле
ratelimit-host-auth-when-not-advertised указываются в таком же виде, как
и настройки остальных ratelimit'ов:

аргумент : лимит : действие : сообщение

где:
аргумент	- адрес хоста отправителя
лимит		- ограничение в виде "количество / период"
действие	- действие, применяемое к письму (может отсутствовать)
сообщение	- сообщение SMTP клиенту

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

"лимит" указывается в виде "количество_сообщений / период_времени".
"период_времени" указывается в виде 5s, 10m30s, 1h10m и т. д.
указывать лимит больше единицы смысла нет.

возможные действия:
ok		- исключение из проверки
skip		- синоним для ok
warn		- вывод предупреждения в файл протокола и добавление в
		письмо поля заголовка
reject		- отказ в приеме сообщения
deny		- синоним для reject
defer		- возврат временной ошибки
greylist=X	- добавление X баллов к счетчику опционального
		грейлистинга
reject=X	- добавление X баллов к счетчику опционального reject'а
delay=zz	- задержка на zz секунд перед продолжением обработки
		сообщения
pause=zz	- синоним delay=zz

при отсутствии явно указанного действия по умолчанию применяется
действие drop.

набор действий вполне традиционный, но на самом деле кроме drop тут вряд
ли что-то будет полезно.

пример:

* : 0.1 / 4h : drop : Too many failed authentication attempts from your
host. Try again later

в качестве сообщения SMTP клиенту указывается не столько само сообщение,
сколько его уточнение, т. е. вторая часть сообщения. сначала будет
выведено сообщение "Too many authentication attempts". в уточнении
сообщения SMTP клиенту можно использовать вычисляемые выражения,
например в нем можно использовать переменные $sender_rate,
$sender_rate_limit и $sender_rate_period также, как и в действии.

в общем, всё как всегда.

следует понимать, что в случае первой попытки аутентификации без её
анонса выловить такую ситуацию можно будет только в acl_check_quit или
acl_check_notquit.

при срабатывании рейтлимита в этих ACL данные о хосте будут сохранены в
/var/spool/exim/db/ratelimit. а вот при следующем коннекте с искомого
хоста ранее сохранённое значение будет проверено в acl_check_connect и
может быть выполнено действие, описанное в
ratelimit-host-auth-when-not-advertised.

и если в качестве значения "лимит" будет указано 1 или более, то при
втором коннекте (если коннекты будут идти не подряд) значение
$sender_rate будет уже меньше единицы и рейтлимит в acl_check_connect не
сработает.

но т. к. почти наверняка в ходе второго коннекта точно также будет
предпринята попытка аутентификаци, значение $sender_rate уже будет
близко к 2 и при единице в лимите рейтлимит в acl_check_connect уже
может вполне сработать.

в ходе тестов я просто ставил лимит 0.1 / 4h, в этом случае даже при
относительно большой периодичности коннектов с одного хоста он вполне
попадёт под рейтлимит.

осталось для этого и других рейтлимитов реализовать действие block с
указанием периода блокировки. сохранять данные о хосте в
mysql/sqlite/memcached/redis и при следующих коннектах c таких хостов
выполнять в acl_check_connect deny/drop относительно длительное время.

хотя для конкретно этого рейтлимита можно указать время даже не 4h, а в
разы большее.

-- 
Best wishes
Victor Ustugov        mailto:victor на corvax.kiev.ua
public GnuPG/PGP key: https://victor.corvax.kiev.ua/corvax.asc
Skype ID: corvax_nb   JID: victor на corvax.kiev.ua



Подробная информация о списке рассылки exim-conf