# fail2ban: jail для sshd

Индекс LLMS: [llms.txt](/llms.txt)

---

Защита SSH от брутфорса — один из первых шагов при укреплении сервера. fail2ban сканирует логи, находит повторные неудачные попытки входа и блокирует источник через iptables или nftables. В заметке разберём jail для sshd: от установки до тонкой настройки времени бана.

## Установка и базовая конфигурация

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

```bash
# Debian/Ubuntu
apt install fail2ban

# RHEL/CentOS
yum install fail2ban
```

Включаем и запускаем сервис:

```bash
systemctl enable --now fail2ban
systemctl status fail2ban
```

> [!WARNING]
> Не редактируйте напрямую `/etc/fail2ban/jail.conf` — при обновлении пакета изменения будут потеряны. Все локальные правки идут в `jail.local`.

Создаём файл локальных переопределений:

```bash
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
```

Или, что предпочтительнее, создаём минимальный `jail.local` с только нужными параметрами — fail2ban объединяет `jail.local` поверх `jail.conf`, так что достаточно переопределить конкретные ключи.

## Фильтр для sshd

Готовый фильтр уже поставляется в комплекте: `/etc/fail2ban/filter.d/sshd.conf`. Он ищет в `/var/log/auth.log` (или `/var/log/secure` на RHEL) паттерны вроде `Failed password for invalid user` и `Connection closed by authenticating user`.

Проверить, что фильтр корректно парсит логи, можно командой:

```bash
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
```

Если в выводе видите высокий процент совпадений — фильтр работает. Если нет, проверьте путь к логу в секции `[Definition]` фильтра и параметр `logpath` в jail.

> [!TIP]
> Для усиленной защиты от брутфорса через ddos-сценарии есть отдельный фильтр `sshd-ddos`. Он ловит быстрые повторные подключения с одного IP. Подключается добавлением `mode = ddos` в параметры jail.

## Параметры bantime и findtime

Три ключа определяют логику блокировки:

| Параметр   | Описание                                      | По умолчанию |
|------------|-----------------------------------------------|--------------|
| `bantime`  | Длительность бана в секундах (отрицательное = навсегда) | 600          |
| `findtime` | Окно наблюдения для подсчёта неудачных попыток | 600          |
| `maxretry` | Количество неудачных попыток до бана           | 5            |

Типичная конфигурация для продакшена:

```ini
[sshd]
bantime  = 3600
findtime = 600
maxretry = 3
```

Это значит: три неудачных входа за десять минут → часовой бан. Для критичных серверов можно поставить `bantime = -1` (перманентный бан) и разблокировать вручную через `fail2ban-client set sshd unbanip <IP>`.

> [!NOTE]
> `bantime` и `findtime` принимают суффиксы: `d` (дни), `h` (часы), `m` (минуты), `s` (секунды). Например, `bantime = 1d`.

## Активация jail

По умолчанию в `jail.local` секция `[sshd]` закомментирована. Активируем:

```ini
[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime  = 3600
findtime = 600
```

На RHEL/CentOS `logpath` обычно `/var/log/secure`. Проверьте путь к логу на вашем дистрибутиве.

Перезапускаем fail2ban и проверяем статус:

```bash
systemctl restart fail2ban
fail2ban-client status
fail2ban-client status sshd
```

Вывод `fail2ban-client status sshd` покажет текущее количество баненных IP и список активных фильтров.

Ручная блокировка и разблокировка адреса:

```bash
fail2ban-client set sshd banip 203.0.113.50
fail2ban-client set sshd unbanip 203.0.113.50
```

> [!WARNING]
> fail2ban — это не WAF и не замена ключевой аутентификации. Используйте ключи вместо паролей, ограничьте доступ по `AllowUsers` и, при возможности, смените порт. fail2ban дополняет эти меры, а не заменяет их.

Проверяйте логи fail2ban (`/var/log/fail2ban.log`) при первом запуске — там видно, подхватил ли jail лог-файл и срабатывают ли фильтры.
