Регулярное выражение не соответствует тестовой строке

Почему следующее регулярное выражение не соответствует следующему тексту?

Регулярное выражение:

\[\]\s\[(:?error|\S+:\S+)\]( \[pid \d+(:\S+ \d+)?\])? \[client <HOST>(:\d{1,5})?\] ModSecurity:\s+(?:\[(?:\w+ \"[^\"]*\"|[^\]]*)\]\s*)*Access denied with code [45]\d\d

Тестовая строка:

[Sun Mar 15 22:28:19.733272 2018] [:error] [pid 11954] [client 188.191.122.27:62165] [client 188.191.122.27] ModSecurity: Access denied with code 403 (phase 2). Operator GE matched 4 at TX:anomaly_score. [file ".../modsecurity.d/owasp-modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "57"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [severity "CRITICAL"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "63.60.128.135"] [uri "/phpmyadmin/phpmyadmin/index.php"] [unique_id "W0uuY3C8AA4EAA5OC7wBAAAH"]

Это предопределенное правило от fail2ban и случайная запись в журнале apache с измененными адресами.

Сначала я подумал, что ошибка в том, что клиент логируется дважды, поэтому я изменил строку клиента:

(\[client <HOST>(:\d{1,5})?\])+

Но и это не сработало.

Просто чтобы прояснить ситуацию:

 Regular expressions (failregex, ignoreregex) assume that the date/time has been removed from the log line (this is just how fail2ban works internally ATM).

 If the format is like „<date...> error 1.2.3.4 is evil“ then you need to match the < at the start so regex should be similar to „^<> <HOST> is evil$„ using <HOST> where the IP/domain name appears in the log line.

(Взято из документации fail2ban: https://fail2ban.readthedocs.io/en/latest/filters.html) (я написал это как код, потому что stackoverflow, похоже, имеет проблемы с отображением определенных символов в кавычках.)

Я более или менее новичок в регулярных выражениях, поэтому спасибо за любую помощь.


person j3141592653589793238    schedule 16.07.2018    source источник
comment
Регулярное выражение начинается с \[\], но текст не содержит [].   -  person Barmar    schedule 16.07.2018
comment
Это из-за fail2ban. Он выполняет две проверки на строку, мне не нужно проверять дату. Я думаю, что datedetector fail2ban удаляет дату из тестовой строки.   -  person j3141592653589793238    schedule 16.07.2018
comment
В строке также нет <HOST>.   -  person Barmar    schedule 16.07.2018
comment
<HOST> должно быть (?:\d{1,3}\.){3}\d{1,3}   -  person Barmar    schedule 16.07.2018
comment
Если fail2ban изменяет строку, вам нужно опубликовать результирующую строку, которую вы пытаетесь сопоставить, а не исходную строку.   -  person Barmar    schedule 16.07.2018
comment
Я не хочу читать всю документацию. Обновите вопрос и покажите, что вы на самом деле пытаетесь сопоставить.   -  person Barmar    schedule 16.07.2018
comment
Я обновил свой вопрос и опубликовал цитату, которая должна прояснить ситуацию.   -  person j3141592653589793238    schedule 16.07.2018
comment
Было бы еще лучше, если бы вы разместили одну из фактических строк, которые вы пытаетесь сопоставить, вместо того, чтобы заставлять нас применять те же преобразования, что и fail2ban.   -  person Barmar    schedule 16.07.2018
comment
У меня нет других строк, и я не хочу бросать вам вызов. По крайней мере, не таким образом. Я должен написать так называемые «failregexes», которые использует fail2ban. Я не получаю преобразованные строки, это делается внутри fail2ban. По сути, мне не нужно сопоставлять дату и заменять IP на «HOST». Это все.   -  person j3141592653589793238    schedule 16.07.2018
comment
Вот что, по моему мнению, должно быть: [] [:error] [pid 11954] [client <HOST>] [client <HOST>] ModSecurity: Access denied with code 403 (phase 2). Operator GE matched 4 at TX:anomaly_score. [file ".../modsecurity.d/owasp-modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "57"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [severity "CRITICAL"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "<HOST>"] [uri "/phpmyadmin/phpmyadmin/index.php"] [unique_id "W0uuY3C8AA4EAA5OC7wBAAAH"]   -  person Barmar    schedule 16.07.2018
comment
Вы можете попробовать использовать regex101.com для отладки регулярного выражения.   -  person Barmar    schedule 16.07.2018
comment
Вам действительно нужно сопоставить все или вы просто ищете что-то конкретное? С вашим шаблоном много проблем.   -  person emsimpson92    schedule 16.07.2018


Ответы (1)


Вы были близки. Когда вы добавили повторяющуюся группу для нескольких клиентов, вы не включили в нее пробел, который их разделяет.

\[\]\s\[(:?error|\S+:\S+)\]( \[pid \d+(:\S+ \d+)?\])?( \[client <HOST>(:\d{1,5})?\])+ ModSecurity:\s+(?:\[(?:\w+ \"[^\"]*\"|[^\]]*)\]\s*)*Access denied with code [45]\d\d

ДЕМО

person Barmar    schedule 16.07.2018