Я пытаюсь создать защиту от перебора с помощью fail2ban. С тестом fail2ban он сопоставляет логи, которые я хочу сопоставить, но с моим тестовым перебором, который взломал сайт с 7+ неудачными попытками входа, он не банит мой IP-адрес.
фильтр:
[Definition]
failregex = <HOST>:.*"POST /login.*" 200 .*$
ignoreregex =
тюрьма:
[shop-brute-force]
enabled = true
filter = shop-brute-force
logpath = /etc/exampleorg/shop/log/access.log
maxretry = 7
findtime = 60
bantime = 900
ignoreip =
Пример журнала (анонимизирован с помощью ..., 88.88.88.88 и example.org):
2022/04/01 08:09:25.413720 88.88.88.88:10729 - - [01/Apr/2022:08:09:25 +0000] "POST /login?target=%2Fshop%2F HTTP/1.1" 200 2192 "https://example.org/login?target=%2Fshop%2F" "..."
тест:
Running tests
=============
Use failregex filter file : shop-brute-force, basedir: /etc/fail2ban
Use log file : /home/user/test.log
Use encoding : UTF-8
Results
=======
Failregex: 3 total
|- #) [# of hits] regular expression
| 1) [3] <HOST>:.*"POST /login.*" 200 .*$
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [106] Year(?P<_sep>[-/.])Month(?P=_sep)Day 24hour:Minute:Second(?:,Microseconds)?
`-
Lines: 106 lines, 0 ignored, 3 matched, 103 missed
[processed in 0.02 sec]
Missed line(s): too many to print. Use --print-all-missed to print all 103 lines
решение1
Я пытаюсь создать защиту методом подбора с помощью fail2ban
failregex = ... 200 ...
Это не обязательно попытка перебора, потому что 200 — это обычный ответ, который означает ОК... Обычно коды вроде 401 или 403 сигнализируют о несанкционированных попытках, или если служба отвечает кодом 200, она делает дополнительную запись в каком-то файле журнала или журнале (не обязательно в access.log
). Но и другие вещи здесь весьма сомнительны, не говоря уже о том, что теоретически можно выполнить перебор, используя другие методы, такие как POST
.
но с моим тестовым брутфорсом сайта с 7+ неудачными попытками входа ...
Lines: 106 lines, 0 ignored, 3 matched, 103 missed
Вы не предоставили всю выдержку из журнала, соответствующую этим 7 попыткам. И fail2ban-regex
нашли только 3 совпадения, связанные с вашим failregex
(что совсем не хорошо, например, не закреплено и имеет всеобъемлющие запросы, однако неважно - совпадений там нет). Вероятно, он регистрирует что-то другое как одну строку журнала из вашего примера, потому что ваше RE в основном соответствует этому. Поэтому, пожалуйста, обновите свой вопрос полной выдержкой из журнала, соответствующей всем 7 попыткам, которые вы сделали.
И последнее, но не менее важное: гораздо лучшее RE могло бы выглядеть так:
failregex = ^\s*<ADDR>:\d+ [^"]*"[A-Z]+ /login\b[^"]*" 200\b
Однако я все еще не уверен, что вы действительно будете этим пользоваться (из-за проблем с 200-м и прочего, о чем я упоминал выше).
Если это был только тест (с 3 строками журнала) и вы действительно видите все 7 строк журнала в реальном журнале, вы можете это проверитьFAQ по возможным причинам, по которым fail2ban не банит. Например, это может быть некорректно backend
(установите его auto
для мониторинга, связанного с файлами) или неподходящее действие бана или какая-то ошибка на стороне fail2ban (проверьте также fail2ban.log).