−25%

na Windows przy płatności rocznej, do 31.10. Do planów

EQVPS
Zacznij

Jak zainstalować OpenSSH Server na Windows Server 2022 (logowanie kluczem, powłoka PowerShell)

Zainstaluj wbudowany OpenSSH Server na VPS z Windows Server 2022, ustaw PowerShell jako domyślną powłokę, loguj się kluczem jako Administrator i wyłącz logowanie hasłem. Z dwiema pułapkami Windows, przez które logowanie kluczem nie działa.

Windows Server 2022 ma OpenSSH Server jako funkcję opcjonalną: bez instalatorów zewnętrznych, z aktualizacjami przez Windows Update. Po włączeniu uruchamiasz PowerShell przez SSH, kopiujesz pliki przez scp i kierujesz skrypty lub CI na serwer jak na każdą maszynę z Linuksem.

Wszystko poniżej zrobiliśmy na naszym obrazie Windows Server 2022, w PowerShell z uprawnieniami administratora przez RDP (jak się połączyć).

Najpierw sieć. Na planie Windows z NAT jedyne przekierowanie przychodzące prowadzi do RDP, więc SSH nie jest osiągalny z internetu. Do SSH z zewnątrz potrzebujesz planu z własnym IPv4, na przykład Windows Small-IP. Gdy port jest osiągalny, kroki poniżej zajmują około pięciu minut.

1. Zainstaluj OpenSSH Server

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

Klient jest już zainstalowany; serwer ma stan NotPresent, dopóki go nie dodasz. Na naszym serwerze instalacja trwała 28 sekund.

2. Uruchom usługę i włącz autostart

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

Instalacja funkcji tworzy regułę zapory OpenSSH-Server-In-TCP (port 22, przychodzące, dozwolone), więc nie dodajesz własnej.

3. Ustaw PowerShell jako domyślną powłokę

Domyślnie sesja SSH trafia do cmd.exe. Przełącz na PowerShell:

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

Nowe połączenia od razu dostają PowerShell 5.1; restart nie jest potrzebny.

4. Klucz dla Administratora: plik, na którym potyka się każdy

To pierwsza pułapka Windows. Dla kont z grupy Administrators sshd nie czyta C:\Users\<name>\.ssh\authorized_keys. Czyta jeden wspólny plik C:\ProgramData\ssh\administrators_authorized_keys i tylko wtedy, gdy nikt poza Administrators i SYSTEM nie może do niego pisać:

$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"

Liczy się też -Encoding ascii. W naszym teście ten sam klucz zapisany przez Out-File (UTF-16, domyślne w PowerShell 5.1) był odrzucany z Permission denied (publickey). Ze swojego komputera:

ssh Administrator@YOUR.SERVER.IP

Powinieneś dostać znak zachęty PowerShell bez hasła. Dla użytkowników bez uprawnień administratora działa zwykły C:\Users\<name>\.ssh\authorized_keys.

5. Wyłącz logowanie hasłem: druga pułapka

Oczywista zmiana PasswordAuthentication no w tej wersji nie wystarcza. OpenSSH 8.1 nadal oferuje keyboard-interactive, które pyta o to samo hasło Windows. W naszym teście logowanie bez klucza wciąż pokazywało keyboard-interactive, dopóki tego też nie wyłączyliśmy. Ponadto ustawienie musi stać przed blokiem Match Group administrators na końcu pliku, inaczej dotyczy tylko administratorów. To polecenie wstawia obie linie na początek:

$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

Nie zamykaj bieżącej sesji SSH i sprawdź z drugiego terminala. Próba samym hasłem powinna teraz dostać:

Permission denied (publickey).

Tak było w naszym teście dla Administratora i zwykłego użytkownika, a logowanie kluczem działało dalej.

Co możesz z tym robić

  • Uruchomić polecenie skądkolwiek: ssh Administrator@IP 'Get-Service sshd'.
  • Kopiować pliki: scp .\app.zip Administrator@IP:C:/apps/.
  • Ograniczyć port do swojego adresu, tak jak dla RDP: Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress 203.0.113.10.

Jaki plan

SSH z zewnątrz wymaga publicznego IPv4: Windows Small-IP (4 vCPU, 4 GB, 50 GB) kosztuje $28/mies., Windows Medium-IP (6 vCPU, 6 GB) $36/mies. Windows to Server 2022 z twoją licencją (czym jest BYOL). Wszystkie cztery plany są na stronie Windows VPS. Aby program działał po rozłączeniu, zobacz skrypt 24/7 na Windows Server.

FAQ

Po co SSH w Windows, skoro jest RDP?

Skrypty i narzędzia mówią SSH. Z OpenSSH na serwerze uruchamiasz polecenia PowerShell z maszyny z Linuksem lub zadania CI, kopiujesz pliki przez scp i pozwalasz automatyzacji zarządzać serwerem bez sesji pulpitu.

Klucz działa dla zwykłego użytkownika, ale nie dla Administratora. Dlaczego?

Dla członków grupy Administrators OpenSSH w Windows ignoruje ~/.ssh/authorized_keys i czyta C:\ProgramData\ssh\administrators_authorized_keys. Zapisywać do tego pliku mogą tylko Administrators i SYSTEM, inaczej sshd po cichu go pomija.

Czy dostanę się przez SSH na plan Windows z NAT?

Z zewnątrz nie. Na planie Windows z NAT osobisty port zewnętrzny jest przekierowany na RDP (3389) i to jedyne przekierowanie przychodzące. Do SSH z internetu wybierz plan Windows z własnym IPv4. Wewnątrz serwera OpenSSH i tak działa dla lokalnych narzędzi.

Którą wersję OpenSSH instaluje Windows Server 2022?

OpenSSH 8.1p1 for Windows. Dlatego ustawienia hasła używają ChallengeResponseAuthentication, a nie nowszej nazwy KbdInteractiveAuthentication.

Komentarze

Brak komentarzy. Bądź pierwszy.

Zostaw komentarz

Komentarze są moderowane przed pojawieniem się.