Защита сервера от брутфорса: комплексный подход

Администрирование
Защита сервера от брутфорса: комплексный подход

Защита от брутфорса — первое, чем стоит заняться после покупки VPS: боты начинают подбирать пароли к SSH буквально через минуты после того, как сервер получил публичный IP. Это не целенаправленная атака на вас — автоматические сканеры круглосуточно перебирают весь диапазон IPv4 и пробуют типовые пары логин-пароль на всём, что отвечает на 22-м порту. Хорошая новость: комплексная защита от подбора паролей строится за полчаса из бесплатных инструментов — SSH-ключей, fail2ban, rate-limit и файрвола. В этой статье собран проверенный набор мер для Ubuntu 24.04 LTS: после настройки брутфорс превращается из угрозы в безобидный шум в логах.

Почему брутфорс — это серьёзно, даже для «пустого» сервера

Типичное возражение: «на моём сервере нечего красть». Но злоумышленникам не нужны ваши файлы — им нужен сам сервер:

  • рассылка спама и фишинга с вашего IP (в результате — абузы и блокировки адреса);
  • использование сервера как прокси для атак на других;
  • майнинг на ваших ресурсах — CPU в 100% и тормозящие проекты;
  • шифрование данных с требованием выкупа, если что-то ценное всё же было.

Оценить масштаб фонового перебора можно за минуту — посмотрите неудачные попытки входа за сегодня:

journalctl -u ssh --since today | grep -c "Failed password"

На свежем сервере с открытым 22-м портом счёт обычно идёт на сотни в сутки. Разберёмся, как сделать все эти попытки бесполезными.

Уровень 1. SSH-ключи вместо пароля — база всей защиты

Пока вход возможен по паролю, брутфорс имеет шанс. Ключ Ed25519 — это 256 бит случайности: перебрать его невозможно физически, поэтому переход на ключи закрывает саму суть проблемы, а не симптомы.

На своём компьютере (Windows 10/11, macOS и Linux — команды одинаковые) сгенерируйте пару ключей:

ssh-keygen -t ed25519 -C "admin@myserver"

Скопируйте публичный ключ на сервер и проверьте вход:

ssh-copy-id user@203.0.113.10
ssh user@203.0.113.10

Только убедившись, что вход по ключу работает, отключайте парольную аутентификацию. В Ubuntu 24.04 правильнее сделать это отдельным файлом-надстройкой:

sudo tee /etc/ssh/sshd_config.d/90-hardening.conf <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
MaxAuthTries 3
LoginGraceTime 20
EOF
sudo sshd -t && sudo systemctl restart ssh

Что делают эти параметры: PasswordAuthentication no полностью запрещает вход по паролю, PermitRootLogin prohibit-password оставляет root только с ключом (ещё лучше — работать через отдельного пользователя, как описано в статье о создании пользователя с sudo), MaxAuthTries 3 и LoginGraceTime 20 обрывают сессию после трёх неудачных попыток или 20 секунд бездействия. Команда sshd -t проверяет конфиг до перезапуска — это страховка от того, чтобы не отрезать себе доступ. Подробный разбор работы с ключами есть в статье про SSH-ключи вместо пароля.

Важно: не закрывайте текущую SSH-сессию, пока не проверите вход по ключу из нового окна терминала. Если что-то пошло не так, у Cheap-Host всегда остаётся доступ через консоль в панели — сервер не «окирпичится».

Уровень 2. Fail2ban — автоматическая блокировка перебора

Даже когда вход по паролю отключён, боты продолжают долбиться в порт — это забивает логи и ест ресурсы на обработку соединений. Fail2ban читает журналы, находит IP с повторяющимися неудачными попытками и блокирует их на уровне файрвола.

sudo apt update && sudo apt install -y fail2ban

Настройки держите в отдельном файле, чтобы обновления пакета их не затёрли:

sudo tee /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 3
bantime.increment = true
bantime.maxtime = 1w
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled = true
backend = systemd
EOF
sudo systemctl enable --now fail2ban

Логика настроек: три неудачные попытки (maxretry = 3) за десять минут (findtime = 10m) — и IP блокируется на час. Параметр bantime.increment = true включает растущие баны: каждый повторный залёт удваивает срок вплоть до недели, так что упорные боты быстро исчезают из логов. В ignoreip добавьте свой статический IP, если он есть, — чтобы случайно не забанить самого себя.

Проверка работы:

sudo fail2ban-client status sshd

Команда покажет число заблокированных адресов. Разблокировать свой IP при необходимости: sudo fail2ban-client set sshd unbanip 203.0.113.50. Больше сценариев — в отдельной статье про настройку fail2ban.

Уровень 3. Rate-limit — защищаем формы логина в вебе

Брутфорсят не только SSH: страницы входа WordPress, панелей и любых приложений с авторизацией — вторая по популярности цель. Здесь работает связка «лимит запросов в Nginx + jail в fail2ban».

Лимит запросов в Nginx

# в блоке http { }
limit_req_zone $binary_remote_addr zone=login:10m rate=3r/m;

# в блоке server { }
location = /wp-login.php {
    limit_req zone=login burst=3 nodelay;
    # далее обычная обработка PHP
}

Три запроса в минуту с одного IP — живому человеку хватает с запасом, а перебор словаря становится бессмысленно медленным: превысившие лимит запросы получают ошибку 503 без обращения к PHP.

Jail fail2ban для веб-авторизации

Дополнительно забаним тех, кто стабильно получает отказы авторизации в логах веб-сервера:

sudo tee -a /etc/fail2ban/jail.local <<'EOF'

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

[nginx-limit-req]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/error.log
maxretry = 10
EOF
sudo systemctl restart fail2ban

Оба фильтра идут в комплекте fail2ban: первый ловит неудачные попытки HTTP-аутентификации, второй — тех, кто регулярно упирается в limit_req. Так уровень веба и уровень файрвола работают вместе: Nginx замедляет, fail2ban отсекает.

Уровень 4. Файрвол и сокращение поверхности атаки

Брутфорсить можно только то, что доступно снаружи. Принцип простой: всё, что не должно быть публичным, — закрыто.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enable

Дополнительные меры, каждая из которых уменьшает поверхность атаки:

  • Базы данных и панели — не наружу. MySQL, PostgreSQL, Redis должны слушать 127.0.0.1. Если нужен удалённый доступ — только с конкретного IP: sudo ufw allow from 198.51.100.7 to any port 3306.
  • Смена SSH-порта. От целевой атаки не спасает, но убирает 90–95% фонового шума сканеров. Как сделать правильно — в статье о смене SSH-порта.
  • Доступ к администрированию по VPN. Самый строгий вариант: SSH и панели доступны только из VPN-туннеля, снаружи порты закрыты полностью — брутфорсить становится просто нечего.
  • Свежие пакеты. Подбор пароля — не единственный вектор; дыры в старом софте эксплуатируют те же ботнеты. Включите unattended-upgrades для автоматических обновлений безопасности.

Сводная таблица: уровни защиты от брутфорса

МераОт чего защищаетВремя настройкиПриоритет
SSH-ключи + отключение паролейДелает подбор пароля к SSH невозможным10 минутОбязательно
Fail2ban (jail sshd)Блокирует перебирающие IP, чистит логи10 минутОбязательно
Rate-limit + jail для веб-логинаПеребор паролей к сайту и панелям15 минутЕсли есть веб-авторизация
UFW: закрыть лишние портыСокращает поверхность атаки5 минутОбязательно
Смена SSH-портаФоновый шум сканеров5 минутОпционально
Администрирование через VPNПолностью скрывает служебные порты30 минутДля параноиков (в хорошем смысле)

Как убедиться, что защита работает

  1. Логи SSH: journalctl -u ssh --since today | grep "Failed" — после отключения паролей строки «Failed password» сменяются на отклонённые попытки без шанса на успех, а после fail2ban их количество падает в разы.
  2. Статистика fail2ban: sudo fail2ban-client status покажет все активные jail и число банов — цифры наглядно демонстрируют, сколько попыток отбито.
  3. Открытые порты снаружи: sudo ss -tlnp — убедитесь, что наружу смотрят только нужные сервисы.
  4. Регулярный разбор логов: раз в неделю просматривайте журналы на предмет аномалий — методика описана в статье об анализе логов сервера.

Отдельный плюс изолированной виртуализации: на KVM-серверах (все VPS Cheap-Host работают именно на KVM) у вас полный root и собственное ядро — файрвол, fail2ban и настройки sshd полностью под вашим контролем, никаких ограничений со стороны соседей по ноде. А базовая DDoS-защита L3/L4 на уровне площадки отсекает грубый мусорный трафик ещё до вашего сервера.

FAQ

Достаточно ли одного fail2ban для защиты от брутфорса?

Нет. Fail2ban ограничивает скорость перебора, но не устраняет саму возможность подбора пароля. База — SSH-ключи и отключённый вход по паролю; fail2ban поверх них отсекает шум и прикрывает веб-формы.

Помогает ли смена SSH-порта?

От массовых сканеров — да, шум в логах падает на порядок. От целенаправленного подбора — нет: порт находится сканированием за минуты. Используйте как дополнение, а не замену ключей и fail2ban.

Fail2ban заблокировал мой собственный IP. Что делать?

Зайдите на сервер через консоль в панели хостинга и выполните sudo fail2ban-client set sshd unbanip ВАШ_IP. Чтобы не повторялось — добавьте свой IP в ignoreip в jail.local.

Как понять, что сервер пытаются брутфорсить?

Выполните journalctl -u ssh --since today | grep -c "Failed password". Сотни неудачных попыток в сутки с разных IP — нормальный фон для любого публичного адреса; это не значит, что атакуют именно вас.

Нужна ли защита, если на сервере ничего ценного?

Да. Взломанный сервер используют для спама, прокси и атак — вы получите абузы, блокировку IP и в худшем случае расторжение договора с хостером. Минимальный набор мер настраивается за 15–30 минут.

Вывод

Комплексная защита от брутфорса — это слои: SSH-ключи убирают саму возможность подбора, fail2ban автоматически отсекает настойчивых ботов, rate-limit прикрывает веб-формы, а файрвол сокращает поверхность атаки до минимума. Ни одна мера по отдельности не панацея, но вместе они делают перебор паролей бессмысленным занятием.

Если вы только выбираете сервер под проект — у Cheap-Host тариф Pro за 750 ₽/мес (12 vCPU, 16 ГБ RAM, NVMe 128 ГБ) даёт полный root на KVM, чтобы настроить все описанные меры без ограничений, плюс базовую DDoS-защиту L3/L4. Сервер выдаётся за 45–60 секунд — тарифы на cheap-host.onl, а поддержка 24/7 отвечает без шаблонных отписок.

Читайте также