_Заполните и отметьте ( [x]
) соответствующие поля. Если ваша версия Fail2Ban устарела,
и вы не можете убедиться, что проблема сохраняется в последнем выпуске, лучше обратитесь в службу поддержки
из дистрибутива вы получили Fail2Ban from_
datepattern для журнала tomcat не соответствует стандарту любых дат
Следовательно, фильтр улавливает нужную строку из журнала, но не может найти дату и время.
_Обзор здесь_
Шаблон даты, упомянутый в журналах tomcat: (/var/log/tomcat2/catalina.out)
**[06-Jun-2018_19:37:41,631]** [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status : Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>
фильтр, созданный для захвата вышеуказанного журнала:
failregex = (?:Authentication for user :) .*(?:from ip : (?P<host>\S*)).*(?:finished with status : Failure).*(?: Return Code : ).*
ignoreregex = (?:Authentication for user :) .*(?:from ip : (?P<host>\S*)).*(?:finished with status : Failure).*(?:Return Code : 114).*
Добавлена тюрьма в jail.local
[trialJail]
enabled = true
filter = multiService
action = iptables-multiport[name=trialJail, port="smtp,imap,pop3", protocol=tcp]
logpath = /var/log/tomcat2/catalina.out
findtime = 1200
bantime = 30
maxretry = 2
ignoreip =
_ желательно получить при запуске fail2ban с loglevel = 4
_
Jun 6 19:37:41 Master fail2ban.filter[7747]: WARNING Found a match for u'[06-Jun-2018_19:37:41,631] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status : Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>' but no valid date/time found for u'[06-Jun-2018_19:37:41,631] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status : Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>'. Please try setting a custom date pattern (see man page jail.conf(5)). If format is complex, please file a detailed issue on https://github.com/fail2ban/fail2ban/issues in order to get support for this format.
Строки журнала, над которыми я работаю: (строки, которые необходимо захватить)
[06-Jun-2018_17:07:42,500] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : **IMAP** from ip : 192.168.0.124 finished with status : Failure. unknown status. Return Code : 108. Execution finished in : 280 ms>
[06-Jun-2018_17:09:57,596] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : null from ip : null finished with status : Failure. invalid parameters are provided to function. Return Code : 106. Execution finished in : 1 ms>
[06-Jun-2018_17:25:20,653] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)] - <Authentication for user : [email protected] for service : **POP** from ip : 192.168.0.124 finished with status : Failure. unknown status. Return Code : 108. Execution finished in : 84 ms>
Основное внимание в этом вопросе уделяется тому, как разобрать шаблон даты?
Бонусный вопрос будет заключаться в том, как мне захватить все вышеперечисленные журналы в одном фильтре (то, над чем я сейчас работаю (порты: smtp, pop3, imap))
как разобрать шаблон даты
Ваш шаблон может быть, например, «^[%d-%b-%Y_%H:%M:%S,%f]».
Обратите внимание, в конфигурационных файлах вы должны указать его с двойным символом процента, например:
datepattern = ^\[%%d-%%b-%%Y_%%H:%%M:%%S,%%f\]
PoC:
$ fail2ban-regex -v -d '^\[%d-%b-%Y_%H:%M:%S,%f\]' "$str" 'from ip : <HOST>'
Running tests
=============
Use datepattern : ^\[Day-MON-Year_24hour:Minute:Second,Microseconds\]
Use failregex line : from ip : <HOST>
Use single line : [06-Jun-2018_17:07:42,500] [INFO] [mithi.mcs.auth....
Results
=======
Failregex: 1 total
|- #) [# of hits] regular expression
| 1) [1] from ip : <HOST>
| 192.168.0.124 Wed Jun 06 17:07:42 2018
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [1] ^\[Day-MON-Year_24hour:Minute:Second,Microseconds\]
`-
Lines: 1 lines, 0 ignored, 1 matched, 0 missed
[processed in 0.00 sec]
Также обратите внимание, что fail2ban вырезает шаблон даты и времени, совпадающий с датой, из строки перед поиском совпадения для failregex.
Бонусный вопрос
Бонусный ответ — читайте мануал, например начните с Regular Expression Syntax:: Python document .
Например, ваши зарегистрированные порты: smtp, pop3, imap могут быть чем-то вроде
for service : (?:SMTP|POP3|IMAP|null) from ip
,
или просто регулярное выражение \S+
без пробелов:
for service : \S+ from ip
...
Это сработало хорошо, спасибо, сэр
Другой вопрос: у меня есть шаблон игнорирования регулярного выражения для приведенных выше журналов, который экранирует код возврата: 114.
ignoreregex = .*(?:Return Code : 114.).*
Вышеупомянутая команда ignoreregex отлично работает, чтобы избежать кода возврата: 114.
Итак, вопрос в том, как мне упомянуть вышеупомянутое ignoreregex в самом failregex, чтобы захватить все коды, но не 114, чтобы избежать вычисления ignoreregex?
Неправильное выражение, которое работает для всех кодов, - (работает)
failregex = (?:for service :).* (?:smtp|POP|IMAP|null).*(?:from ip : <HOST>).*(?: finished with status : Failure.).*(?:Return Code : ).*
Failregex, который должен получить все коды, но не 114, - (не работает)
До сих пор я пытался,
> failregex = (?:for service :).* (?:smtp|POP|IMAP|null).*(?:from ip : <HOST>).*(?: finished with status : Failure.).*(?!.*Return Code : 114.).*
Что-то вроде .*(?!.*Return Code : 114.).*
никогда не будет работать (не говоря уже о том, что это уязвимо), потому что поймать все .*
всегда что-то найдет, например, по something. Return Code : 114.
он может неплохо поймать something. R
а остальные eturn Code : 114.
не соответствуют вашему отрицательному прогнозу.
Поэтому вы должны просто использовать более точный шаблон:
>>> import re
>>> cr = re.compile(r"\S+\. Return Code : (?!114)\d+\.")
>>> print(bool(cr.match("something. Return Code : 108.")))
True
>>> print(bool(cr.match("something. Return Code : 114.")))
False
И последнее, но не менее важное: не используйте универсальные выражения и пытайтесь привязывать регулярное выражение (по крайней мере, с одной стороны, например, с начала ^...
или с обоих ^...$
, обратите внимание .*$
или ^.*
не являются якорями и не имеют смысла).
Так что будьте более точны в регулярном выражении, особенно если в строке журнала может появиться какой-то сторонний (пользовательский) ввод. В противном случае вы сделаете его уязвимым для злоумышленника (например, манипулируя линией, он может избежать обнаружения или даже заставить забанить другой IP вместо своего реального IP).
Как мне реализовать это в регулярном выражении с ошибкой? Я предоставил рабочее регулярное выражение для всех чисел в своем предыдущем комментарии, я хочу реализовать такое, которое игнорирует 114 в самом отказоустойчивом выражении. Спасибо за ваше время и помощь :)
Извините, у банкомата нет времени, чтобы сделать ваше регулярное выражение полностью правильным. И я принципиально не принимаю быстрых и грязных решений.
Попробуйте сайты, похожие на stackoverflow.
Вот ты где:
^\s*\[\S+\]\s+\[[^\]]+\]\s+-\s+<Authentication for user : \S+[^:]* for service : \S+ from ip : <HOST> finished with status : Failure\.\s+(?:[^.]+\.)* Return Code : (?!114)\d+\.
Но, чуть более точный возможный фильтр будет выглядеть так:
[Definition]
# services (smtp,imap,etc,...):
_services = (?:\S+)
# all errors (not-precise):
#_errors = (?:[^.]+\.)*
# only expected errors (more precise), example:
#_errors = (?:unknown status|authenication error|something else)\.
_errors = (?:unknown status)\.
# return-codes (any excepting 114):
_ret_codes = (?!114)\d+
failregex = ^\s*\[\S+\]\s+\[[^\]]+\]\s+-\s+<Authentication for user : \S+[^:]* for service : %(_services)s from ip : <HOST> finished with status : Failure\.\s+%(_errors)s Return Code : %(_ret_codes)s\.
[Init]
datepattern = ^\[%%d-%%b-%%Y_%%H:%%M:%%S,%%f\]
У вас есть 3 дополнительные интерполяционные переменные (начиная с подчеркивания), чтобы контролировать, что именно должно быть запрещено.
Также можно использовать первую (закомментированную) подстановку _errors
для всех возможных ошибок, но как говорится в комментарии - это неточно... и я не люблю такое расшатывание без поиска формата всех возможных форматы лог-сообщений есть.
Но я считаю, что вы можете самостоятельно расширить этот список, как в примере выше.
теперь failregex может выполнять работу ignoreregex внутри себя!!
Я понимаю, что функция ignoreregex предназначена для того, чтобы прояснить ситуацию с доступными функциями.
Приведенный выше пример показал, насколько гибким может быть фильтр в различных сценариях.
Спасибо за ваше время и помощь.
Хорошего дня, сэр :)