−25%

auf Windows bei Jahreszahlung, bis 31.10. Zu den Tarifen

EQVPS
Loslegen

OpenSSH Server auf Windows Server 2022 installieren (Schlüssel-Login, PowerShell als Shell)

Installieren Sie den eingebauten OpenSSH Server auf einem Windows-Server-2022-VPS, machen Sie PowerShell zur Standard-Shell, melden Sie sich per Schlüssel als Administrator an und schalten Sie den Passwort-Login ab. Mit den zwei Windows-Fallen, an denen der Schlüssel-Login scheitert.

Windows Server 2022 liefert OpenSSH Server als optionales Feature mit: kein Fremd-Installer, Updates über Windows Update. Ist es aktiv, können Sie PowerShell über SSH ausführen, Dateien mit scp kopieren und Skripte oder CI auf den Server richten wie auf jede Linux-Maschine.

Alles unten haben wir auf unserem Windows-Server-2022-Image in einer PowerShell mit Administratorrechten über RDP gemacht (so verbinden Sie sich).

Zuerst das Netzwerk. Auf einem Windows-Tarif mit NAT geht die einzige eingehende Weiterleitung auf RDP, daher ist SSH aus dem Internet nicht erreichbar. Für SSH von außen brauchen Sie einen Tarif mit eigener IPv4, etwa Windows Small-IP. Ist der Port erreichbar, dauern die Schritte unten etwa fünf Minuten.

1. OpenSSH Server installieren

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

Der Client ist schon installiert; der Server zeigt NotPresent, bis Sie ihn hinzufügen. Auf unserem Server dauerte die Installation 28 Sekunden.

2. Starten und beim Booten starten lassen

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

Die Installation des Features legt die Firewall-Regel OpenSSH-Server-In-TCP an (Port 22, eingehend, erlaubt), Sie müssen also keine eigene hinzufügen.

3. PowerShell zur Standard-Shell machen

Standardmäßig landet eine SSH-Sitzung in cmd.exe. Auf PowerShell umstellen:

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

Neue Verbindungen bekommen sofort PowerShell 5.1, ein Neustart ist nicht nötig.

4. Schlüssel für Administrator: die Datei, an der alle scheitern

Das ist die erste Windows-Falle. Für Konten in der Gruppe Administrators liest sshd C:\Users\<name>\.ssh\authorized_keys nicht. Es liest eine gemeinsame Datei, C:\ProgramData\ssh\administrators_authorized_keys, und nur, wenn niemand außer Administrators und SYSTEM darin schreiben kann:

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

Auch -Encoding ascii zählt. In unserem Test wurde derselbe Schlüssel, mit Out-File gespeichert (UTF-16, Standard von PowerShell 5.1), mit Permission denied (publickey) abgelehnt. Von Ihrem Rechner aus:

ssh Administrator@YOUR.SERVER.IP

Sie sollten ohne Passwort eine PowerShell-Eingabeaufforderung bekommen. Für Benutzer ohne Adminrechte funktioniert das übliche C:\Users\<name>\.ssh\authorized_keys.

5. Passwort-Login abschalten: die zweite Falle

Die naheliegende Änderung PasswordAuthentication no reicht in dieser Version nicht. OpenSSH 8.1 bietet weiterhin keyboard-interactive an, das dasselbe Windows-Passwort abfragt. In unserem Test zeigte ein Login ohne Schlüssel weiter keyboard-interactive, bis wir auch das abgeschaltet hatten. Außerdem muss die Einstellung vor dem Block Match Group administrators am Dateiende stehen, sonst gilt sie nur für Admins. Dies setzt beide Zeilen an den Anfang:

$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

Lassen Sie die aktuelle SSH-Sitzung offen und testen Sie aus einem zweiten Terminal. Ein Versuch nur mit Passwort sollte jetzt ergeben:

Permission denied (publickey).

So war es in unserem Test für Administrator und für einen normalen Benutzer, während der Schlüssel-Login weiter funktionierte.

Was Sie damit tun können

  • Einen Befehl von überall ausführen: ssh Administrator@IP 'Get-Service sshd'.
  • Dateien kopieren: scp .\app.zip Administrator@IP:C:/apps/.
  • Den Port auf Ihre Adresse beschränken, genau wie bei RDP: Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress 203.0.113.10.

Welcher Tarif

SSH von außen braucht eine öffentliche IPv4: Windows Small-IP (4 vCPU, 4 GB, 50 GB) kostet $28/Monat, Windows Medium-IP (6 vCPU, 6 GB) $36/Monat. Windows ist Server 2022 mit Ihrer eigenen Lizenz (BYOL erklärt). Alle vier Tarife auf der Windows-VPS-Seite. Damit ein Programm nach dem Trennen weiterläuft, siehe Skript 24/7 auf Windows Server.

FAQ

Wozu SSH unter Windows, wenn es RDP gibt?

Skripte und Werkzeuge sprechen SSH. Mit OpenSSH auf dem Server führen Sie PowerShell-Befehle von einem Linux-Rechner oder aus einem CI-Job aus, kopieren Dateien mit scp und lassen Automatisierung den Server ohne Desktop-Sitzung verwalten.

Mein Schlüssel funktioniert für einen normalen Benutzer, aber nicht für Administrator. Warum?

Für Mitglieder der Gruppe Administrators ignoriert Windows-OpenSSH ~/.ssh/authorized_keys und liest stattdessen C:\ProgramData\ssh\administrators_authorized_keys. Diese Datei darf nur für Administrators und SYSTEM beschreibbar sein, sonst überspringt sshd sie stillschweigend.

Erreiche ich SSH auf einem Windows-NAT-Tarif?

Von außen nicht. Auf einem Windows-NAT-Tarif ist der persönliche externe Port auf RDP (3389) weitergeleitet, und das ist die einzige eingehende Weiterleitung. Für SSH aus dem Internet nehmen Sie einen Windows-Tarif mit eigener IPv4. Im Server selbst funktioniert OpenSSH trotzdem für lokale Werkzeuge.

Welche OpenSSH-Version installiert Windows Server 2022?

OpenSSH 8.1p1 for Windows. Deshalb nutzen die Passwort-Einstellungen ChallengeResponseAuthentication statt des neueren Namens KbdInteractiveAuthentication.

Kommentare

Noch keine Kommentare. Sei der Erste.

Kommentar hinterlassen

Kommentare werden vor der Anzeige moderiert.