До основного вмісту

Fail2ban: захист SSH і Nginx від підбору паролів

Безпека · 20.04.2025 · 6 хв читання
Ілюстрація до статті «Fail2ban: захист SSH і Nginx від підбору паролів»

Кожен публічний VPS щодня зазнає тисяч спроб підбору паролів SSH. Fail2ban аналізує логи і автоматично блокує атакуючі IP-адреси.

Встановлення Fail2ban

sudo apt update
sudo apt install -y fail2ban

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Налаштування захисту SSH

Створіть локальний конфіг (не редагуйте jail.conf — він перезаписується при оновленнях):

sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 5
ignoreip = 127.0.0.1/8 ВАША_ДОМАШНЯ_IP

[sshd]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3
bantime  = 86400
sudo systemctl restart fail2ban

Що означає кожен параметр

ПараметрЗначення у прикладіСенс
bantime3600 (для sshd — 86400)На скільки секунд блокується IP після перевищення ліміту
findtime600Вікно часу в секундах, за яке рахуються невдалі спроби
maxretry5 (для sshd — 3)Скільки невдалих спроб допустимо в межах findtime
ignoreip127.0.0.1/8 і ваша IPАдреси, які ніколи не блокуються

Секція [sshd] перевизначає maxretry і bantime із [DEFAULT] — для SSH їх зазвичай роблять суворішими (менше спроб, довший бан), ніж загальне значення за замовчуванням для решти сервісів.

Типові помилки налаштування

Невірний logpath для дистрибутива

Шлях /var/log/auth.log вірний для Debian і Ubuntu. На CentOS, AlmaLinux та інших RHEL-подібних дистрибутивах журнал автентифікації лежить у /var/log/secure — з невірним шляхом Fail2ban запускається без помилки, але jail ніколи не спрацює, тому що просто не знаходить файл для читання.

# Перевірка, що jail дійсно читає файл логів:
sudo fail2ban-client status sshd
# Рядок "File list" має містити реальний шлях до лога з даними,
# а не шлях до порожнього чи неіснуючого файлу

ignoreip без власної IP

Якщо не додати свою робочу IP в ignoreip, а поріг maxretry стоїть низьким, випадкові одруківки в паролі при звичайному вході можуть забанити вас самих на термін bantime. Особливо небезпечно за динамічної IP вдома — варто перевіряти поточну адресу після кожного перепідключення провайдера.

У системах, де журнал автентифікації ведеться лише через systemd journal без файлу /var/log/auth.log чи /var/log/secure (деякі мінімальні образи і контейнерні середовища), звичайний logpath не спрацює зовсім. Для цього випадку в jail є окремий параметр backend, який читає записи напряму з journal, а не з файлу на диску:

[sshd]
enabled = true
backend = systemd
maxretry = 3

Основні команди

# Статус усіх тюрем
sudo fail2ban-client status

# Статус SSH-тюрми
sudo fail2ban-client status sshd

# Розблокувати IP вручну
sudo fail2ban-client set sshd unbanip 203.0.113.42

# Подивитися заблоковані IP
sudo iptables -L f2b-sshd -n --line-numbers

Захист Nginx від DDoS і сканування

# Додати в jail.local:
[nginx-http-auth]
enabled  = true
logpath  = /var/log/nginx/error.log

[nginx-botsearch]
enabled  = true
logpath  = /var/log/nginx/access.log
maxretry = 2
✅ Змініть порт SSH із 22 на нестандартний (наприклад, 2222) у /etc/ssh/sshd_config — це знизить кількість атак на 95%.
⚠️ Перед зміною порту SSH обов'язково відкрийте новий порт в UFW: sudo ufw allow 2222/tcp

Коли Fail2ban не врятує

  • Розподілений перебір із тисяч різних IP по одній-дві спробі з кожної — поріг maxretry для окремої адреси не спрацьовує, тому що жодна IP його не перевищує.
  • Атака через вразливість у самому застосунку, а не підбір пароля — Fail2ban реагує на патерни в логах невдалої автентифікації, а не на довільні HTTP-запити без відповідної сигнатури фільтра.
  • Вхід за скомпрометованим, але дійсним паролем чи ключем з першої спроби — тут нічого блокувати за ознакою повторних невдач, потрібні двофакторна автентифікація і моніторинг підозрілих входів.

Перевірка, що захист працює

  1. Виконайте sudo fail2ban-client status sshd — у виводі має бути коректний шлях до лога і зростаючий лічильник Currently failed після невдалих спроб входу.
  2. З іншої IP (не з ignoreip) навмисно введіть неправильний пароль SSH більше maxretry разів поспіль — наступна спроба має бути відхилена файрволом, а не формою входу.
  3. Перевірте бан у списку: sudo fail2ban-client status sshd має показати цю IP у Banned IP list.
  4. Розбаньте тестову IP командою fail2ban-client set sshd unbanip і переконайтеся, що підключення знову проходить — це підтверджує, що бан знімається штатно, а не лише руками через iptables.

Налаштування файрвола, на якому Fail2ban розставляє правила блокування, розбирає стаття UFW для Ubuntu і Debian, а вхід за ключами замість пароля взагалі прибирає потребу в підборі — хардненинг SSH на сервері.

Встановлення

sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban

Створення конфігу jail.local

Ніколи не редагуйте jail.conf — він перезаписується під час оновлення. Створіть jail.local:

># /etc/fail2ban/jail.local
[DEFAULT]
# Час бану в секундах (3600 = 1 година, -1 = назавжди)
bantime  = 3600
# Час пошуку спроб (10 хвилин)
findtime = 600
# Максимум спроб до бану
maxretry = 5
# Виключити свої IP з бану!
ignoreip = 127.0.0.1/8 YOUR.TRUSTED.IP

[sshd]
enabled  = true
port     = 22
logpath  = %(sshd_log)s
maxretry = 3

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

[postfix-sasl]
enabled  = true
port     = smtp,submission
logpath  = /var/log/mail.log
maxretry = 5
sudo systemctl restart fail2ban

Керування та моніторинг

# Загальний статус
sudo fail2ban-client status

# Статус конкретного jail
sudo fail2ban-client status sshd

# Ручний бан IP
sudo fail2ban-client set sshd banip 192.168.1.100

# Розбанити IP
sudo fail2ban-client set sshd unbanip 192.168.1.100

# Переглянути забанені IP в iptables
sudo iptables -L f2b-sshd -n -v

# Логи Fail2Ban
sudo journalctl -u fail2ban -f

Моніторинг атак у реальному часі

# Стежити за банами SSH у реальному часі
sudo tail -f /var/log/auth.log | grep "Failed password"

# Топ атакуючих IP
sudo grep "Failed password" /var/log/auth.log |     awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
💡 ignoreip — ОБОВ'ЯЗКОВО: Додайте свій домашній/офісний IP до ignoreip ПЕРЕД першим запуском. Інакше ризикуєте забанити себе під час налагодження. Завжди перевіряйте правило двічі.
⚠️ Fail2Ban ≠ повний захист: Брутфорс з тисяч різних IP (botnet) обійде Fail2Ban. Додатково обмежуйте доступ до SSH за білим списком IP через UFW, або використовуйте VPN для доступу до сервера.
Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці