Как защитить SSH на Linux-сервере
Практика3 минРедакция Innovialabs
Коротко
Безопасный SSH — это вход только по ключам под отдельным пользователем с sudo, запрет входа для root и по паролю, fail2ban против перебора, файрвол с ограничением доступа и регулярный просмотр логов. Для критичных серверов добавьте второй фактор, например аппаратный ключ.
Что сделать в первую очередь
Любой сервер с открытым портом 22 постоянно получает попытки входа от ботов. Минимальный набор защиты:
- Вход только по SSH-ключам.
- Запрет входа для root и по паролю.
- Отдельный пользователь с
sudo. - fail2ban или аналог против перебора.
- Файрвол, который открывает SSH только нужным адресам, если это возможно.
Главное правило при настройке: не закрывайте текущую сессию, пока не проверите вход в новом окне терминала. Иначе легко потерять доступ к серверу.
Шаг 1. Отдельный пользователь и ключи
Создайте пользователя на сервере и дайте ему права sudo (команда зависит от дистрибутива — например, группа sudo в Debian/Ubuntu или wheel в RHEL-подобных системах).
На своём компьютере создайте ключ и скопируйте открытую часть на сервер:
ssh-keygen -t ed25519 -C "laptop-work"
ssh-copy-id deploy@your-server
Защитите приватный ключ парольной фразой — тогда украденный файл ключа сам по себе бесполезен. Для каждого устройства лучше заводить свой ключ: при потере ноутбука удаляется одна строка в authorized_keys.
Шаг 2. Настройка sshd
Откройте /etc/ssh/sshd_config (или создайте файл в /etc/ssh/sshd_config.d/, если дистрибутив его подключает) и задайте:
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AllowUsers deploy
MaxAuthTries 3
Проверьте синтаксис и перечитайте конфигурацию:
sudo sshd -t && sudo systemctl reload ssh
В некоторых дистрибутивах служба называется sshd. После перезагрузки конфигурации откройте новое окно и убедитесь, что входите по ключу.
Смена порта с 22 на другой уменьшает шум в логах, но не является защитой: сканеры находят SSH на любом порту. Делайте это при желании, но не вместо остальных шагов.
Шаг 3. fail2ban
fail2ban читает логи и временно блокирует IP после нескольких неудачных попыток. Минимальная настройка в /etc/fail2ban/jail.local:
[sshd]
enabled = true
maxretry = 5
findtime = 10m
bantime = 1h
Статус и заблокированные адреса:
sudo fail2ban-client status sshd
При входе только по ключам перебор паролей уже бесполезен, но fail2ban снижает нагрузку и шум в логах.
Шаг 4. Файрвол
Закройте всё, что не нужно, и по возможности ограничьте SSH доверенными адресами. Пример для ufw:
sudo ufw default deny incoming
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
sudo ufw allow 80,443/tcp
sudo ufw enable
Если постоянного IP нет, используйте VPN или бастион-сервер (jump host): SSH открыт только для него, а он защищён особенно тщательно. Многие облачные провайдеры также дают сетевые фильтры (security groups) — это дополнительный слой перед сервером.
Шаг 5. Второй фактор
Для критичных серверов добавьте 2FA. Два распространённых варианта:
| Вариант | Как работает | Особенности |
|---|---|---|
| Аппаратный ключ (FIDO2) | Ключ типа ed25519-sk, нужен физический токен | Простая настройка, защита от кражи файла ключа |
| TOTP через PAM | Ключ плюс код из приложения-аутентификатора | Нужна настройка PAM и AuthenticationMethods |
Аппаратный ключ создаётся так:
ssh-keygen -t ed25519-sk
Для TOTP-варианта проверьте инструкцию вашего дистрибутива и обязательно оставьте открытой рабочую сессию на время тестирования.
Шаг 6. Аудит входов
Регулярно смотрите, кто и откуда входит:
sudo journalctl -u ssh --since "24 hours ago"
last -n 20
sudo lastb -n 20
Что проверять:
- успешные входы с незнакомых IP;
- новые строки в
~/.ssh/authorized_keysу пользователей; - появление новых пользователей с правами sudo.
Для нескольких серверов удобнее отправлять логи в централизованную систему и настроить оповещения.