Улучшение безопасности сервера с помощью Fail2Ban

Брутфорс по SSH, подбор паролей к панели и шум в auth-логах – обычная картина для VPS в открытой сети. Fail2Ban читает логи, ловит повторяющиеся сбои авторизации и временно банит IP через firewall. Ниже – установка и базовая настройка на Ubuntu: jail для SSH, пример для Nginx, почтовые алерты.

Зачем Fail2Ban

Утилита следит за журналами и реагирует на паттерны вроде:

  • много неудачных входов по SSH;
  • попытки HTTP basic auth на веб-сервере;
  • типичный «шум» сканеров, который оставляет следы в error/auth логах.

При превышении порога IP попадает в бан (через iptables/nftables/firewalld, в зависимости от backend). Это не замена сильным ключам и firewall, а слой, который снижает давление автоматических атак.

Статус Fail2Ban: активные jail и забаненные IP

Установка на Ubuntu

Пакет есть в стандартных репозиториях:

sudo apt update
sudo apt install fail2ban

Конфигурация: jail.local

Основной файл /etc/fail2ban/jail.conf при обновлениях пакета может перезаписаться. Рабочие правки лучше держать в jail.local (или в drop-in файлах в jail.d/):

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Jail для SSH

В /etc/fail2ban/jail.local секция [sshd] (порт и путь к логу подставьте свои):

[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
  • enabled = true – jail включён.
  • port – порт SSH (если не 22, укажите фактический).
  • logpath – журнал, который разбирает фильтр (на Ubuntu обычно /var/log/auth.log).
  • maxretry – сколько неудачных попыток до бана.

Полезно также задать bantime и findtime глобально в [DEFAULT] или в самом jail: сколько секунд держать бан и в каком окне считать попытки.

Перезапуск и проверка

sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd

status без аргументов покажет список jail, status sshd – счётчики и уже забаненные адреса. Если jail не в списке, проверьте синтаксис jail.local и логи journalctl -u fail2ban.

Пример: Nginx HTTP auth

Для basic auth на Nginx в том же jail.local:

[nginx-http-auth]
enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
maxretry = 3

Фильтр смотрит ошибки авторизации в error-логе Nginx. Путь к логу должен совпадать с вашим error_log в конфиге сайта. Есть и другие готовые jail (apache, postfix и т.д.) – включайте только то, что реально крутится на сервере.

Уведомления на почту

В секции по умолчанию или в конкретном jail можно слать письма при бане (нужен рабочий MTA, например sendmail/postfix):

destemail = your-email@example.com
sendername = Fail2Ban
mta = sendmail
action = %(action_mwl)s

action_mwl – бан плюс письмо с whois и фрагментом лога. Адрес и MTA замените на свои; без настроенной доставки писем action упадёт в ошибку.

На что обратить внимание

  • Не баньте свой постоянный IP «вслепую»: whitelist через ignoreip в [DEFAULT].
  • Fail2Ban не заменяет ключи SSH, отключение password auth, UFW/nftables и обновления.
  • Слишком короткий bantime и большой maxretry почти не давят атаку; слишком жёсткие значения рискуют забанить легитимных пользователей за NAT.

В связке с firewall, сильной аутентификацией и обновлениями Fail2Ban заметно снижает фоновый шум брутфорса на публичном сервере.

Источники и ссылки


Комментарии загружаются…