Windows Server 2022 levert OpenSSH Server mee als optionele functie: geen installatieprogramma van derden, updates via Windows Update. Staat het aan, dan voer je PowerShell uit via SSH, kopieer je bestanden met scp en richt je scripts of CI op de server zoals op elke Linux-machine.
Alles hieronder deden we op ons Windows Server 2022-image, in een PowerShell met beheerdersrechten via RDP (zo maak je verbinding).
Eerst het netwerk. Op een Windows-pakket met NAT gaat de enige inkomende doorsturing naar RDP, dus SSH is niet bereikbaar vanaf internet. Voor SSH van buitenaf heb je een pakket met eigen IPv4 nodig, zoals Windows Small-IP. Is de poort bereikbaar, dan kosten de stappen hieronder zo'n vijf minuten.
1. Installeer OpenSSH Server
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
De client is al geïnstalleerd; de server staat op NotPresent tot je hem toevoegt. Op onze server duurde de installatie 28 seconden.
2. Start hem en laat hem meestarten met het systeem
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
Get-NetFirewallRule -Name *OpenSSH*
Bij het installeren van de functie wordt de firewallregel OpenSSH-Server-In-TCP aangemaakt (poort 22, inkomend, toegestaan), dus je hoeft er zelf geen toe te voegen.
3. Maak PowerShell de standaardshell
Standaard komt een SSH-sessie uit in cmd.exe. Schakel over naar PowerShell:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
Nieuwe verbindingen krijgen meteen PowerShell 5.1; herstarten is niet nodig.
4. Je sleutel voor Administrator: het bestand waar iedereen over struikelt
Dit is de eerste Windows-valkuil. Voor accounts in de groep Administrators leest sshd C:\Users\<name>\.ssh\authorized_keys niet. Het leest één gedeeld bestand, C:\ProgramData\ssh\administrators_authorized_keys, en alleen als niemand behalve Administrators en SYSTEM erin kan schrijven:
$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"
Ook -Encoding ascii telt. In onze test werd dezelfde sleutel, opgeslagen met Out-File (UTF-16, de standaard van PowerShell 5.1), geweigerd met Permission denied (publickey). Vanaf je eigen computer:
ssh Administrator@YOUR.SERVER.IP
Je hoort een PowerShell-prompt te krijgen zonder wachtwoord. Voor gebruikers zonder beheerdersrechten werkt het gebruikelijke C:\Users\<name>\.ssh\authorized_keys.
5. Zet wachtwoordlogin uit: de tweede valkuil
De voor de hand liggende wijziging, PasswordAuthentication no, is in deze versie niet genoeg. OpenSSH 8.1 biedt nog steeds keyboard-interactive aan, dat om hetzelfde Windows-wachtwoord vraagt. In onze test bleef een login zonder sleutel keyboard-interactive tonen tot we ook dat uitzetten. En de instelling moet vóór het blok Match Group administrators aan het eind van het bestand staan, anders geldt ze alleen voor beheerders. Dit zet beide regels bovenaan:
$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
Houd je huidige SSH-sessie open en test vanuit een tweede terminal. Een poging met alleen een wachtwoord hoort nu dit te krijgen:
Permission denied (publickey).
Dat was het resultaat in onze test voor zowel Administrator als een gewone gebruiker, terwijl inloggen met de sleutel bleef werken.
Wat je ermee kunt
- Een commando uitvoeren vanaf elke plek:
ssh Administrator@IP 'Get-Service sshd'. - Bestanden kopiëren:
scp .\app.zip Administrator@IP:C:/apps/. - De poort beperken tot jouw adres, net als bij RDP:
Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress 203.0.113.10.
Welk pakket
SSH van buitenaf vraagt een publiek IPv4-adres: Windows Small-IP (4 vCPU, 4 GB, 50 GB) kost $28/maand, Windows Medium-IP (6 vCPU, 6 GB) $36/maand. Windows is Server 2022 met je eigen licentie (BYOL uitgelegd). Alle vier pakketten staan op de Windows VPS-pagina. Om een programma na het verbreken van de verbinding te laten doorlopen, zie een script 24/7 draaien op Windows Server.
Reacties
Nog geen reacties. Wees de eerste.