Назад | Перейти на главную страницу

Постоянная блокировка IP после n попыток с использованием fail2ban

У меня настроен fail2ban, как показано ниже:

Это работает отлично, и я хочу сохранить его таким образом, чтобы у действительного пользователя была возможность повторить попытку входа в систему после тайм-аута. Теперь я хочу реализовать правило, согласно которому, если один и тот же IP-адрес обнаружен как атака и заблокирован, разблокирован 5 раз, навсегда заблокировать IP-адрес и никогда больше не разблокировать. Можно ли этого добиться только с помощью fail2ban, или мне нужно написать для этого свой собственный скрипт?

Я делаю это в centos.

До версии 0.11 было нет функции по умолчанию или настройки в fail2ban для достижения этой цели. Но начиная с грядущего релиза 0.11 время бана автоматически рассчитывается и увеличивается экспоненциально с каждым новым нарушением, что в долгосрочной перспективе будет означать более или менее постоянный блок.

А пока ваш лучший подход, вероятно, настроить fail2ban для мониторинга собственного файла журнала. Это двухэтапный процесс ...

Шаг 1

Нам может понадобиться создать фильтр проверить БАНв файле журнала (файл журнала fail2ban)

Шаг 2

Нам нужно определить тюрьму, аналогично следующему ...

[fail2ban]
enabled = true
filter = fail2ban
action = iptables-allports[name=fail2ban]
logpath = /path/to/fail2ban.log
# findtime: 1 day
findtime = 86400
# bantime: 1 year
bantime = 31536000

Технически это не постоянный блок, но только блоки на год (которые мы тоже можем увеличить).

В любом случае, на ваш вопрос (можно ли этого достичь только с помощью fail2ban или мне нужно написать свой собственный скрипт для этого?) ... написание собственного скрипта может сработать. Настройка скрипта для извлечения часто забанил IP-адреса, а затем поместил их в /etc/hosts.deny я бы порекомендовал.

Я верю, если вы положите bantime = -1 в этом разделе конфигурации это постоянный блок.

Фил Хаген написал отличную статью на эту тему. "Постоянно запрещать повторных нарушителей с помощью fail2ban".

Его предложение такое же, как у Поти, но дает пошаговое руководство.

Это включало:

  • отдельный список банов по джейлу (ip.blocklist.ssh, ip.blocklist.xxx)
  • списки запретов загружаются автоматически при перезапуске службы (главное преимущество этого метода имхо)
  • уведомление по электронной почте, если ретранслятор задействован.

В fail2ban уже есть тюрьма для бана рецидива. Если вы посмотрите /etc/fail2ban/jail.conf, вы найдете:

# Jail for more extended banning of persistent abusers
# !!! WARNING !!!
#   Make sure that your loglevel specified in fail2ban.conf/.local
#   is not at DEBUG level -- which might then cause fail2ban to fall into
#   an infinite loop constantly feeding itself with non-informative lines
[recidive]

enabled  = false
filter   = recidive
logpath  = /var/log/fail2ban.log
action   = iptables-allports[name=recidive]
           sendmail-whois-lines[name=recidive, logpath=/var/log/fail2ban.log]
bantime  = 604800  ; 1 week
findtime = 86400   ; 1 day
maxretry = 5

Как добавить в jail.local?

[recidive]
enabled  = true
bantime  = 31536000  ; 1 year
findtime = 18144000  ; 1 month
maxretry = 2

Для проверки вашего логического уровня вы можете: fail2ban-client get loglevel.

  • установить уровень логирования MYLEVEL : устанавливает уровень ведения журнала MYLEVEL. Уровни: CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG
  • Больше команда в вики.

Со старой версией fail2ban вы можете получить эта ошибка.

Чтобы расширить ответ Чина, это довольно просто. Просто отредактируйте 2 настройки в /etc/fail2ban/jail.local чтобы соответствовать вашим предпочтениям.

 # ban time in seconds. Use -1 for forever. Example is 1 week.
 bantime  = 604800
 # number of failures before banning
 maxretry = 5

Заходим в vim, открываем /etc/fail2ban/jail.conf

и просто измените после fail2ban service restart:

# "bantime" is the number of seconds that a host is banned.
bantime  = ***1296000***

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime  = ***60000***

# "maxretry" is the number of failures before a host get banned.
maxretry = ***3***