SSH — основной способ администрировать Linux-сервер. Открытый по умолчанию порт с авторизацией по паролю превращается в цель для перебора: сканеры интернета находят такие серверы за минуты. Разберём, как настроить безопасный SSH: ключи, отказ от паролей, fail2ban, ограничение пользователей и сокращение поверхности атаки.
Первичная настройка после установки
Сначала убедитесь, что подключение по ключу работает, и только потом отключайте пароли. Порядок действий важен: иначе можно лишиться доступа к серверу.
# с локальной машины: сгенерать ключ, если нет
ssh-keygen -t ed25519 -C "admin@home"
# скопировать ключ на сервер
ssh-copy-id user@server-ip
# проверить вход без пароля
ssh user@server-ip "whoami && hostname"
После успешного входа ключом откройте второй терминал и держите его открытым до полной проверки. Это ваша страховка на случай ошибки в конфигурации.
Конфигурация sshd
Основные опции находятся в /etc/ssh/sshd_config. Правьте файл через sshd -t после каждой правки: синтаксическая ошибка не даст службе запуститься.
# ключевые параметры
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers deploy admin
MaxAuthTries 3
LoginGraceTime 20
X11Forwarding no
# проверить конфигурацию
sudo sshd -t
# применить без разрыва текущей сессии
sudo systemctl reload sshd
Опция AllowUsers сужает список входящих: даже украденный ключ бесполезен, если имени нет в списке. Для серверов с автоматизацией используйте отдельные учётные записи под задачи.
Альтернативный порт — за и против
Смена порта уменьшает шум в логах, но не является защитой: сканеры проверяют диапазоны. Реальная польза — меньше автоматического мусора. Если меняете порт, настройте файрвол до перезагрузки sshd.
# сменить порт
sudo sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config
# открыть в файрволе ДО reload
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp
sudo ufw status verbose
# применить
sudo sshd -t && sudo systemctl reload sshd
Проверьте новое подключение во второй сессии, прежде чем закрывать первую.
fail2ban против перебора
fail2ban анализирует логи и блокирует адреса после неудачных попыток. Для SSH это первый эшелон защиты, особенно если по каким-то причинам осталась авторизация по паролю.
sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo systemctl enable --now fail2ban
# активные тюрьмы и баны
sudo fail2ban-client status sshd
# посмотреть, что блокируется сейчас
sudo fail2ban-client status sshd | tail -10
# разблокировать свой адрес после неудачи
sudo fail2ban-client set sshd unbanip 203.0.113.10
Настройте maxretry и findtime под себя: слишком агрессивные значения блокируют легитимных пользователей при сбоях сети.
Сильные ключи и их ротация
Ed25519 рекомендуется для новых ключей: короткий, быстрый, устойчивый. RSA-ключи длиной менее4096 бит стоит заменить. Храните ключ с фразой-паролем и используйте ssh-agent, чтобы не вводить её при каждом входе.
# агент и добавление ключа
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# список ключей в агенте
ssh-add -l
# ротация: добавить новый ключ, проверить вход, удалить старый
ssh-copy-id -i ~/.ssh/id_ed25519_new.pub user@server
# на сервере: убрать старую строку из authorized_keys
grep -n "" ~/.ssh/authorized_keys | head
Ротацию выполняйте в два этапа: сначала добавляете новый ключ, потом удаляете старый через несколько дней.
Мониторинг входов
Журнал SSH — источник информации о попытках взлома и о реальных ошибках. Настройте его просмотр и оповещения о массовых попытках.
# неудачные входы за сутки
sudo grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head
# успешные входы
sudo grep "Accepted" /var/log/auth.log | tail -20
# текущие сеансы
who
ss -tnp | grep :22
Если видите десятки стран в логе — смените пароли и проверьте, не осталась ли включённой авторизация по паролю.
Шифрование и переиспользование соединений
Включите переиспользование соединений на локальной машине: это ускоряет повторные подключения и работу через SCP/RSYNC.
# ~/.ssh/config
# Host server
# HostName 203.0.113.10
# Port 2222
# User deploy
# IdentityFile ~/.ssh/id_ed25519
# ControlMaster auto
# ControlPath ~/.ssh/cm-%r@%h:%p
# ControlPersist 10m
ssh -O check server 2>/dev/null && echo "мультиплексор работает"
Чек-лист безопасности
- Вход по ключу работает, пароли отключены.
- Root-вход запрещён.
- Список разрешённых пользователей задан.
- fail2ban активен и банит адреса.
- Файрвол закрывает лишние порты.
- Ключи с фразой-паролем, ротация запланирована.
- Логи отправляются наружу сервера.
# быстрая проверка
sudo sshd -T | grep -E "permitrootlogin|passwordauthentication|allowusers"
sudo fail2ban-client status sshd
sudo ufw status verbose
Защита от сканирования и шум в логах
После настройки оцените, насколько сервер вообще виден снаружи. Сканирование портов помогает понять, не торчит ли лишнее, а логи показывают, продолжают ли боты перебор после запрета паролей.
# что открыто снаружи (со своего сервера)
sudo ss -tlnp
# внешняя проверка нужных портов только для своего IP
nmap -Pn -p 22,80,443 server-ip 2>/dev/null | tail -10
# свежие попытки входа
sudo journalctl -u ssh -since "1 hour ago" | grep -ciE "failed|invalid"
Если после отключения паролей число неудачных попыток не упало, значит, кто-то всё равно ломится — оставьте fail2ban включённым и рассмотрите ограничение доступа по географии на уровне файрвола.
Резервный доступ и восстановление
Продумайте сценарий потери доступа заранее: консоль провайдера, живой носитель или вторая учётная запись. Правки sshd_config без проверки — самая частая причина блокировки.
# держать открытым второй терминал до проверки
# и дублировать конфиг перед правкой
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
# после правок — обязательно тест и reload
sudo sshd -t && sudo systemctl reload sshd
# если доступ потерян: восстановить через консоль провайдера
# sudo cp /etc/ssh/sshd_config.bak.* /etc/ssh/sshd_config
Раз в квартал повторяйте чек-лист: проверка ключей в authorized_keys, удаление неиспользуемых, обновление fail2ban и просмотр журнала входов. Без периодической ревизии настройки деградируют.
Итог
Безопасный SSH строится на ключах, отказе от пароля и root-входа, fail2ban и файрволе. Меняйте порт осознанно, держите второй открытый терминал при правках, ротируйте ключи в два этапа и следите за журналом входов. Эти меры закрывают подавляющее большинство автоматических атак.