Fail2ban позволяет блокировать пользователей в результате каких-либо ошибочных действий. Например при получении HTTP ошибки 404 или некорректной ssh авторизации. Но что делать, если попытки подбора повторяются, как забанить снова, но на больший интервал?
Основная идея в том, чтобы разобрать собственный лог fail2ban на предмет того, что пользователь уже был ранее забанен и перебанить его на более длительный срок.
Для этого мы можем использовать фильтр recidive.conf из поставки.
Создаем соответствующий jail-файл: /etc/fail2ban/jail.d/recidive.conf :
[recidive] enabled = true logpath = /var/log/fail2ban.log filter = recidive # find how many times it was banned today findtime = 86400 ; 1 day # if it banned 4 times maxretry = 4 # ban this user for 3 hours bantime = 10800 ; 3 hours
Данное решение забанит на более длительный срок. Но мы хотим сделать несколько уровней. То есть увеличивать срок бана каждый раз. Мы должны измени recidive.conf и добавить туда ignoreregex чтобы исключить баны от нашего recidive правила.
Я нашел это решение по данной ссылке: https://blog.shanock.com/fail2ban-increased-ban-times-for-repeat-offenders/
Итак, изменяем
ignoreregex =
в /etc/fail2ban/filter.d/recidive.conf на:
ignoreregex = \[recidive.*\]\s+Ban\s+<HOST>
и создаем такой /etc/fail2ban/jail.d/recidive.conf с повторными банами, каждый раз на все более длительный интервал:
[recidive1] enabled = true filter = recidive bantime = 10800 ; 3 hours findtime = 86400 ; 1 day logpath = /var/log/fail2ban.log maxretry = 4 [recidive2] enabled = true filter = recidive bantime = 86400 ;1 day findtime = 604800 ;1 week logpath = /var/log/fail2ban.log maxretry = 7 [recidive3] enabled = true filter = recidive bantime = 604800 ;1 week findtime = 2592000 ;1 month logpath = /var/log/fail2ban.log maxretry = 10 [recidive4] enabled = true filter =recidive bantime = 2592000 ;1 month findtime = 15552000 ;6 months logpath = /var/log/fail2ban.log maxretry = 20