У меня проблема, когда Fail2ban не смог распознать IP, поэтому я пытаюсь заблокировать неудачный доступ к MySQL, вот системный журнал быть под контролем
Sep 6 01:45:18 vps6XXXXX mysqld: 2019-09-06 1:45:18 140581192722176 [Warning] IP address '120.160.120.60' has been resolved to the host name '67.subnet120-160-120.speedy.telkom.net.id', which resembles IPv4-address itself.
Sep 6 01:45:18 vps6XXXXX mysqld: 2019-09-06 1:45:18 140581192722176 [Warning] Access denied for user 'global'@'120.160.120.60' (using password:YES)
Но fail2ban не смог прочитать IP-адрес из 120.160.120.60 обнаружен как 0.0.0.7 . Файлы журнала из fail2ban.log являются следующими
2019-09-06 01:45:18,742 fail2ban.filter [3793]: WARNING Determined IP using DNS Lookup: 7 = ['0.0.0.7']
2019-09-06 01:45:18,742 fail2ban.filter [3793]: INFO [mysql] Found 0.0.0.7
Вот мой обычай filter.d mysql.conf регулярное выражение
[Definition]
failregex = ^.*\[Warning\] Access denied for user.*<HOST>.*\(using password: YES\)$
ignoreregex =
Я не уверен, что этот fail2ban не может определить IP или мое регулярное выражение не сработает.
Буду признателен за любые предложения или решения по этой проблеме. Спасибо.
Хотя известны похожие раздражающие проблемы с двойной меткой времени (некоторые службы или системный журнал записывают двойные даты и время, одно впереди, а другое в теле сообщения), я не знаю, почему формат сообщения журнала меняется от системы к системе.
В любом случае это нужно исправить сейчас (см. https://github.com/fail2ban/fail2ban/commit/50595b70fd4e2563ba816acf4877775eda36e248).
Кстати. Ваше регулярное выражение немного "уязвимо", потому что не привязано (^.*
не имеет смысла) и содержит обобщающие (.*
) до и после <HOST>
.
Регулярное выражение в исходном вопросе разрешает <HOST>
только на запчасти:
IP_V4_RE
: 0.160.120.60
DNS
: 0
(видеть https://github.com/fail2ban/fail2ban/search?q=IP_4_RE&unscoped_q=IP_4_RE для получения подробной информации о внутренних выражениях fail2ban для <HOST>
)
При настройке на следующее принимающая часть будет считаться правильно:
failregex = ^.*\[Warning\] Access denied for user '[^']+'@'<HOST>' \(using password: YES\)$
Пользовательское регулярное выражение, похоже, не учитывает другие возможности, например, определено в https://github.com/fail2ban/fail2ban/blob/0.11/config/filter.d/mysqld-auth.conf#L20
failregex = ^%(__prefix_line)s(?:\d+ |\d{6} \s?\d{1,2}:\d{2}:\d{2} )?\[\w+\] (?:\[[^\]]+\] )*Access denied for user '[^']+'@'<HOST>' (to database '[^']*'|\(using password: (YES|NO)\))*\s*$