Доступ к VPS через Termius и SSH-ключи: полный гайд для Windows
Генерируем ключ ed25519 на Windows, кладём его на сервер, собираем удобный профиль в Termius и только потом отключаем вход по паролю — в таком порядке, чтобы ни на одном шаге не потерять доступ к машине.
- Доступ через Termius и SSH-ключи
- Брандмауэр UFW на Ubuntu Server
- Fail2ban для SSH на VPSскоро
- Автообновления и unattended-upgradesскоро
- Почему ключи, а не пароль
- Как это работает за 60 секунд
- Что понадобится
- Шаг 1 — отдельный пользователь вместо root
- Шаг 2 — генерируем ключ на Windows
- Шаг 3 — копируем публичный ключ на сервер
- Шаг 4 — настраиваем Termius
- Шаг 5 — проверяем вход по ключу
- Шаг 6 — отключаем вход по паролю
- Опционально: нестандартный порт SSH
- Полезные возможности Termius
- Бэкап ключа и что делать, если он потерян
- Частые проблемы
Почему ключи, а не пароль
Любой VPS с публичным IP начинают перебирать боты в первые минуты после создания. Достаточно открыть /var/log/auth.log на свежем сервере через час, чтобы увидеть сотни попыток войти под root, admin, ubuntu и test с паролями из словарей. Пароль, даже хороший, остаётся тем, что можно угадать, подсмотреть или утащить из менеджера паролей.
SSH-ключ устроен иначе: на сервере лежит только публичная половина, которой нельзя войти. Войти может только тот, у кого есть приватная половина — файл на вашем компьютере, который никогда не передаётся по сети.
✕ вход по паролю
- перебирается ботами 24/7
- утекает вместе с базами других сервисов
- вводится руками — легко подсмотреть
- один пароль на все устройства
✓ вход по ключу
- 256-битный ключ ed25519 перебору не поддаётся
- секрет не покидает ваше устройство
- вход в один клик из Termius
- ключ на каждое устройство — отзываются по одному
Как это работает за 60 секунд
При подключении сервер находит ваш публичный ключ в файле ~/.ssh/authorized_keys и предлагает клиенту подписать случайные данные. Клиент (Termius или ssh в PowerShell) подписывает их приватным ключом, сервер проверяет подпись публичным. Совпало — вы внутри. Пароль в этой схеме не участвует вообще, а перехват трафика ничего не даёт: подпись одноразовая.
Что понадобится
- VPS на Ubuntu Server 22.04 или 24.04 с публичным IP, логином и паролем root (их присылает хостер после создания сервера).
- Компьютер с Windows 10 (1809+) или Windows 11 — в них клиент OpenSSH уже встроен.
- Termius — бесплатного тарифа для всего, что описано в статье, достаточно. Скачивается с официального сайта termius.com или из Microsoft Store.
- Доступ к веб-консоли (VNC) в панели хостера — страховка на случай, если что-то пойдёт не так. Убедитесь, что знаете, где она, до начала.
В примерах ниже IP сервера — 203.0.113.10, пользователь — deploy. Подставляйте свои значения.
Шаг 1 — отдельный пользователь вместо root
Работать постоянно под root — плохая привычка: любая опечатка выполняется с максимальными правами, а логин root есть на каждом сервере и его перебирают первым. Создадим обычного пользователя с правом на sudo. Пока заходим по паролю — в PowerShell или в Termius, неважно:
ssh root@203.0.113.10
# обновим систему, раз уж зашли 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)
deploy никуда не денется — он нужен для sudo и для входа через VNC-консоль хостера. Сохраните его в менеджере паролей.
Шаг 2 — генерируем ключ на Windows
Есть два удобных пути. Первый — стандартный ssh-keygen в PowerShell: ключ лежит обычным файлом, его можно использовать и в Termius, и в VS Code, и в Git. Второй — генерация прямо в Termius, быстрее, но ключ живёт внутри приложения. Рекомендую первый.
AЧерез PowerShell (рекомендуется)
Откройте PowerShell (Win + X → «Терминал») и проверьте, что клиент OpenSSH на месте:
ssh -V
# OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2 — версия может отличаться
Если вместо версии — «команда не найдена», доставьте компонент: Параметры → Система → Дополнительные компоненты → Добавить компонент → Клиент OpenSSH, либо одной командой в PowerShell от администратора:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
Теперь генерируем ключ. Комментарий после -C — просто подпись, чтобы потом в authorized_keys было видно, с какого устройства этот ключ:
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 |
BПрямо в Termius
Если PowerShell не хочется трогать вовсе:
Публичную часть потом можно скопировать из карточки ключа (поле Public key) — она понадобится в следующем шаге.
.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:
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 в буфер обмена:
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard
Затем на сервере под пользователем deploy:
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
authorized_keys, если каталог или файл доступны на запись кому-то кроме владельца. Нужно ровно: ~/.ssh — 700, authorized_keys — 600, владелец — сам пользователь. Если создавали файлы из-под root для другого пользователя, не забудьте chown -R deploy:deploy /home/deploy/.ssh.
/root/.ssh/authorized_keys, а вход по паролю для root часто отключён с первой минуты. Для нового пользователя ключ всё равно придётся добавить по инструкции выше.
Шаг 4 — настраиваем Termius
01Импортируем приватный ключ
Альтернатива — открыть файл id_ed25519 в Блокноте, скопировать целиком (включая строки -----BEGIN OPENSSH PRIVATE KEY----- и -----END…) и вставить в поле Private key нового ключа.
02Создаём хост
| Поле | Значение | Комментарий |
|---|---|---|
| Address | 203.0.113.10 | IP или доменное имя сервера |
| Label | vps-fin-01 | как сервер будет называться в списке |
| Group | Production | группы наследуют настройки — удобно, когда серверов несколько |
| SSH · Port | 22 | поменяете, если перенесёте SSH на другой порт |
| Username | deploy | не root |
| Password | — пусто — | не заполняйте, иначе не поймёте, сработал ли ключ |
| Key | home-pc-2026 | ключ из Keychain |
03Первое подключение и отпечаток сервера
Двойной клик по хосту. При первом подключении Termius покажет отпечаток ключа сервера (host key fingerprint) и спросит, доверять ли ему. Это защита от подмены сервера: в идеале сверьте отпечаток с тем, что показывает сам сервер через VNC-консоль хостера:
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
# 256 SHA256:Xk1p... root@vps (ED25519)
Совпало — принимайте. Termius сохранит отпечаток в Known Hosts, и если он когда-нибудь изменится без вашего ведома (переустановка ОС или атака), вы получите предупреждение.
Шаг 5 — проверяем вход по ключу
Прежде чем закрывать пароль, нужно убедиться, что сервер пускает именно по ключу, а не «по старой памяти» по паролю. Самый надёжный способ — посмотреть лог авторизации:
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, запретив клиенту пароль совсем:
ssh -o PasswordAuthentication=no -o PreferredAuthentications=publickey deploy@203.0.113.10
Шаг 6 — отключаем вход по паролю
Теперь самое важное. Откройте две сессии к серверу: в одной будете править конфиг, вторая — страховка. Не закрывайте её, пока не проверите вход в новой.
/etc/ssh/sshd_config подключает файлы из /etc/ssh/sshd_config.d/*.conf в самом начале, а для большинства параметров sshd действует правило «первое значение побеждает». На многих VPS cloud-init кладёт туда 50-cloud-init.conf со строкой PasswordAuthentication yes — и ваша правка в конце sshd_config просто игнорируется. Поэтому кладём свой файл с именем, которое сортируется раньше.
# посмотрим, что уже лежит в каталоге ls /etc/ssh/sshd_config.d/ # создаём свой файл — "00-" гарантирует, что он прочитается первым sudo nano /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:
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. Вошли — отлично. И контрольная проверка, что пароль действительно больше не принимается:
ssh -o PubkeyAuthentication=no deploy@203.0.113.10
# deploy@203.0.113.10: Permission denied (publickey). ← то, что нужно
sshd -t.Опционально: нестандартный порт SSH
Перенос SSH с 22-го порта не делает сервер защищённее против целенаправленной атаки, но резко сокращает шум от ботов в логах. Если решите переносить — сначала откройте новый порт в файрволе (подробно — в статье про UFW), потом меняйте sshd.
В Ubuntu 24.04 SSH по умолчанию запускается через сокет-активацию systemd (ssh.socket), поэтому после смены порта одного reload мало:
# 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.
Бэкап ключа и что делать, если он потерян
- Сделайте копию приватного ключа в зашифрованное хранилище — например, во вложения записи в Vaultwarden или на зашифрованную флешку. Без passphrase не храните его нигде, кроме своего ПК.
- Один ключ — одно устройство. Для телефона, ноутбука и рабочего ПК — свои ключи, по строке на каждый в
authorized_keys. Потеряли ноутбук — удалили одну строку, остальные устройства продолжают работать. - Если ключ потерян полностью — заходите через VNC-консоль хостера под
deployс паролем, добавляйте новый публичный ключ вauthorized_keysи удаляйте строку со старым.
Частые проблемы
| Симптом | Причина и решение |
|---|---|
| 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.