Представляю свой вариант реализации Fail2Ban под Windows -
SpyLog.
SpyLog состоит из 3 процессов Filter, Jail, Action. Связь между процессами
организована через PUB/SUB ZeroMQ сокеты. Это означает что связь возможно
настроить как многие-ко-многим и запускать процессы на разных машинах.
В пределах одной машины SpyLog можно запускать как один многопоточный процесс
или как несколько однопоточных процесса.
SpyLog написан на Lua и по умолчанию использует регулярные выражения Lua, но при
необходимости возможно использовать библиотеку PCRE.
SpyLog способен обрабатывать лог записи из различных источников:
* текстовые файлы
* SysLog (SpyLog работает как UDP SysLog сервер)
* SNMP Trap сообщения
* Windows EventLog (через проброс сообщений как SNMP Trap)
* FreeSWITCH ESL подключение (SpyLog подключается к FS и подписывается на `LOG` сообщения)
* Raw TCP подключение (SpyLog устанавливает TCP соединение и читает данные как текстовый поток)
Для выполнения действий SpyLog предоставляет 3 базовых метода
* spawn - запуск внешнего процесса
* mail - отсылка электронной почты
* growl - отсылка Growl сообщения
Так же на основе `spawn` реализованы действия
* ipsec - для добавления IP адреса в IPSec фильтр
* advfirewall - для создания новых правил в Windows Firewall.
Все настройки IPSec/Firewall необходимо производить отдельно.
Важные отличия от Fail2Ban
* При остановке SpyLog не выполняет ни каких `unban` действий.
Т.е. все заблокированные IP остаются заблокированными.
* Т.к. Jail и Action это разные и независимые процессы то SpyLog не предоставляет возможности
реализации `actionstart` и `actionstop` для Jail.
* Нет переменной `<HOST>` и в правилах надо использовать явные правила
* SpyLog не предоставляет способа разблокировать определенный IP.
(Еще не уверен как это лучше сделать)
Пример реализации простого правила для FreeSWITCH для подсчета кол-ва неудачных попыток авторизации.
Код:
-- config/sources/freeswitch.lua
SOURCE{"freeswitch",
"esl:ClueCon@127.0.0.1:8021",
level = 'WARNING';
}
-- config/filters/freeswitch.lua
FILTER{ "freeswitch-auth-fail";
enabled = true;
source = "freeswitch";
failregex = {
"^(%d%d%d%d%-%d%d%-%d%d %d%d:%d%d:%d%d%.%d+) %[WARNING%] sofia_reg.c:%d+ SIP auth failure %([A-Z]+%) on sofia profile %'[^']+%' for %[.-%] from ip ([0-9.]+)%s*$";
}
};
-- config/jails/freeswitch.lua
JAIL{"voip-auth-fail";
enabled = true;
filter = {"freeswitch-auth-fail"};
findtime = 600;
maxretry = 3;
bantime = 3600 * 24;
action = {"ipsec", "mail"};
}