Fail2ban: Добавление шаблона даты в файл фильтра

Созданный на 6 июн. 2018  ·  7Комментарии  ·  Источник: fail2ban/fail2ban

Окружающая обстановка:

_Заполните и отметьте ( [x] ) соответствующие поля. Если ваша версия Fail2Ban устарела,
и вы не можете убедиться, что проблема сохраняется в последнем выпуске, лучше обратитесь в службу поддержки
из дистрибутива вы получили Fail2Ban from_

  • Версия Fail2Ban (включая любые возможные суффиксы дистрибутива): 0.9-6
  • ОС, включая название/версию выпуска: Centos 06
  • [x] Fail2Ban установлен через ОС/механизмы распространения
  • [ ] Вы не применили никаких дополнительных сторонних патчей к кодовой базе
  • [ ] Некоторые настройки были внесены в конфигурацию (укажите подробности ниже)

Проблема:

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).*

Ожидаемое поведение

  1. Приведенный выше фильтр должен фиксировать неудачные попытки входа в систему.
  2. Фильтр должен пропустить неудачный вход в систему, если значение кода возврата равно 114.

Наблюдаемое поведение

  1. Созданный фильтр не может проанализировать дату из журналов /var/log/tomcat2/catalina.out.

    Любая дополнительная информация

Конфигурация, дамп и другие полезные выдержки

  1. Никаких изменений в jail.config
  2. Создан джейл в jail.local для перехвата неудачных входов в систему (имя = TrialJail)

    Любые изменения, внесенные в /etc/fail2ban/configuration

Добавлена ​​тюрьма в 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 =

Соответствующие части файла /var/log/fail2ban.log:

_ желательно получить при запуске fail2ban с loglevel = 4 _

  1. Ошибка, выдаваемая fail2ban из-за невозможности проанализировать дату, выглядит следующим образом.
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))

documentation

Все 7 Комментарий

как разобрать шаблон даты

Ваш шаблон может быть, например, «^[%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 предназначена для того, чтобы прояснить ситуацию с доступными функциями.
Приведенный выше пример показал, насколько гибким может быть фильтр в различных сценариях.
Спасибо за ваше время и помощь.
Хорошего дня, сэр :)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги