Fail2Ban на Linux: Установка, настройка и защита SSH от атак | SecureFlow

Fail2Ban на Linux: Установка, настройка и защита SSH от атак

Постер статьи

Содержание

Введение

Открытые порты — как двери, через которые злоумышленники могут попасть на ваш сервер. Особенно это касается SSH, FTP, почтовых и веб-сервисов. Если вы заметили в логах бесконечные попытки входа с китайских, индийских или просто неизвестных IP — поздравляю, ваш сервер уже кто-то брутит.

К счастью, есть простое и эффективное решение — Fail2Ban. Это инструмент, который анализирует логи и автоматически блокирует IP-адреса, совершающие подозрительные действия — например, многократные ошибки при входе.

Что такое Fail2Ban?

Fail2Ban — это фоновая служба, которая отслеживает логи (например, /var/log/auth.log) и выявляет IP-адреса, нарушающие правила безопасности. Далее он применяет правила для блокировки этих IP с помощью iptables, nftables, firewalld и других бэкендов.

Пример: IP 192.168.1.100 сделал 5 неудачных попыток входа по SSH за 1 минуту. Fail2Ban блокирует этот IP на 10 минут (или дольше).

Как установить Fail2Ban на Linux

Установка зависит от вашей операционной системы. Ниже приведены команды для популярных дистрибутивов.

Ubuntu / Debian

sudo apt update && sudo apt install -y fail2ban

CentOS

sudo dnf install -y epel-release
sudo dnf update && sudo dnf install fail2ban

RedOS

sudo dnf update && sudo dnf install -y fail2ban

ALT Linux

sudo apt-get update && sudo apt-get install -y fail2ban

Запустите и проверьте статус службы:

sudo systemctl start fail2ban
sudo systemctl status fail2ban

Первичная настройка Fail2Ban

Все конфиги находятся в директории /etc/fail2ban.

Важно: Не редактируйте файл jail.conf. Вместо этого создайте jail.local, чтобы сохранить свои настройки при обновлениях.

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

Или просто создайте файл с нужными параметрами — остальное будет использоваться по умолчанию (рекомендуется).

Как защитить SSH с помощью Fail2Ban

Fail2Ban "из коробки" поддерживает защиту SSH.

Пример /etc/fail2ban/jail.local:

[sshd]
enabled = true
port = ssh
maxretry = 2
bantime = 10m
findtime = 5m

Пояснение параметров:

  • enabled — включить фильтр
  • port — порт SSH (можно указать нестандартный)
  • maxretry — сколько неудачных попыток допускается
  • findtime — за какой период анализируются попытки
  • bantime — время блокировки IP

После изменения настроек перезапустите Fail2Ban:

sudo systemctl restart fail2ban

Больше про SSH можно почитать здесь.

Проверка статуса jail-а

Запусти команду:

sudo fail2ban-client status sshd

Пример вывода:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     2
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   203.0.113.45

Как разбанить IP в Fail2Ban

Иногда нужно разбанить IP вручную:

sudo fail2ban-client set sshd unbanip 203.0.113.45

Какие сервисы защищает Fail2Ban?

Fail2Ban поддерживает множество сервисов. Ниже — самые популярные:

Сервис Назначение Jail
SSH Брутфорс sshd
FTP Аутентификация vsftpd, proftpd
Nginx 404, сканирование, атаки nginx-*
Apache Web-атаки apache-*
Postfix Почтовая защита postfix
Dovecot IMAP/POP3 dovecot
MySQL Подбор пароля mysqld-auth

Все фильтры находятся в каталоге /etc/fail2ban/filter.d/.

Вы можете включать нужные или создавать собственные — например, для WordPress, phpMyAdmin, панелей администрирования и др.

Как написать кастомный jail для Fail2Ban

Где размещать кастомные jail-и?

Лучше всего — в отдельном файле:

/etc/fail2ban/jail.d/mycustom.conf

Можно и в jail.local, но jail.d/ — предпочтительнее, особенно если вы хотите использовать несколько отдельных правил или управлять ими через Ansible и другие инструменты.

Пример собственного jail-а:

[my-service]
enabled = true
filter = my-service
port = 12345
logpath = /var/log/my-service/access.log
maxretry = 5
findtime = 10m
bantime = 1h
action = iptables[name=my-service, port=12345, protocol=tcp]

Что означает:

  • filter = my-service — название фильтра, который мы ещё создадим (в /etc/fail2ban/filter.d/my-service.conf)
  • port = 12345 — порт твоего сервиса
  • logpath = ... — путь до лога, в котором Fail2Ban будет искать злоумышленников
  • maxretry — сколько раз допускается ошибка
  • findtime — за какой промежуток времени считаются попытки
  • bantime — на сколько времени баним IP

Как создать фильтр (filter)

Создайте файл:

sudo nano /etc/fail2ban/filter.d/my-service.conf

Содержимое:

[Definition]
failregex = ^.*Failed login from <HOST>.*
ignoreregex =

Важно: failregex должен соответствовать реальной строке в логе. Используй <HOST> как шаблон для IP-адреса.

Хорошая практика — перед запуском нового jail убедитесь, что фильтр действительно срабатывает, с помощью fail2ban-regex.

fail2ban-regex /var/log/my-service/access.log /etc/fail2ban/filter.d/my-service.conf

Применение и тест

После добавления jail-а и фильтра:

sudo systemctl restart fail2ban

Проверить статус:

sudo fail2ban-client status
sudo fail2ban-client status my-service

Советы по безопасности и эксплуатации

  • Используйте nftables вместо iptables — он быстрее и современнее.
  • Обязательно добавьте ignoreip для whitelisting своего IP:
    ignoreip = 127.0.0.1/8 192.168.1.0/24
    
  • Не ставьте слишком строгие лимиты, иначе можете забанить себя.
  • Настройте email-уведомления о банах через sendmail или mail.

Заключение

Fail2Ban — незаменимый инструмент для базовой защиты серверов от автоматических атак. Он легко устанавливается, гибко настраивается и подходит как для начинающих администраторов, так и для DevOps-инженеров.

Если у вас есть публичный сервер — Fail2Ban должен быть установлен по умолчанию. Это базовая гигиена безопасности.