Jail (в fail2ban)
Jail (в fail2ban) это отдельный набор правил мониторинга внутри fail2ban, направленный на конкретный сервис, например sshd jail или nginx-http-auth jail, каждый со своими условиями блокировки.
Почему на одном сервере обычно работает несколько jail одновременно
Каждый jail следит за своим лог-файлом и сервисом, поэтому сервер, открывающий SSH, веб-приложение и почту, может одновременно запускать три отдельных jail, каждый со своими порогами бана, настроенными под нормальный трафик этого конкретного сервиса.
Что идёт не так при неправильной настройке jail
Jail, указывающий на неверный путь к лог-файлу, или использующий регулярное выражение фильтра, не соответствующее реальному формату лога на конкретном дистрибутиве, молча не срабатывает, оставляя оператора думать, что он защищён, хотя банов на самом деле не происходит.
Как шаг за шагом писать и проверять jail, показано здесь: руководство по настройке fail2ban.
Устройство определения jail
Jail это раздел конфигурации, который связывает источник логов с фильтром. Составные части определены на странице руководства jail.conf(5). Параметр filter называет файл в /etc/fail2ban/filter.d/ без расширения, и указать можно только один фильтр. logpath перечисляет отслеживаемые лог-файлы и допускает шаблоны. journalmatch сужает выборку записей журнала и применяется только в backend systemd и auto. Сам backend может быть auto, pyinotify, polling или systemd, а в jail можно указать несколько действий, каждое на отдельной строке. Собственный jail для вашего приложения может выглядеть так:
# /etc/fail2ban/jail.d/myapp.local
[myapp-login]
enabled = true
filter = myapp-login
logpath = /var/log/myapp/*.log
maxretry = 3
bantime = 2h
Соответствующий фильтр myapp-login.conf должен лежать в filter.d. Конфигурация читается в строгом порядке: jail.conf, затем jail.d/*.conf, затем jail.local, затем jail.d/*.local, поэтому файл .local всегда переопределяет поставляемые значения. Имя фильтра может нести и параметры в скобках, например форма sshd[mode=aggressive] из страницы руководства fail2ban-regex; какие режимы поддерживает установленный фильтр, смотрите в комментариях его файла.
Повседневная работа с отдельным jail
Команды, которые понадобятся после запуска jail, описаны на странице fail2ban-client(1):
sudo fail2ban-client status sshd
sudo fail2ban-client get sshd banip --with-time
sudo fail2ban-client banned 203.0.113.9
sudo fail2ban-client set sshd unbanip 203.0.113.9
sudo fail2ban-client get sshd ignoreip
Команда status принимает необязательный вариант вывода (basic, cymru, short или stats). banned без аргументов перечисляет все jail, где сейчас есть баны, а с адресом показывает, какие jail его заблокировали, и этим сразу отвечает на вопрос «кто заблокировал клиента». unban --all снимает баны во всех jail и в базе одним действием, поэтому оставьте её для экстренных случаев, а для одного адреса используйте unbanip. Исключить адрес из банов можно и на лету командой set sshd addignoreip.
Считайте команды времени выполнения временными, а всё постоянное записывайте в jail.local, чтобы файл конфигурации оставался источником истины. После изменения убедитесь командой status, что jail по-прежнему считает совпадения. Готовые jail для SSH и nginx показаны в руководстве по настройке, а как получать оповещение, когда jail перестал банить, объясняет руководство по мониторингу.
Связанные термины: fail2ban, Intrusion prevention, Атака подбором.
Часто задаваемые вопросы
У всех jail одинаковые настройки бана?
Нет, каждый jail может иметь свои пороги, время бана и фильтр, настроенные независимо в файле jail.local fail2ban или аналогичном.
Как проверить, что конкретный jail реально активен?
Выполните fail2ban-client status, чтобы увидеть все активные jail, и fail2ban-client status <имя_jail>, чтобы увидеть текущие баны и количество совпадений для конкретного jail.
Можно ли написать кастомный jail для приложения без готовой поддержки?
Да. fail2ban поддерживает кастомные фильтры на основе регулярных выражений, применяемые к любому лог-файлу, а не только к встроенным определениям сервисов.
Как узнать, какой jail забанил адрес?
Выполните fail2ban-client banned и укажите адрес. Команда вернёт jail, в которых этот адрес сейчас забанен.
Можно ли исключить адрес только для одного jail?
Да. ignoreip является параметром jail, поэтому укажите адрес в разделе нужного jail или добавьте его на лету командой fail2ban-client set с именем jail и addignoreip.
Хотите увидеть, в каком состоянии ваш сервер?
Запустите бесплатную read-only проверку сервера или откройте Security Lab и посмотрите цикл обнаружение, сдерживание, восстановление, проверка в действии.
Получить бесплатную проверку сервераОткрыть Security Lab