−25%

на годовую оплату Windows, до 31.10. К тарифам

EQVPS
Начать

Как установить OpenSSH Server на Windows Server 2022 (вход по ключу, оболочка PowerShell)

Установите встроенный OpenSSH Server на VPS с Windows Server 2022, сделайте PowerShell оболочкой по умолчанию, входите по ключу как Administrator и выключите вход по паролю. Плюс две ловушки Windows, из-за которых вход по ключу не работает.

В Windows Server 2022 OpenSSH Server есть как дополнительный компонент: без сторонних установщиков, с обновлениями через Windows Update. После установки можно выполнять PowerShell по SSH, копировать файлы через scp и подключать к серверу скрипты или CI, как к любой машине на Linux.

Всё ниже мы сделали на нашем образе Windows Server 2022 в PowerShell с правами администратора по RDP (как подключиться).

Сначала о сети. На Windows-тарифе с NAT единственный входящий проброс ведёт на RDP, поэтому SSH из интернета недоступен. Для SSH снаружи нужен тариф с собственным IPv4, например Windows Small-IP. Если порт доступен, шаги ниже занимают около пяти минут.

1. Установите OpenSSH Server

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Клиент уже установлен, сервер показывает NotPresent, пока вы его не добавите. На нашем сервере установка заняла 28 секунд.

2. Запустите службу и включите автозапуск

Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
Get-NetFirewallRule -Name *OpenSSH*

При установке компонента создаётся правило брандмауэра OpenSSH-Server-In-TCP (порт 22, входящие, разрешено), так что добавлять своё не нужно.

3. Сделайте PowerShell оболочкой по умолчанию

По умолчанию сеанс SSH открывается в cmd.exe. Переключите на PowerShell:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

Новые подключения сразу получают PowerShell 5.1, перезапуск не нужен.

4. Ключ для Administrator: файл, на котором спотыкаются все

Это первая ловушка Windows. Для учётных записей из группы Administrators sshd не читает C:\Users\<name>\.ssh\authorized_keys. Он читает один общий файл C:\ProgramData\ssh\administrators_authorized_keys, и только если писать в него могут лишь Administrators и SYSTEM:

$pub = 'ssh-ed25519 AAAA...your-public-key... you@laptop'
Set-Content -Path C:\ProgramData\ssh\administrators_authorized_keys -Value $pub -Encoding ascii
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

-Encoding ascii тоже важен. В нашей проверке тот же ключ, сохранённый через Out-File (UTF-16, кодировка PowerShell 5.1 по умолчанию), отклонялся с Permission denied (publickey). Со своей машины:

ssh Administrator@YOUR.SERVER.IP

Вы должны получить приглашение PowerShell без пароля. Для пользователей без прав администратора работает обычный C:\Users\<name>\.ssh\authorized_keys.

5. Выключите вход по паролю: вторая ловушка

Очевидной правки PasswordAuthentication no в этой версии недостаточно. OpenSSH 8.1 продолжает предлагать keyboard-interactive, который спрашивает тот же пароль Windows. В нашей проверке вход без ключа продолжал показывать keyboard-interactive, пока мы не выключили и его. Кроме того, настройка должна стоять до блока Match Group administrators в конце файла, иначе она действует только на администраторов. Эта команда ставит обе строки в начало:

$cfg = 'C:\ProgramData\ssh\sshd_config'
$lines = Get-Content $cfg | Where-Object { $_ -notmatch '^#?\s*(PasswordAuthentication|KbdInteractiveAuthentication|ChallengeResponseAuthentication)\s' }
Set-Content $cfg -Value (@('PasswordAuthentication no', 'ChallengeResponseAuthentication no') + $lines) -Encoding ascii
Restart-Service sshd

Не закрывайте текущий сеанс SSH и проверьте из второго терминала. Попытка войти только по паролю теперь должна получить:

Permission denied (publickey).

Так было в нашей проверке и для Administrator, и для обычного пользователя, а вход по ключу продолжал работать.

Что с этим можно делать

  • Выполнять команду откуда угодно: ssh Administrator@IP 'Get-Service sshd'.
  • Копировать файлы: scp .\app.zip Administrator@IP:C:/apps/.
  • Ограничить порт своим адресом так же, как для RDP: Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress 203.0.113.10.

Какой тариф

Для SSH снаружи нужен публичный IPv4: Windows Small-IP (4 vCPU, 4 ГБ, 50 ГБ) стоит $28/мес, Windows Medium-IP (6 vCPU, 6 ГБ) — $36/мес. Windows — это Server 2022 с вашей лицензией (что такое BYOL). Все четыре тарифа — на странице Windows VPS. Чтобы программа работала после отключения, см. скрипт 24/7 на Windows Server.

Частые вопросы

Зачем SSH на Windows, если есть RDP?

Скрипты и инструменты говорят на SSH. С OpenSSH на сервере можно выполнять команды PowerShell с машины на Linux или из CI, копировать файлы через scp и управлять сервером из автоматизации без сеанса рабочего стола.

Ключ работает для обычного пользователя, но не для Administrator. Почему?

Для членов группы Administrators OpenSSH в Windows игнорирует ~/.ssh/authorized_keys и читает C:\ProgramData\ssh\administrators_authorized_keys. Писать в этот файл должны только Administrators и SYSTEM, иначе sshd молча его пропускает.

Можно ли попасть по SSH на Windows-тариф с NAT?

Снаружи — нет. На Windows-тарифе с NAT персональный внешний порт проброшен на RDP (3389), и это единственный входящий проброс. Для SSH из интернета берите Windows-тариф с собственным IPv4. Внутри сервера OpenSSH всё равно работает для локальных инструментов.

Какую версию OpenSSH ставит Windows Server 2022?

OpenSSH 8.1p1 for Windows. Поэтому настройки пароля задаются через ChallengeResponseAuthentication, а не через более новое имя KbdInteractiveAuthentication.

Комментарии

Пока нет комментариев. Будьте первым.

Оставить комментарий

Комментарии проходят модерацию перед публикацией.