Windows Server 2022 include OpenSSH Server come funzionalità facoltativa: nessun installer di terze parti, aggiornamenti tramite Windows Update. Una volta attivo puoi eseguire PowerShell via SSH, copiare file con scp e collegare script o CI al server come a qualsiasi macchina Linux.
Tutto ciò che segue è stato fatto sulla nostra immagine Windows Server 2022, in un PowerShell con privilegi di amministratore via RDP (come connettersi).
Prima la rete. Su un piano Windows NAT l'unico inoltro in ingresso va a RDP, quindi SSH non è raggiungibile da Internet. Per SSH dall'esterno serve un piano con IPv4 propria, come Windows Small-IP. Con la porta raggiungibile, i passi richiedono circa cinque minuti.
1. Installa OpenSSH Server
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Il client è già installato; il server risulta NotPresent finché non lo aggiungi. Sul nostro server l'installazione ha richiesto 28 secondi.
2. Avvialo e fallo partire all'avvio
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
Get-NetFirewallRule -Name *OpenSSH*
L'installazione della funzionalità crea la regola firewall OpenSSH-Server-In-TCP (porta 22, in ingresso, consentita), quindi non devi aggiungerne una.
3. Imposta PowerShell come shell predefinita
Per impostazione predefinita una sessione SSH finisce in cmd.exe. Passa a PowerShell:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
Le nuove connessioni ottengono subito PowerShell 5.1, senza riavvio.
4. Aggiungi la chiave per Administrator: il file su cui inciampano tutti
È la prima trappola di Windows. Per gli account del gruppo Administrators, sshd non legge C:\Users\<name>\.ssh\authorized_keys. Legge un file condiviso, C:\ProgramData\ssh\administrators_authorized_keys, e solo se nessuno oltre ad Administrators e SYSTEM può scriverci:
$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"
Conta anche -Encoding ascii. Nel nostro test la stessa chiave salvata con Out-File (UTF-16, il predefinito di PowerShell 5.1) è stata rifiutata con Permission denied (publickey). Dal tuo computer:
ssh Administrator@YOUR.SERVER.IP
Dovresti ottenere un prompt di PowerShell senza password. Per gli utenti non amministratori funziona il solito C:\Users\<name>\.ssh\authorized_keys.
5. Disattiva l'accesso via password: la seconda trappola
La modifica ovvia, PasswordAuthentication no, non basta in questa versione. OpenSSH 8.1 continua a offrire keyboard-interactive, che chiede la stessa password di Windows. Nel nostro test un accesso senza chiave mostrava ancora keyboard-interactive finché non l'abbiamo disattivato. Inoltre l'impostazione deve stare prima del blocco Match Group administrators in fondo al file, altrimenti vale solo per gli amministratori. Questo mette entrambe le righe in cima:
$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
Tieni aperta la sessione SSH attuale e prova da un secondo terminale. Un tentativo con sola password ora deve ricevere:
Permission denied (publickey).
È ciò che abbiamo ottenuto sia per Administrator sia per un utente normale, mentre l'accesso con chiave continuava a funzionare.
Cosa puoi farci
- Eseguire un comando da ovunque:
ssh Administrator@IP 'Get-Service sshd'. - Copiare file:
scp .\app.zip Administrator@IP:C:/apps/. - Limitare la porta al tuo indirizzo, come per RDP:
Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress 203.0.113.10.
Quale piano
SSH dall'esterno richiede un IPv4 pubblico: Windows Small-IP (4 vCPU, 4 GB, 50 GB) costa $28/mese, Windows Medium-IP (6 vCPU, 6 GB) $36/mese. Windows è Server 2022 con la tua licenza (il BYOL spiegato). Tutti e quattro i piani sono nella pagina Windows VPS. Per tenere un programma in esecuzione dopo la disconnessione, vedi eseguire uno script 24/7 su Windows Server.
Commenti
Ancora nessun commento. Sii il primo.