Как настроить аутентификацию только по SSH-ключам на VPS?

В статье разберём:

  • как сгенерировать SSH-ключ в Windows PowerShell (и что делать, если ключ уже существует);
  • как загрузить публичный ключ на сервер и выдать правильные права;
  • как отключить вход по паролю и оставить только вход по ключам;
  • как проверить работу и что делать, если потеряли доступ.

Подготовка: что понадобится

  • Данные от VPS: IP-адрес, пользователь для входа (обычно root или ваш пользователь), порт SSH (по умолчанию 22).

  • Windows 10/11 c OpenSSH: PowerShell уже содержит ssh и ssh-keygen. Проверьте:

            
      ssh -V
      ssh-keygen -h
    
    
  • (Опционально) На macOS команды те же самые — выполняются в «Терминале».

Проверка наличия OpenSSH в Windows PowerShell

Генерация SSH-ключа в Windows PowerShell

Создадим пару ключей (приватный + публичный). Запустите PowerShell от своего пользователя и выполните:

ssh-keygen -t rsa -b 4096 -C "vps_key_2025"
  • Где сохранить — по умолчанию: C:\Users\ВАШ_ПОЛЬЗОВАТЕЛЬ\.ssh\id_rsa. Можно просто нажать Enter.

  • Passphrase — парольная фраза к ключу (очень рекомендуется). Если не хотите вводить её при каждом подключении — используйте агент ключей ssh-agent.

Генерация SSH ключа в Windows PowerShell

Если ключ уже существует (сообщение вида id_rsa already exists):

  • нажмите N (не перезаписывать) и укажите новое имя, например id_rsa_vps;

  • или используйте имеющийся ключ (если он уже добавлен на сервер).

Поведение ssh-keygen если ключ уже существует

Загрузка публичного ключа на сервер

На Windows нет штатного ssh-copy-id, поэтому используем PowerShell для передачи публичного ключа на VPS.

Вариант A. Стандартный порт 22:

    
      Get-Content $env:USERPROFILE\.ssh\id_rsa.pub | ssh root@123.45.67.89 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
    
  

Вариант B. Нестандартный порт (например, 2222):

    
      Get-Content $env:USERPROFILE\.ssh\id_rsa.pub | ssh -p 2222 root@123.45.67.89 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
    
  
Загрузка публичного SSH ключа на сервер через PowerShell

Если подключаетесь НЕ под root (например, под admin), команда такая же — ключ попадёт в /home/admin/.ssh/authorized_keys и будет работать для пользователя admin.

Проверяем вход по ключу

Проверьте, что теперь можете входить без пароля (будет запрошена только passphrase к ключу, если вы её задавали):

    
  ssh root@123.45.67.89
  # или с портом
  ssh -p 2222 root@123.45.67.89

Проверка входа на VPS по SSH ключу в PowerShell

Если вход успешен — можно отключать пароли на сервере.

Включаем режим «только по ключам» (отключаем пароли)

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

            
              sudo nano /etc/ssh/sshd_config
            
          
  2. Убедитесь, что включена аутентификация по ключам:

            
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys
    
  3. Полностью запретите вход по паролю. В новых версиях OpenSSH используйте KbdInteractiveAuthentication, в старых — ChallengeResponseAuthentication:

            
    PasswordAuthentication no
    KbdInteractiveAuthentication no
    # ChallengeResponseAuthentication no
    
    
  4. (Рекомендуется) Запретить root по паролю, оставив только ключи (или вообще запретить root):

            
    PermitRootLogin prohibit-password
    # или более жёстко:
    # PermitRootLogin no
    
    
  5. Сохраните файл в nano: Ctrl+OEnterCtrl+X.

  6. Проверьте синтаксис конфигурации (если тишина — всё ок):

    sudo sshd -t -f /etc/ssh/sshd_config
  7. Перезапустите службу SSH (в Ubuntu/Debian юнит называется ssh):

    sudo systemctl restart ssh
Отключение входа по паролю и включение только ключей в sshd_config
Отключение входа по паролю и включение только ключей в sshd_config

Важно: не закрывайте текущее подключение до тех пор, пока не проверите новое в отдельном окне PowerShell.

Права на каталоги и ключи (если вход не работает)

Если после настроек видите Permission denied (publickey), проверьте права каталога и файла ключей на сервере:

    
  # для текущего пользователя (например, admin):
  chmod 700 ~/.ssh
  chmod 600 ~/.ssh/authorized_keys
  
  # если ключ загружали от root в чужой home:
  chown -R admin:admin /home/admin/.ssh

(Опционально) Удобное подключение через alias в SSH config (Windows)

Чтобы не вводить каждый раз IP/порт/логин, создайте файл %USERPROFILE%\.ssh\config и добавьте профиль:

    
      Host my-vps
      HostName 123.45.67.89
      User root
      Port 2222
      IdentityFile C:\Users\ВАШ_ПОЛЬЗОВАТЕЛЬ\.ssh\id_rsa
    
  

Теперь вход выполняется командой:

    
      ssh my-vps
    
  
Настройка SSH config в Windows для быстрого подключения

Частые ошибки и быстрые решения

  • Permission denied (publickey) — сервер не принимает ваш ключ.

            
      # проверьте, что публичный ключ действительно в authorized_keys
      # проверьте права:
      chmod 700 ~/.ssh
      chmod 600 ~/.ssh/authorized_keys
    
    
  • Connection refused — служба SSH не запущена или порт закрыт.

            
          sudo systemctl status ssh
          sudo systemctl restart ssh
          # откройте порт в фаерволе, если нужно:
          sudo ufw allow 22/tcp    # или ваш порт
          sudo ufw reload
          
        
  • Host key verification failed — переустанавливали ОС/VPS, ключ хоста изменился.

    ssh-keygen -R 123.45.67.89
  • Ключ в authorized_keys на нескольких строках — публичный ключ должен быть одной длинной строкой.

Восстановление доступа, если потеряли ключ

  1. Откройте веб-консоль в панели хостинга (VNC/Web Console).

  2. Разрешите временно вход по паролю:

            
              sudo nano /etc/ssh/sshd_config
              # измените:
              PasswordAuthentication yes
            
          

    Сохраните файл в nano: Ctrl+OEnterCtrl+X, затем перезапустите SSH:

    sudo systemctl restart ssh
  3. Добавьте новый публичный ключ и снова отключите пароли (PasswordAuthentication no).

Итоги

  • Сгенерировали ключ в PowerShell и (при необходимости) задали passphrase.

  • Загрузили публичный ключ на сервер и выставили корректные права.

  • Отключили вход по паролю в sshd_config, оставили только ключи.

  • Проверили подключение и разобрали частые ошибки.