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