MHOSTMHOST

Усиление SSH

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

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

  • VPS mHost на 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-ключей

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

bash
ssh-keygen -t ed25519 -C "you@example.com"

На запрос пути можно просто нажать 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 "you@example.com".

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

bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@185.246.66.12

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

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

bash
cat ~/.ssh/id_ed25519.pub | ssh root@185.246.66.12 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

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

bash
ssh root@185.246.66.12

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

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

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

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

bash
sudo nano /etc/ssh/sshd_config

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

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

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

bash
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, несмотря на вашу правку.

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

bash
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 на mHost открыт по умолчанию, но это не распространяется на новый порт: его нужно открыть явно.

Ubuntu / Debian (ufw)

bash
sudo ufw status
sudo ufw allow 2222/tcp

AlmaLinux / Rocky (firewalld + SELinux)

bash
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:

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

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

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

bash
sudo sshd -t

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

Ubuntu / Debian

bash
sudo systemctl restart ssh

AlmaLinux / Rocky

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

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

bash
ssh -p 2222 root@185.246.66.12

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

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

bash
sudo ufw delete allow 22/tcp
bash
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», а общий чек-лист по безопасности сервера — в статье «Чек-лист безопасности сервера».