Imparare a configurare e utilizzare PowerShell SSH remoting

Quando Microsoft ha detto PowerShell sarebbe diventato un progetto open source che sarebbe stato eseguito su Windows, Linux e macOS nel mese di agosto 2016, c’era una ruga interessante legato a PowerShell remoting.

Microsoft ha detto che questo core PowerShell avrebbe supportato il remoting su Secure Shell (SSH) e Web Services-Management (WS-MAN). È sempre possibile utilizzare i binari SSH di PowerShell, ma l’annuncio indicava che il supporto SSH sarebbe stato parte integrante di PowerShell. Questo ha aperto la possibilità di eseguire l’amministrazione remota di sistemi Windows e Linux facilmente utilizzando le stesse tecnologie.

Una breve storia di PowerShell remoting

Microsoft ha introdotto il remoting in PowerShell versione 2.0 in Windows 7 e Windows Server 2008 R2, che ha cambiato radicalmente il panorama per gli amministratori di Windows. Potevano creare sessioni di desktop remoto ai server, ma PowerShell remoting ha permesso di gestire un gran numero di server contemporaneamente.

Il remoting in Windows PowerShell è basato su WS-MAN, uno standard aperto della Task Force Distributed Management. Ma poiché il remoting basato su WS-MAN è orientato a Windows, era necessario utilizzare un’altra tecnologia, di solito SSH, per amministrare i sistemi Linux.

Introduzione di SSH su PowerShell Core

Ci siamo abituati a installare software su Windows usando le procedure guidate, ma l’installazione di OpenSSH richiede più informazioni di base e più lavoro da parte dell’amministratore.

SSH è un protocollo per la gestione di sistemi su una rete possibilmente non protetta. SSH funziona in modalità client-server ed è lo standard de facto per l’amministrazione remota in ambienti Linux.

PowerShell Core utilizza OpenSSH, un fork da SSH 1.2.12 che è stato rilasciato sotto una licenza open source. OpenSSH è probabilmente l’implementazione SSH più popolare.

Il codice richiesto per utilizzare WS-MAN remoting è installato come parte del sistema operativo Windows. È necessario installare OpenSSH manualmente.

Installazione di OpenSSH

Ci siamo abituati a installare software su Windows usando le procedure guidate, ma l’installazione di OpenSSH richiede più informazioni di base e più lavoro da parte dell’amministratore. Senza un intervento manuale, possono sorgere molti problemi.

Il processo di installazione di OpenSSH su Windows è migliorato nel tempo, ma non è ancora così facile come dovrebbe essere. Lavorare con il file di configurazione lascia molto a desiderare.

Ci sono due opzioni quando si installa PowerShell SSH:

  1. Su Windows 10 1809, Windows Server 1809, Windows Server 2019 e versioni successive, OpenSSH è disponibile come funzionalità opzionale.
  2. Nelle versioni precedenti di Windows, è possibile scaricare e installare OpenSSH da GitHub.

Assicurati che il tuo sistema abbia le patch più recenti prima di installare OpenSSH.

Installazione della funzione opzionale OpenSSH

È possibile installare la funzione opzionale OpenSSH utilizzando PowerShell. Innanzitutto, controlla il tuo sistema con il seguente comando:

Get-WindowsCapability -Online | where Name -like '*SSH*'
Componenti OpenSSH
Figura 1. Trova i componenti OpenSSH nel tuo sistema.

La figura 1 mostra che il software client OpenSSH è preinstallato.

È necessario utilizzare Windows PowerShell per l’installazione a meno che non si scarichi il modulo WindowsCompatibility per PowerShell Core. Quindi è possibile importare il modulo di manutenzione e gestione delle immagini di distribuzione da Windows PowerShell ed eseguire i comandi in PowerShell Core.

Installa la funzione server:

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Path :
Online : True
RestartNeeded : False

I file SSH vengono installati nel C:\Windows\System32\OpenSSH cartella.

Scarica OpenSSH da GitHub

Inizia scaricando l’ultima versione da GitHub. L’ultima versione delle istruzioni di installazione sono a questo link.

Al termine del download, estrarre il file zip nel C:\Program Cartella File \ OpenSSH. Cambia posizione in C:\Program File \ OpenSSH per installare i servizi SSH:

.\install-sshd.ps1
SetServiceObjectSecurity SUCCESS
ChangeServiceConfig2 SUCCESS
ChangeServiceConfig2 SUCCESS

Configurazione di OpenSSH

Dopo l’installazione di OpenSSH, eseguire alcuni passaggi di configurazione aggiuntivi.

Assicurarsi che la cartella OpenSSH sia inclusa nella variabile di ambiente system path:

  • C:\Windows\System32\OpenSSH\ se installato come funzione opzionale di Windows
  • C:\Program File \ OpenSSH \ se installato tramite OpenSSH download

Impostare i due servizi per l’avvio automatico:

Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic

Se è stato installato OpenSSH con la funzione opzionale, Windows crea una nuova regola del firewall per consentire l’accesso in entrata di SSH sulla porta 22. Se hai installato OpenSSH dal download, crea la regola del firewall con questo comando:

New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' `
-Enabled True -Direction Inbound -Protocol TCP `
-Action Allow -LocalPort 22

Avvia il servizio sshd per generare le chiavi SSH:

Start-Service sshd

Le chiavi SSH e il file di configurazione risiedono in C:\ProgramData\ssh, che è una cartella nascosta. La shell predefinita utilizzata da SSH è la shell dei comandi di Windows. Questo deve cambiare in PowerShell:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell `
-Value "C:\Program Files\PowerShell\6\pwsh.exe" -PropertyType String -Force

Ora, quando ci si connette al sistema tramite SSH, PowerShell Core verrà avviato e sarà la shell predefinita. È inoltre possibile effettuare la shell predefinita di Windows PowerShell, se lo si desidera.

C’è un bug in OpenSSH su Windows. Non funziona con percorsi con uno spazio, come il percorso dell’eseguibile PowerShell Core! La soluzione consiste nel creare un collegamento simbolico che crei un percorso che OpenSSH può utilizzare:

New-Item -ItemType SymbolicLink -Path C:\pwsh -Target 'C:\Program Files\PowerShell\6'

Nel file sshd_config, deselezionare le righe seguenti:

PubkeyAuthentication yes
PasswordAuthentication yes

Aggiungi questa riga prima di altre righe del sottosistema:

Subsystem powershell C:\pwsh\pwsh.exe -sshs -NoLogo -NoProfile

Questo dice a OpenSSH di eseguire PowerShell Core.

impostare come Commento la riga:

AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

Dopo aver salvato le modifiche al file sshd_config, riavviare i servizi:

Restart-Service sshd
Start-Service ssh-agent

È necessario riavviare il servizio sshd, dopo ogni modifica al file di configurazione.

Usare PowerShell SSH remoting

Usare il remoting su SSH è molto simile al remoting su WS-MAN. È possibile accedere al sistema remoto direttamente con Invoke-Command:

Invoke-Command -HostName W19DC01 -ScriptBlock {Get-Process}
richard@MANTICORE@w19dc01's password:

Si otterrà un prompt per la password, che non verrà visualizzato durante la digitazione.

Se è la prima volta che ti connetti al sistema remoto tramite SSH, vedrai un messaggio simile a questo:

The authenticity of host 'servername (10.00.00.001)' can't be established.
ECDSA key fingerprint is SHA256:(<a large string>).
Are you sure you want to continue connecting (yes/no)?

Digita sì e premi Invio.

Puoi creare una sessione di remoting:

$sshs = New-PSSession -HostName W19FS01
richard@MANTICORE@w19fs01's password:

E poi usarla:

Invoke-Command -Session $sshs -ScriptBlock {$env:COMPUTERNAME}
W19FS01

Puoi inserire una sessione di remoting OpenSSH usando Enter-PSSession allo stesso modo di una sessione WS-MAN. È possibile inserire una sessione esistente o utilizzare il parametro HostName su Enter-PSSession per creare la sessione interattiva.

Non è possibile disconnettere una sessione basata su SSH; questa è una tecnica WS-MAN.

È possibile utilizzare le sessioni WS-MAN e SSH per gestire più computer come mostrato in Figura 2.

Le informazioni sulla sessione mostrano il diverso meccanismo di trasporto-WS-MAN e SSH, rispettivamente-e l’endpoint in uso da ogni sessione.

Sessioni di gestione remota
Figura 2. Utilizzare le sessioni WS-MAN e SSH insieme per gestire le macchine remote.

Se si guarda da vicino la Figura 2, si noterà che non c’era alcun prompt per la password sulla sessione SSH perché il sistema è stato impostato con l’autenticazione basata su chiave SSH.

Utilizzando l’autenticazione basata su chiave SSH

Aprire una sessione PowerShell elevata. Modificare la posizione al .cartella ssh nell’area utente:

Set-Location -Path ~\.ssh

Genera la coppia di chiavi:

ssh-keygen -t ed25519

Aggiungi il file chiave nell’SSH-agent sulla macchina locale:

ssh-add id_ed25519

Una volta aggiunta la chiave privata in SSH-agent, eseguire il backup della chiave privata in una posizione sicura ed eliminare la chiave dalla macchina locale.

Copia l’id_ed25519.file pub nel.cartella ssh per l’account utente corrispondente sul server remoto. È possibile creare un account di questo tipo se necessario:

$pwd = Read-Host -Prompt 'Password' -AsSecureString
Password: ********
New-LocalUser -Name Richard -Password $pwd -PasswordNeverExpires
Add-LocalGroupMember -Group Administrators -Member Richard

Sulla macchina remota, copiare il contenuto del file chiave nel file authorized_keys:

scp id_ed25519.pub authorized_keys

Il file authorized_keys ha bisogno delle sue autorizzazioni modificate:

  • Apri Esplora file, fai clic con il tasto destro authorized_keys e vai a Properties – Security – Advanced
  • Fai clic su Disattiva ereditarietà.
  • Selezionare Converti autorizzazioni ereditate in autorizzazioni esplicite su questo oggetto.
  • Rimuovi tutte le autorizzazioni ad eccezione del SISTEMA e del tuo account utente. Entrambi dovrebbero avere il pieno controllo.
Introduzione a SSH con PowerShell Core.

Vedrai riferimenti all’utilizzo del modulo OpenSSHUtils per impostare le autorizzazioni, ma c’è un bug nella versione dalla Galleria PowerShell che rende inutilizzabile il file authorized_keys.

Riavviare il servizio sshd sulla macchina remota.

È ora possibile connettersi alla macchina remota senza utilizzare una password, come mostrato in Figura 2.

Se ci si connette a una macchina non di dominio da una macchina nel dominio, è necessario utilizzare il parametro UserName dopo aver abilitato l’autenticazione della coppia di chiavi:

$ss = New-PSSession -HostName W19ND01 -UserName Richard

È necessario che il nome utente sul computer remoto corrisponda al nome utente del dominio. Non ti verrà richiesta una password.

WS-MAN o SSH remoting?

Dovresti usare il remoting basato su WS-MAN o SSH? WS-MAN remoting è disponibile su tutti i sistemi Windows ed è abilitato per impostazione predefinita su Windows Server 2012 e versioni successive del server. Il remoting di WS-MAN ha alcuni problemi, in particolare il problema del doppio salto. WS-MAN ha anche bisogno di lavoro extra per sistemi remoti e non di dominio.

SSH remoting è disponibile solo in PowerShell Core; Windows PowerShell è limitato a WS-MAN remoting. Ci vuole una notevole quantità di lavoro per installare e configurare SSH remoting. La documentazione non è buona come deve essere. I vantaggi del remoting SSH sono che è possibile accedere facilmente a macchine non di dominio e sistemi non Windows in cui SSH è lo standard per l’accesso remoto.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.