Усиление SSH

В этой статье вы настроите вход на VPS ForestsNet Cloud по SSH-ключу вместо пароля, отключите парольный и root-доступ по SSH в sshd_config, при желании смените порт SSH и безопасно перезапустите sshd, не потеряв доступ к серверу.

Что понадобится

  • VPS ForestsNet Cloud на Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
  • Уже работающий доступ по SSH — под root или пользователем с sudo (пока по паролю; ключ настроим по ходу статьи). Если ещё ни разу не подключались к серверу, начните со статьи «Консоль VNC и первое подключение (SSH/RDP)» — там тоже есть базовые шаги с ssh-keygen/ssh-copy-id, здесь мы разберём их подробнее и пойдём дальше.
  • SSH-клиент на своём компьютере (не на сервере): на macOS и Linux он уже встроен, на Windows 10/11 тоже обычно есть из коробки — либо графический клиент PuTTY.
  • Доступ к панели VMmanager 6 — как запасной вариант: если что-то пойдёт не так с самим SSH, на сервер всё равно можно попасть через графическую консоль VNC прямо в браузере (см. «Как войти в VMmanager 6»).
ℹ️ Совет: все команды на сервере ниже даны от имени root. Если вы работаете под обычным пользователем — добавляйте sudo перед каждой командой.

Шаг 1. Сгенерируйте пару SSH-ключей

Ключи генерируются на своём компьютере (клиенте), а не на сервере:

ssh-keygen -t ed25519 -C "[email protected]"

На запрос пути можно просто нажать Enter — ключ сохранится в ~/.ssh/id_ed25519 (закрытый ключ) и ~/.ssh/id_ed25519.pub (открытый). На запрос passphrase рекомендуется задать пароль на сам ключ: он не передаётся на сервер и не связан с паролем учётной записи, а лишь защищает файл ключа на вашем диске.

⚠️ Важно: файл id_ed25519 (без .pub) — закрытый ключ. Его нельзя копировать на сервер, публиковать или передавать кому-либо. На сервер уходит только id_ed25519.pub.
ℹ️ Совет: ed25519 — современный, компактный и рекомендуемый сейчас тип ключа (если вообще не указывать -t, ssh-keygen и так создаст ключ Ed25519 — он используется по умолчанию). Если нужна совместимость со старым ПО или оборудованием, которое Ed25519 не поддерживает, используйте RSA: ssh-keygen -t rsa -b 4096 -C "[email protected]".

Шаг 2. Скопируйте публичный ключ на сервер

ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]

Замените [email protected] на своего пользователя и IP-адрес сервера. Команда допишет ваш открытый ключ в ~/.ssh/authorized_keys на сервере, попросив пароль в последний раз.

Если ssh-copy-id недоступен (например, в Windows PowerShell без утилит OpenSSH), сделайте то же самое вручную:

cat ~/.ssh/id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Проверьте вход по ключу — в новом окне терминала, не закрывая текущую сессию:

ssh [email protected]

Подключение должно пройти без запроса пароля от учётной записи (запрос passphrase от самого ключа, если вы его задали в шаге 1, — это другое, и это нормально).

⚠️ Важно: не переходите к шагу 3, пока не убедитесь, что вход по ключу действительно работает. Как только вы отключите PasswordAuthentication, пароль перестанет приниматься совсем, и если ключ не настроен — вы потеряете доступ к серверу.

Шаг 3. Отключите вход по паролю и ограничьте root в sshd_config

Откройте конфигурацию SSH-сервера:

sudo nano /etc/ssh/sshd_config

Найдите (или добавьте, если их нет) следующие параметры и приведите к такому виду:

PasswordAuthentication no
PermitRootLogin prohibit-password
  • PasswordAuthentication no — полностью отключает вход по паролю для всех пользователей; дальше — только по ключу.
  • PermitRootLogin prohibit-password — root по-прежнему может зайти по SSH, но только с ключом, не с паролем. Это безопасный вариант по умолчанию — особенно если root является единственной учётной записью на сервере.
ℹ️ Совет: если у вас уже настроен отдельный пользователь с sudo и вы проверили, что вход по ключу под ним работает, можно ужесточить настройку до PermitRootLogin no — тогда root не сможет зайти по SSH вообще, ни по паролю, ни по ключу. Не ставьте no, если root — ваш единственный способ попасть на сервер по SSH: так вы гарантированно заблокируете сами себя.

Сохраните файл, затем проверьте синтаксис и отдельно — какие значения реально применятся:

sudo sshd -t
sudo sshd -T | grep -i passwordauthentication
sudo sshd -T | grep -i permitrootlogin

sshd -t проверяет файл на синтаксические ошибки. sshd -T выводит итоговую (эффективную) конфигурацию — то, что реально применится после перезапуска, с учётом всех подключаемых файлов.

⚠️ Важно: на облачных образах Ubuntu cloud-init может создать файл /etc/ssh/sshd_config.d/50-cloud-init.conf со строкой PasswordAuthentication yes. Файлы из sshd_config.d/ подключаются директивой Include в самом начале sshd_config, а для каждого параметра в OpenSSH побеждает первое найденное значение — поэтому такая строка из cloud-init перебьёт то, что вы прописали в основном файле, и sshd -T покажет yes, несмотря на вашу правку.

Проверьте, не переопределяет ли что-то ваши настройки:

sudo grep -rn "PasswordAuthentication" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf

Если лишняя строка нашлась в одном из файлов sshd_config.d/ — исправьте или удалите её прямо там и повторите проверку через sshd -T из шага выше.

Пока не перезапускайте sshd — сделаете это в шаге 5, вместе со сменой порта, если решите её делать.

Шаг 4. Смените порт SSH (опционально)

Смена порта не заменяет вход по ключу и ограничение root из шага 3 — она лишь снижает фоновый шум от автоматических сканеров, которые круглосуточно перебирают порт 22 по всему интернету. Если это не критично, шаг можно пропустить и перейти сразу к шагу 5.

⚠️ Важно: порядок действий строгий — сначала откройте новый порт в файрволе, и только потом меняйте Port в sshd_config. Сделаете наоборот — после перезапуска sshd на новом порту файрвол его заблокирует, и вы потеряете доступ к серверу.

Сначала — откройте новый порт в файрволе. Порт 22 на ForestsNet Cloud открыт по умолчанию, но это не распространяется на новый порт: его нужно открыть явно.

Ubuntu / Debian (ufw)

sudo ufw status
sudo ufw allow 2222/tcp

AlmaLinux / Rocky (firewalld + SELinux)

sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo semanage port -a -t ssh_port_t -p tcp 2222
ℹ️ Совет: если команды semanage нет, поставьте пакет: sudo dnf install -y policycoreutils-python-utils. Если порт 2222 уже помечен под другой сервис в SELinux, -a откажет с ошибкой «already defined» — в этом случае используйте -m вместо -a.
⚠️ Важно: подробный разбор команд и логики ufw — в статье «Настройка файрвола UFW».

Затем пропишите новый порт в sshd_config:

sudo nano /etc/ssh/sshd_config
Port 22
Port 2222

Директиву Port можно указывать несколько раз — sshd будет слушать сразу оба порта. Оставьте 22 до тех пор, пока не убедитесь, что порт 2222 работает (уберёте лишнюю строку в шаге 5), — так у вас остаётся путь назад, если что-то пойдёт не так.

Шаг 5. Проверьте конфигурацию и перезапустите sshd, не закрывая текущую сессию

sudo sshd -t

Перезапустите службу — команда зависит от дистрибутива.

Ubuntu / Debian

sudo systemctl restart ssh

AlmaLinux / Rocky

sudo systemctl restart sshd
⚠️ Важно: не закрывайте текущую SSH-сессию сразу после перезапуска.

Откройте новое окно терминала и подключитесь заново, пока старая сессия ещё держится открытой:

ssh -p 2222 [email protected]

Флаг -p 2222 нужен, только если вы меняли порт в шаге 4; если нет — просто ssh [email protected]. Закрывайте старую сессию только после того, как новое подключение прошло успешно. Если новое подключение не проходит — старая сессия всё ещё открыта: вернитесь к sshd_config, исправьте настройку и повторите перезапуск. Дополнительная подстраховка на случай, если оборвутся обе сессии, — графическая консоль VNC в VMmanager 6 (см. «Как войти в VMmanager 6»): она не зависит от SSH и открывается прямо в браузере.

Если вы меняли порт в шаге 4 и новое подключение подтвердилось — уберите временную лазейку: удалите строку Port 22 из sshd_config, закройте старое правило файрвола и перезапустите sshd ещё раз, с той же дисциплиной (новое окно терминала перед закрытием старого).

sudo ufw delete allow 22/tcp
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
Готово: SSH принимает вход только по ключу, root ограничен (или полностью отключён — если вы выбрали такой вариант в шаге 3), при желании — на нестандартном порту. Проверить текущее состояние в любой момент можно командой sudo sshd -T | grep -iE "^(port|passwordauthentication|permitrootlogin)".

Что дальше

Ключ вместо пароля и нестандартный порт снижают фоновый шум, но не защищают от целенаправленного перебора — для этого добавьте автоматическую блокировку по IP после нескольких неудачных попыток, см. «Fail2ban: блокировка после неудачных попыток входа». Полный разбор правил файрвола — в статье «Настройка файрвола UFW», а общий чек-лист по безопасности сервера — в статье «Чек-лист безопасности сервера».