10-fail2ban — Fail2Ban (защита от брутфорса)

☐ Опциональный. Ставит Fail2Ban и настраивает jail для SSH: после нескольких неудачных попыток входа IP-адрес автоматически блокируется на заданное время. Локальные адреса в белом списке.

Зачем нужен

Fail2Ban следит за журналами и банит (временно блокирует файрволом) адреса, с которых идёт подбор пароля. Jail («тюрьма») — это правило: «какой лог смотреть, какой фильтр применять, при скольких провалах и на сколько банить». Модуль настраивает jail sshd — защиту SSH от брутфорса. Публичный сервер получает десятки-сотни попыток подбора в сутки; Fail2Ban отсекает их автоматически.

Когда включать и когда не нужен

Включайте на любом сервере с доступом по SSH из интернета.

Менее критично, если:

Зависимости и требования

Что именно делает (по шагам module_install)

  1. Готовит репозитории: на RHEL подключает EPEL.
  2. Ставит пакет fail2ban.
  3. Рендерит /etc/fail2ban/jail.local из шаблона templates/fail2ban/jail.local.template, подставляя ваши значения (бэкап прежнего файла делается заранее).
  4. Включает и запускает службу fail2ban.
  5. Ждёт и проверяет jail: до 5 попыток fail2ban-client status sshd, пока jail не станет активным (демону нужно время на старт). Если jail так и не поднялся — установка модуля падает.

Что в jail.local

[DEFAULT]
bantime  = 1h            # на сколько банить (F2B_BANTIME)
findtime = 10m           # окно, в котором считаются провалы (F2B_FINDTIME)
maxretry = 5             # сколько провалов до бана (F2B_MAXRETRY)
backend  = systemd       # источник журналов — journald, не /var/log/auth.log

# Никогда не банить локальный трафик:
ignoreip = 127.0.0.1/8 ::1     # белый список адресов (ignoreip)

[sshd]
enabled  = true
port     = <SSH_PORT>    # jail слушает ваш порт SSH
filter   = sshd
maxretry = 5

Логика: если с одного IP за findtime (10 минут) наберётся maxretry (5) неудачных входов по SSH, адрес блокируется на bantime (1 час). Адреса из ignoreip (локальные) не банятся никогда.

Файлы, службы и порты

Путь / юнит Назначение Права
служба fail2ban демон, читает журнал и банит IP root
/etc/fail2ban/jail.local конфигурация jail'ов mitdev root
journald (journalctl) источник событий (backend=systemd)
jail sshd правило защиты SSH на порту <SSH_PORT>

Fail2Ban своих портов не открывает — он управляет банами через файрвол/iptables.

Настройка

Переменная Значения По умолчанию Влияние Когда менять
SSH_PORT номер порта 22 (SSH_PORT_DEFAULT) какой порт слушает jail sshd если SSH перенесён (03-security)
F2B_BANTIME длительность (1h, 24h, -1=навсегда) 1h на сколько банить нарушителя ужесточить на агрессивном фоне атак
F2B_FINDTIME длительность (10m, 1h) 10m окно подсчёта провалов увеличить, чтобы ловить «медленный» подбор
F2B_MAXRETRY число 5 провалов до бана уменьшить для строгости, увеличить против ложных банов

Как переопределить настройки

  1. Экспорт перед установкой:
    F2B_BANTIME=24h F2B_MAXRETRY=3 F2B_FINDTIME=30m sudo -E ./install.sh
    
  2. Правка config/defaults.conf — строки F2B_BANTIME, F2B_FINDTIME, F2B_MAXRETRY.
  3. Правка /etc/fail2ban/jail.local после установки, затем sudo systemctl restart fail2ban (или sudo fail2ban-client reload).

Проверка, что всё работает

module_verify: служба fail2ban активна и fail2ban-client status sshd отрабатывает.

Вручную:

sudo fail2ban-client status              # список активных jail'ов (есть sshd)
sudo fail2ban-client status sshd         # детали: сколько провалов, забанено сейчас, список IP
mitdev doctor                            # строка «Fail2Ban … активен, забанено сейчас: N»

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

Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  `- Total failed:     37
`- Actions
   |- Currently banned: 1
   `- Banned IP list:   203.0.113.45

Типовые задачи

# Статус конкретного jail (провалы, баны, список IP)
sudo fail2ban-client status sshd

# Разбанить свой IP, если случайно попал в бан
sudo fail2ban-client set sshd unbanip 203.0.113.45

# Забанить IP вручную
sudo fail2ban-client set sshd banip 203.0.113.45

# Перечитать конфиг после правки jail.local
sudo fail2ban-client reload

# Узнать свой публичный IP (чтобы не забанить себя / внести в ignoreip)
curl -s ifconfig.me

# Добавить свой офисный IP в белый список: правьте ignoreip в jail.local, затем reload

Частые ошибки

Симптом: сам не могу зайти по SSH — «Connection refused»/таймаут, хотя пароль верный. Причина: несколько неудачных попыток подряд — ваш IP забанен. Решение: зайдите с другого IP или через веб-консоль облака и разбаньте:

sudo fail2ban-client set sshd unbanip <ваш-ip>
# чтобы больше не банить себя — добавьте IP в ignoreip:
sudo nano /etc/fail2ban/jail.local   # ignoreip = 127.0.0.1/8 ::1 <ваш-ip>
sudo fail2ban-client reload

Симптом: fail2ban-client status sshd — «Sorry but the jail 'sshd' does not exist». Причина: служба не поднялась или jail не активен. Решение: sudo systemctl status fail2ban; journalctl -u fail2ban -n 30; проверьте jail.local.

Симптом: после переноса SSH на новый порт баны не срабатывают. Причина: в jail остался старый порт. Решение: приведите port = <новый> в [sshd] секции jail.local (или переустановите модуль с новым SSH_PORT), затем reload.

Симптом: боюсь заблокировать себя при настройке. Причина: нет своего адреса в белом списке. Решение: заранее добавьте свой статический IP в ignoreip (см. первый рецепт) — эти адреса не банятся никогда.

Безопасность и продакшен

Откат и удаление

Автоматический откат (module_rollback): останавливает и отключает fail2ban, удаляет jail.local и пакет.

Ручное удаление:

mitdev remove fail2ban

При остановке службы все текущие баны снимаются (блокировки перестают действовать). Удаляются пакет и /etc/fail2ban/jail.local. Флаг --purge для этого модуля отдельного эффекта не имеет — пользовательских данных Fail2Ban не хранит.

См. также