SSH — основной способ удалённого управления Linux-сервером. Через него администратор подключается к VPS или dedicated server, выполняет настройки, обновляет систему, проверяет логи и управляет сервисами.
Из-за этого SSH почти всегда становится одной из первых целей для автоматических атак. Боты сканируют интернет, находят открытый порт 22 и начинают подбирать логины и пароли. Такая атака называется brute force — перебор паролей.
Даже если пароль сложный, постоянные попытки входа создают лишнюю нагрузку, засоряют логи и повышают риск компрометации сервера. Если используется слабый пароль, стандартный логин root и открытый SSH-порт, сервер может быть взломан автоматически.
Обычно атака выглядит так:
Failed password for root from 185.XX.XX.XX port 54321 ssh2
Failed password for admin from 185.XX.XX.XX port 54322 ssh2
Failed password for test from 185.XX.XX.XX port 54323 ssh2
В этой статье рассмотрим 5 основных решений, которые помогают защитить SSH от brute force атак.
1. Используйте SSH-ключи и отключите вход по паролю
Самый важный шаг — отказаться от входа по паролю и использовать SSH-ключи. Пароль можно подобрать, особенно если он простой или уже был скомпрометирован. SSH-ключ перебрать практически невозможно, если приватный ключ хранится безопасно.
Создайте SSH-ключ на локальном компьютере:
ssh-keygen -t ed25519 -C “admin@example.com”
Добавьте публичный ключ на сервер:
ssh-copy-id user@SERVER_IP
Или вручную добавьте содержимое публичного ключа в файл:
~/.ssh/authorized_keys
Важно
Перед отключением входа по паролю обязательно проверьте, что вход по SSH-ключу уже работает.
Затем откройте конфигурацию SSH:
sudo nano /etc/ssh/sshd_config
Укажите:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
Проверьте конфигурацию:
sudo sshd -t
Если ошибок нет, перезагрузите SSH:
sudo systemctl reload ssh
или:
sudo systemctl reload sshd
Название сервиса зависит от дистрибутива.
Не закрывайте текущую SSH-сессию, пока не проверите вход в новой вкладке терминала.
2. Запретите вход под root
Многие brute force атаки в первую очередь пробуют логин root, потому что он существует почти на каждом Linux-сервере. Поэтому root-вход через SSH лучше отключить, а для администрирования использовать отдельного пользователя с правами sudo.
Создайте отдельного пользователя:
sudo adduser adminuser
sudo usermod -aG sudo adminuser
Проверьте вход под этим пользователем:
ssh adminuser@SERVER_IP
Проверьте права sudo:
sudo whoami
Ожидаемый ответ:
root
После этого в конфигурации SSH укажите:
PermitRootLogin no
И примените изменения:
sudo sshd -t
sudo systemctl reload ssh
Такой подход снижает риск автоматического подбора доступа, потому что атакующему нужно знать не только ключ, но и имя отдельного пользователя.
3. Ограничьте количество попыток входа
Даже если вход по паролю отключён, полезно ограничить количество попыток авторизации. Это помогает быстрее разрывать подозрительные подключения и уменьшает нагрузку от автоматических атак.
Откройте конфигурацию SSH:
sudo nano /etc/ssh/sshd_config
Добавьте или измените параметры:
MaxAuthTries 3
LoginGraceTime 30
Что это значит:
MaxAuthTries 3 — не более 3 попыток аутентификации за одно подключение
LoginGraceTime 30 — 30 секунд на успешный вход
После изменения проверьте конфигурацию:
sudo sshd -t
Перезагрузите SSH:
sudo systemctl reload ssh
Рекомендация
Не стоит ставить слишком маленькие значения, если к серверу подключаются несколько администраторов или используются автоматизированные SSH-подключения.
4. Разрешите SSH только с доверенных IP или через VPN
Если SSH открыт для всего интернета, его будут постоянно сканировать боты. Более безопасный вариант — разрешить подключение только с доверенных IP-адресов.
Пример для UFW:
sudo ufw allow from YOUR_TRUSTED_IP to any port 22 proto tcp
sudo ufw deny 22/tcp
sudo ufw enable
Проверить правила:
sudo ufw status numbered
Пример логики:
Allow SSH from trusted IP
Deny SSH from all other IPs
Если у администраторов нет фиксированных IP, лучше использовать VPN. В таком случае SSH не публикуется напрямую в интернет, а доступен только из внутренней VPN-сети.
Этот вариант особенно хорошо подходит для production-серверов, Proxmox-инфраструктуры, OPNsense, внутренних сервисов, баз данных и корпоративных систем.
5. Установите Fail2Ban для автоматической блокировки атакующих IP
Fail2Ban — один из самых популярных инструментов для защиты SSH от brute force атак. Он анализирует логи, находит повторяющиеся неудачные попытки входа и временно блокирует IP-адрес атакующего через firewall.
Установка на Debian/Ubuntu:
sudo apt update
sudo apt install fail2ban -y
Создайте конфигурационный файл для SSH:
sudo nano /etc/fail2ban/jail.d/sshd.local
Пример конфигурации:
[sshd]
enabled = true
port = ssh
filter = sshd
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
Что означают параметры:
maxretry = 5 — заблокировать после 5 неудачных попыток
findtime = 10m — учитывать попытки за последние 10 минут
bantime = 1h — заблокировать IP на 1 час
Запустите Fail2Ban:
sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban
Проверьте статус:
sudo fail2ban-client status
sudo fail2ban-client status sshd
Если всё работает, в статусе будет видно количество заблокированных IP.
Также вместо Fail2Ban можно рассмотреть CrowdSec.
При стандартной установке CrowdSec обычно добавляет базовые Linux/SSH-коллекции, а после установки firewall bouncer уже может блокировать IP, которые срабатывают на SSH brute force.
То есть связка CrowdSec + bouncer не только видит подозрительные SSH-попытки в логах, но и применяет блокировку через firewall.
CrowdSec также можно расширить для защиты других сервисов: Nginx, Apache, Traefik, Docker или панелей управления.
Важно: сам CrowdSec engine отвечает за обнаружение, а bouncer — за реальную блокировку IP.
Итог
Защита SSH от brute force атак не должна ограничиваться одной настройкой. Лучший результат даёт комбинация нескольких мер:
- SSH keys
- No password login
- No root login
- Limited login attempts
- Firewall allowlist or VPN
- Fail2Ban
Для тестового VPS часто достаточно SSH-ключей, отключения пароля и Fail2Ban. Для production-сервера лучше использовать более строгий подход: закрыть SSH от всего интернета, разрешить доступ только с доверенных IP или через VPN и регулярно проверять состояние защиты.
Такой подход значительно снижает риск взлома и делает сервер устойчивее к автоматическим атакам.