−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.

Коментарі

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

Залишити коментар

Коментарі проходять модерацію перед публікацією.