fail2ban | fail2ban-regex соответствует напрямую, но не в фильтре

Вопрос или проблема

Пытаюсь заставить fail2ban работать так, как мне нужно, на сервере AlmaLinux 9. Меня действительно озадачивает один момент, с которым, я надеюсь, кто-то сможет мне помочь. Допустим, я хочу заблокировать IP на всех портах, если fail2ban находит следующую строку в /var/log/secure: “Неудачная попытка входа для недействительного пользователя ButtFacedDog с 111.222.333.444 на порту 666 ssh2”

Так что, универсальной точкой начала для regex fail2ban может быть:

^.*Неудачная попытка входа для недействительного пользователя .* с <HOST> на порту \d+ ssh2$

Если я попробую

 fail2ban-regex /var/log/secure '^.*Неудачная попытка входа для недействительного пользователя .* с <HOST> на порту \d+ ssh2$' --print-all-matched

это прекрасно срабатывает. Находит все совпадения и выводит их красиво отформатированными.

Но…если я попытаюсь встроить regex в фильтр (в filter.d), который я назову invalid_user, содержащий следующее:

 [Определение]
 failregex =  ^.*Неудачная попытка входа для недействительного пользователя .* с <HOST> на порту \d+ ssh2$
 ignoreregex =

по-видимому, это совершенно не работает (возможно, поэтому fail2ban не блокирует IP-адреса, которые, я думаю, он должен блокировать, основываясь на содержимом /var/log/secure). Если я выполню

 fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/invalid_user.conf

он возвращает…мусор (то есть я не имею понятия, что он выводит и почему — где все IP-адреса? Первый раз, когда я явно передал regex в fail2ban-regex, он напечатал все из них).

Например,

 Результаты
 =======

 Failregex: 58402 всего
 |-  #) [кол-во совпадений] регулярное выражение
 |    1) [58402] ^.*Неудачная попытка входа для недействительного пользователя .* с <HOST> на порту \d+ ssh2$
 `-

 Ignoreregex: 0 всего

 Заметки по шаблону даты:
 |- [кол-во совпадений] формат даты
 |  [278861] {^LN-BEG}(?:ДЕНЬ )?МЕС Язык %k:Минуты:Секунды(?:\.Микросекунды)?(?: ExГод)?
 `-

Существует ли простое объяснение, почему такая разница? Более того (возможно), как мне это заставить работать? Кажется, что аргумент <HOST> интерпретируется по-разному в двух подходах.

Заранее спасибо. Буду признателен за указания на очевидные ошибки, которые я, возможно, совершаю.

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, как Fail2ban интерпретирует регулярные выражения в контексте фильтров и их тестирования. Давайте рассмотрим основные аспекты, чтобы понять вашу ситуацию и найти решение.

1. Разница между fail2ban-regex и фильтрами

Когда вы используете fail2ban-regex с прямым вводом регулярного выражения, оно работает в режиме тестирования, где он просто ищет совпадения. В этом случае Fail2ban принимает ваше регулярное выражение как есть, включая <HOST>, который правильно интерпретируется для извлечения IP-адреса.

Однако, когда вы интерпретируете регулярное выражение через файл фильтра (filter.d), могут возникнуть различия в интерпретации. Fail2ban использует определенные шаблоны и символьные обозначения, которые могут изменять поведение фильтров.

2. Проверка фильтра

Ваш фильтр, содержащий:

[Definition]
failregex = ^.*Failed password for invalid user .* from <HOST> port \d+ ssh2$
ignoreregex =

очевидно, правильно задан. Тем не менее, Fail2ban может не распознать <HOST> или неправильно интерпретировать его. После проверки, уточните следующее:

  • Убедитесь, что вы не имеете дополнительных пробелов или символов в фильтре.
  • Проверьте правильность расположения файла фильтра: /etc/fail2ban/filter.d/invalid_user.conf.
  • Осуществите перезапуск службы Fail2ban после внесения изменений в конфигурацию.

3. Логи и отладка

Чтобы лучше понять, что происходит, увеличьте уровень журналирования Fail2ban, изменив его настройки в fail2ban.conf или jail.local. Установите уровень логирования на DEBUG, чтобы получить больше информации, что происходит во время обработки вашего фильтра.

Пример изменения конфигурации:

[log]
loglevel = DEBUG

После изменения, перезапустите Fail2ban и проверьте логи на наличие ошибок, которые могут объяснить, почему фильтр не работает, как ожидается.

4. Альтернативное решение

Если вы все еще сталкиваетесь с проблемами, можно протестировать фильтры на маленьком объеме логов или использовать статические образцы. Также можно изменить формат записи регулярного выражения, чтобы более явно указать IP-адрес, например:

failregex = ^.*Failed password for invalid user .* from (?P<host>\d{1,3}(?:\.\d{1,3}){3}) port \d+ ssh2$

В данном случае, вы явно задаете шаблон для IP-адреса, что может помочь избежать недоразумений.

Заключение

Подводя итог, основная проблема может заключаться в различной интерпретации <HOST> в различных контекстах. Убедитесь, что ваш фильтр корректно оформлен, изучите логи для получения дополнительной информации и попробуйте улучшить регулярное выражение для большей очевидности. Если все перечисленные советы не помогут, рекомендуется обратиться к официальной документации Fail2ban или сообществу для получения более детальной помощи.

Оцените материал
Добавить комментарий

Капча загружается...