Я попытался создатьпользовательское правило тюрьмы в fail2ban, но он никогда не применяется.
Я не нашел такой официальной документации, могу что-то упустить.
/etc/fail2ban/filter.d/expressjs.conf
[Definition]
failregex = .* from ip <HOST>
/etc/fail2ban/jail.conf
[express-js]
enabled = true
filter = expressjs
logpath = /var/log/expressjs/slowin-killer.log
maxretry = 5
bantime = 3600
findtime = 600
/var/log/expressjs/slowin-killer.log
[20-5-2017 20:49:57] Failed to authentificate user "[email protected]" from ip 127.0.0.1
[20-5-2017 20:57:19] Failed to authentificate user "[email protected]" from ip 127.0.0.1
[20-5-2017 20:59:20] Failed to authentificate user "[email protected]" from ip 127.0.0.1
[20-5-2017 21:12:47] Failed to authentificate user "[email protected]" from ip 127.0.0.1
[20-5-2017 21:16:9] Failed to authentificate user "[email protected]" from ip 127.0.0.1
Сообщения об ошибке нет, но джейл, похоже, активен...
$ fail2ban-client status expressjs
Status for the jail: expressjs
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/expressjs/slowin-killer.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
И что странно, с регулярными выражениями все в порядке...
fail2ban-regex /var/log/expressjs/slowin-killer.log /etc/fail2ban/filter.d/expressjs.conf
Running tests
=============
Use failregex filter file : expressjs, basedir: /etc/fail2ban
Use log file : /var/log/expressjs/slowin-killer.log
Use encoding : UTF-8
Results
=======
Failregex: 27 total
|- #) [# of hits] regular expression
| 1) [27] .* from ip <HOST>
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [34] Day(?P<_sep>[-/])Month(?P=_sep)(?:Year|Year2) 24hour:Minute:Second
| [1] (?:DAY )?MON Day Year 24hour:Minute:Second(?:\.Microseconds)?
`-
Lines: 162 lines, 0 ignored, 27 matched, 135 missed
[processed in 0.01 sec]
Missed line(s): too many to print. Use --print-all-missed to print all 135 lines
решение1
Есть некоторые вещи, которые вам не хватает и которые нужно исправить, чтобы фильтр заработал:
- Внутри вы
expressjs.conf
установилиfindtime = 600
иmaxretry = 5
Это означает, что в течение 10 минут (600 с) вам понадобится 5 неудачных попыток (соответствие регулярному выражению) для генерации автоматического правила блокировки/отклонения iptables.jail.conf
man-страница:
findtime time interval (in seconds) before the current time where failures will count towards a ban. maxretry number of failures that have to occur in the last findtime seconds to ban then IP.
Просматривая ваши журналы, вы видите, что между первой и последней записью в журнале (5 попыток) в журнале, который вы вставили сюда, прошло более 10 минут. Первая: 20:49
, Последняя:21:16
Все ваши журналы приходят из
127.0.0.1
. Если вы посмотрите наjail.conf
внутреннюю часть[DEFAULT]
блока, вы найдетеignoreip = 127.0.0.1/8
конфигурацию по умолчанию. Если вы ее не изменили, довольно опасно блокировать адрес localhost, так как это нарушит работу другого программного обеспечения, использующего этот адрес для внутренней связи.У вас
expressjs.conf
неdatepattern =
настроена конфигурация, поэтому fail2ban не может угадать, какая часть файла журнала является датой. Возьмите несколько примеров из/etc/fail2ban/filter.d
файлов, и вы найдете регулярное выражение даты, напримерdatepattern = ^L %%d/%%m/%%Y - %%H:%%M:%%S
илиdatepattern = ^%%Y:%%m:%%d-%%H:%%M:%%S
. Другая проблема здесь в том, что ваша «вторая» часть даты журнала не имеет завершающего нуля на sec < 10 (например,21:16:9
в вашем последнем журнале), и это нужно исправить.
Взгляните наFail2ban официальная викичтобы получить примеры и сделать свой фильтр лучше. Вам нужно многое исправить.