Вопрос или проблема
Пытаюсь заставить 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 или сообществу для получения более детальной помощи.