VPS и Linux · ssh

Доступ к VPS через Termius и SSH-ключи: полный гайд для Windows

Генерируем ключ ed25519 на Windows, кладём его на сервер, собираем удобный профиль в Termius и только потом отключаем вход по паролю — в таком порядке, чтобы ни на одном шаге не потерять доступ к машине.

Серия «VPS с нуля»
  1. Доступ через Termius и SSH-ключи
  2. Брандмауэр UFW на Ubuntu Server
  3. Fail2ban для SSH на VPSскоро
  4. Автообновления и unattended-upgradesскоро

Почему ключи, а не пароль

Любой VPS с публичным IP начинают перебирать боты в первые минуты после создания. Достаточно открыть /var/log/auth.log на свежем сервере через час, чтобы увидеть сотни попыток войти под root, admin, ubuntu и test с паролями из словарей. Пароль, даже хороший, остаётся тем, что можно угадать, подсмотреть или утащить из менеджера паролей.

SSH-ключ устроен иначе: на сервере лежит только публичная половина, которой нельзя войти. Войти может только тот, у кого есть приватная половина — файл на вашем компьютере, который никогда не передаётся по сети.

✕ вход по паролю

  • перебирается ботами 24/7
  • утекает вместе с базами других сервисов
  • вводится руками — легко подсмотреть
  • один пароль на все устройства

✓ вход по ключу

  • 256-битный ключ ed25519 перебору не поддаётся
  • секрет не покидает ваше устройство
  • вход в один клик из Termius
  • ключ на каждое устройство — отзываются по одному

Как это работает за 60 секунд

При подключении сервер находит ваш публичный ключ в файле ~/.ssh/authorized_keys и предлагает клиенту подписать случайные данные. Клиент (Termius или ssh в PowerShell) подписывает их приватным ключом, сервер проверяет подпись публичным. Совпало — вы внутри. Пароль в этой схеме не участвует вообще, а перехват трафика ничего не даёт: подпись одноразовая.

◆ какой тип ключа выбрать
В 2026 году — ed25519. Он короткий (публичный ключ — одна строка ~80 символов), быстрый и поддерживается OpenSSH с версии 6.5, то есть любым живым Ubuntu, Debian или CentOS. RSA выбирайте только для совсем старого оборудования, и тогда не меньше 4096 бит.

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

В примерах ниже IP сервера — 203.0.113.10, пользователь — deploy. Подставляйте свои значения.

Шаг 1 — отдельный пользователь вместо root

Работать постоянно под root — плохая привычка: любая опечатка выполняется с максимальными правами, а логин root есть на каждом сервере и его перебирают первым. Создадим обычного пользователя с правом на sudo. Пока заходим по паролю — в PowerShell или в Termius, неважно:

powershell · первый вход
ssh root@203.0.113.10
ssh · root@vps
# обновим систему, раз уж зашли
apt update && apt upgrade -y

# создаём пользователя (спросит пароль — он пригодится для sudo)
adduser deploy

# добавляем в группу sudo
usermod -aG sudo deploy

# проверяем
id deploy
# uid=1000(deploy) gid=1000(deploy) groups=1000(deploy),27(sudo)
✓ пароль пользователя всё ещё нужен
После отключения входа по паролю в SSH пароль пользователя deploy никуда не денется — он нужен для sudo и для входа через VNC-консоль хостера. Сохраните его в менеджере паролей.

Шаг 2 — генерируем ключ на Windows

Есть два удобных пути. Первый — стандартный ssh-keygen в PowerShell: ключ лежит обычным файлом, его можно использовать и в Termius, и в VS Code, и в Git. Второй — генерация прямо в Termius, быстрее, но ключ живёт внутри приложения. Рекомендую первый.

AЧерез PowerShell (рекомендуется)

Откройте PowerShell (Win + X → «Терминал») и проверьте, что клиент OpenSSH на месте:

powershell
ssh -V
# OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2   — версия может отличаться

Если вместо версии — «команда не найдена», доставьте компонент: Параметры → Система → Дополнительные компоненты → Добавить компонент → Клиент OpenSSH, либо одной командой в PowerShell от администратора:

powershell · от администратора
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

Теперь генерируем ключ. Комментарий после -C — просто подпись, чтобы потом в authorized_keys было видно, с какого устройства этот ключ:

powershell
ssh-keygen -t ed25519 -C "home-pc-2026"

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\Mike/.ssh/id_ed25519):   ← Enter
Enter passphrase (empty for no passphrase):                              ← пароль к ключу
Enter same passphrase again:
Your identification has been saved in C:\Users\Mike/.ssh/id_ed25519
Your public key has been saved in C:\Users\Mike/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:q3H6v0zq2y8wJcV1...  home-pc-2026

Появилось два файла в C:\Users\<вы>\.ssh\:

ФайлЧто этоКуда
id_ed25519приватный ключтолько на этом ПК и в Termius. Никому не отправлять
id_ed25519.pubпубличный ключ, строка вида ssh-ed25519 AAAA… home-pc-2026на сервер, в authorized_keys
◆ нужна ли passphrase
Passphrase шифрует сам файл приватного ключа: если ноутбук украдут или файл утечёт, без неё ключ бесполезен. Termius спросит её один раз при импорте и дальше будет подставлять сам, так что неудобства почти нет. Пустую passphrase оправдывает только автоматизация (скрипты, CI) — и тогда это должен быть отдельный ключ.

BПрямо в Termius

Если PowerShell не хочется трогать вовсе:

Vault→Keychain→+ KEY / Generate key→тип ED25519→Label: home-pc-2026→Passphrase→Save

Публичную часть потом можно скопировать из карточки ключа (поле Public key) — она понадобится в следующем шаге.

⚠ ключи из PuTTYgen
Если у вас уже есть ключ .ppk от PuTTY, сначала сконвертируйте его: откройте в PuTTYgen → Load, затем Conversions → Export OpenSSH key. Termius и OpenSSH работают с форматом OpenSSH, а строку для сервера берите из поля «Public key for pasting into OpenSSH authorized_keys file».

Шаг 3 — копируем публичный ключ на сервер

В Linux для этого есть ssh-copy-id, но в Windows его нет. Ниже три равноценных способа — выберите любой.

01Одной командой из PowerShell

Команда читает ваш .pub-файл, заходит на сервер по паролю (последний раз!), создаёт каталог .ssh с правильными правами и дописывает ключ в конец authorized_keys:

powershell
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

02Через «Export to host» в Termius

Если ключ сгенерирован или импортирован в Termius, а хост уже добавлен с паролем: откройте ключ в Keychain и выберите Export to host (в некоторых версиях — пункт в меню «⋯» карточки ключа). Termius сам зайдёт на сервер по паролю и добавит ключ в ~/.ssh/authorized_keys выбранного пользователя.

03Вручную, через nano

Самый прозрачный способ. Скопируйте содержимое .pub в буфер обмена:

powershell
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard

Затем на сервере под пользователем deploy:

ssh · deploy@vps
mkdir -p ~/.ssh && chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys      # вставить строку ключа, Ctrl+O, Enter, Ctrl+X
chmod 600 ~/.ssh/authorized_keys

# проверка: одна строка на ключ, начинается с ssh-ed25519
cat ~/.ssh/authorized_keys
⚠ права доступа — частая причина отказа
OpenSSH молча игнорирует authorized_keys, если каталог или файл доступны на запись кому-то кроме владельца. Нужно ровно: ~/.ssh — 700, authorized_keys — 600, владелец — сам пользователь. Если создавали файлы из-под root для другого пользователя, не забудьте chown -R deploy:deploy /home/deploy/.ssh.
✓ на будущее: ключ при создании сервера
Большинство хостеров позволяют вставить публичный ключ прямо в форму заказа VPS — тогда он сразу окажется в /root/.ssh/authorized_keys, а вход по паролю для root часто отключён с первой минуты. Для нового пользователя ключ всё равно придётся добавить по инструкции выше.

Шаг 4 — настраиваем Termius

01Импортируем приватный ключ

Keychain→+ KEY→Import from key file→C:\Users\<вы>\.ssh\id_ed25519 (без .pub!)→ввести passphrase→Save

Альтернатива — открыть файл id_ed25519 в Блокноте, скопировать целиком (включая строки -----BEGIN OPENSSH PRIVATE KEY----- и -----END…) и вставить в поле Private key нового ключа.

02Создаём хост

Hosts→+ NEW HOST
ПолеЗначениеКомментарий
Address203.0.113.10IP или доменное имя сервера
Labelvps-fin-01как сервер будет называться в списке
GroupProductionгруппы наследуют настройки — удобно, когда серверов несколько
SSH · Port22поменяете, если перенесёте SSH на другой порт
Usernamedeployне root
Password— пусто —не заполняйте, иначе не поймёте, сработал ли ключ
Keyhome-pc-2026ключ из Keychain
◆ identities — для нескольких серверов
Если пользователь и ключ одинаковые на многих машинах, создайте в Keychain Identity (username + key) и привязывайте к хостам её. Поменяли ключ в Identity — он обновился у всех хостов сразу.

03Первое подключение и отпечаток сервера

Двойной клик по хосту. При первом подключении Termius покажет отпечаток ключа сервера (host key fingerprint) и спросит, доверять ли ему. Это защита от подмены сервера: в идеале сверьте отпечаток с тем, что показывает сам сервер через VNC-консоль хостера:

vnc-консоль · deploy@vps
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
# 256 SHA256:Xk1p...  root@vps (ED25519)

Совпало — принимайте. Termius сохранит отпечаток в Known Hosts, и если он когда-нибудь изменится без вашего ведома (переустановка ОС или атака), вы получите предупреждение.

Шаг 5 — проверяем вход по ключу

Прежде чем закрывать пароль, нужно убедиться, что сервер пускает именно по ключу, а не «по старой памяти» по паролю. Самый надёжный способ — посмотреть лог авторизации:

ssh · deploy@vps
sudo grep "Accepted" /var/log/auth.log | tail -n 3
# ... sshd[1432]: Accepted publickey for deploy from 198.51.100.7 port 51722 ssh2: ED25519 SHA256:q3H6...

Ключевое слово — publickey. Если там Accepted password, ключ не сработал: смотрите таблицу проблем в конце статьи. Дополнительно можно проверить из PowerShell, запретив клиенту пароль совсем:

powershell
ssh -o PasswordAuthentication=no -o PreferredAuthentications=publickey deploy@203.0.113.10

Шаг 6 — отключаем вход по паролю

Теперь самое важное. Откройте две сессии к серверу: в одной будете править конфиг, вторая — страховка. Не закрывайте её, пока не проверите вход в новой.

⚠ ловушка cloud-init в Ubuntu 22.04 / 24.04
Основной конфиг /etc/ssh/sshd_config подключает файлы из /etc/ssh/sshd_config.d/*.conf в самом начале, а для большинства параметров sshd действует правило «первое значение побеждает». На многих VPS cloud-init кладёт туда 50-cloud-init.conf со строкой PasswordAuthentication yes — и ваша правка в конце sshd_config просто игнорируется. Поэтому кладём свой файл с именем, которое сортируется раньше.
ssh · deploy@vps
# посмотрим, что уже лежит в каталоге
ls /etc/ssh/sshd_config.d/

# создаём свой файл — "00-" гарантирует, что он прочитается первым
sudo nano /etc/ssh/sshd_config.d/00-hardening.conf
/etc/ssh/sshd_config.d/00-hardening.conf
# вход только по ключам
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no

# root по SSH не нужен вовсе — работаем через deploy + sudo
PermitRootLogin no

# ограничиваем, кто вообще может входить
AllowUsers deploy

# меньше попыток на одно соединение и быстрее отваливаем молчунов
MaxAuthTries 3
LoginGraceTime 30
X11Forwarding no

Проверяем синтаксис и итоговые значения, которые sshd реально применит, — именно эта команда ловит ловушку cloud-init:

ssh · deploy@vps
sudo sshd -t                     # тишина = синтаксис в порядке
sudo sshd -T | grep -Ei "^(passwordauthentication|pubkeyauthentication|permitrootlogin|allowusers|kbdinteractive)"

# ожидаем:
# pubkeyauthentication yes
# passwordauthentication no
# kbdinteractiveauthentication no
# permitrootlogin no
# allowusers deploy

# применяем (в Ubuntu служба называется ssh, а не sshd)
sudo systemctl reload ssh

Не закрывая старую сессию, откройте новое подключение в Termius. Вошли — отлично. И контрольная проверка, что пароль действительно больше не принимается:

powershell
ssh -o PubkeyAuthentication=no deploy@203.0.113.10
# deploy@203.0.113.10: Permission denied (publickey).   ← то, что нужно
Правило, которое спасает от поездки в VNC-консоль: любые изменения в sshd — только при открытой второй сессии и только после sshd -t.

Опционально: нестандартный порт SSH

Перенос SSH с 22-го порта не делает сервер защищённее против целенаправленной атаки, но резко сокращает шум от ботов в логах. Если решите переносить — сначала откройте новый порт в файрволе (подробно — в статье про UFW), потом меняйте sshd.

В Ubuntu 24.04 SSH по умолчанию запускается через сокет-активацию systemd (ssh.socket), поэтому после смены порта одного reload мало:

ssh · deploy@vps
# 1. открыть новый порт в файрволе ЗАРАНЕЕ
sudo ufw allow 2222/tcp

# 2. добавить порт в наш файл
echo "Port 2222" | sudo tee -a /etc/ssh/sshd_config.d/00-hardening.conf
sudo sshd -t

# 3a. Ubuntu 24.04 (socket activation)
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

# 3b. Ubuntu 22.04 и старше
sudo systemctl restart ssh

# 4. проверить, что слушается новый порт
sudo ss -tlnp | grep -E ':2222|:22 '

В Termius поменяйте порт в настройках хоста, проверьте вход — и только после этого закройте 22-й порт в файрволе.

Полезные возможности Termius

ФункцияЗачем
SFTPфайловый менеджер в соседней вкладке: перетаскивайте файлы между ПК и сервером, используя тот же ключ
Port Forwardingлокальный проброс порта — открыть веб-панель, слушающую только 127.0.0.1 на сервере, у себя в браузере, не публикуя её в интернет
Snippetsсохранённые команды: sudo apt update && sudo apt upgrade -y, sudo ufw status numbered — запуск в один клик, в том числе сразу на нескольких хостах
Groupsобщие настройки (порт, identity, тема терминала) для группы серверов
Known Hostsсписок доверенных отпечатков серверов; при переустановке ОС удалите старую запись здесь
Синхронизацияв зависимости от тарифа хосты и ключи синхронизируются между устройствами с шифрованием на стороне клиента — удобно, чтобы тот же ключ был на телефоне
✓ проброс порта: пример
Панель на сервере слушает 127.0.0.1:8080. В Termius: Port Forwarding → New → Local, Local port 8080, Host — ваш сервер, Destination 127.0.0.1:8080. Запустите правило и откройте http://localhost:8080 — трафик идёт внутри SSH-туннеля, а в файрволе порт 8080 так и остаётся закрыт. Эквивалент для PowerShell: ssh -L 8080:127.0.0.1:8080 deploy@203.0.113.10.

Бэкап ключа и что делать, если он потерян

Частые проблемы

СимптомПричина и решение
Permission denied (publickey)в authorized_keys не тот ключ, неправильные права (700/600) или вы входите не тем пользователем. Смотрите sudo tail -f /var/log/auth.log во второй сессии — там будет конкретная причина
Пароль по-прежнему принимаетсясработала ловушка cloud-init: sshd -T показывает passwordauthentication yes. Переименуйте свой файл в 00-… или поправьте 50-cloud-init.conf
WARNING: UNPROTECTED PRIVATE KEY FILE (Windows)у файла ключа унаследованы права других пользователей. Исправление: icacls $env:USERPROFILE\.ssh\id_ed25519 /inheritance:r /grant:r "$($env:USERNAME):(R)"
Termius: «Invalid private key»вставлен .pub вместо приватного ключа, ключ в формате PuTTY (.ppk) или скопирован без строк BEGIN/END
REMOTE HOST IDENTIFICATION HAS CHANGEDсервер переустановлен, и его ключ изменился. Удалите старую запись в Termius → Known Hosts или командой ssh-keygen -R 203.0.113.10
После смены порта нет подключенияпорт не открыт в ufw или в файрволе хостера, либо на Ubuntu 24.04 не перезапущен ssh.socket

Итог: на сервере есть отдельный пользователь, вход только по ключу ed25519, root по SSH закрыт, а в Termius — профиль, который открывается двойным кликом. Следующий логичный шаг — закрыть все остальные порты брандмауэром UFW.