Comunicazione remota di PowerShell su SSH
Panoramica
La comunicazione remota di PowerShell solitamente usa WinRM per la negoziazione di connessione e il trasporto dei dati. SSH è ora disponibile per le piattaforme Linux e Windows e permette a PowerShell di offrire un'autentica comunicazione remota multipiattaforma.
WinRM offre un solido modello di hosting per sessioni remote di PowerShell. La comunicazione remota basata su SSH attualmente non supporta la configurazione di endpoint remoti e JEA (Just Enough Administration).
La comunicazione remota SSH permette la comunicazione remota di base di sessioni di PowerShell tra computer Windows e Linux. La comunicazione remota SSH crea un processo host di PowerShell nel computer di destinazione come sottosistema SSH. In futuro verrà implementato un modello di hosting generale, simile a WinRM, per supportare la configurazione degli endpoint e JEA.
I cmdlet New-PSSession
, Enter-PSSession
e Invoke-Command
includono ora un nuovo set di parametri per supportare questa nuova connessione di comunicazione remota.
[-HostName <string>] [-UserName <string>] [-KeyFilePath <string>]
Per creare una sessione remota, specificare il computer di destinazione con il parametro HostName e il nome utente con il parametro UserName. Quando si eseguono i cmdlet in modo interattivo, viene chiesto di immettere una password. È anche possibile usare l'autenticazione con chiave SSH specificando una chiave privata con il parametro KeyFilePath. La creazione di chiavi per l'autenticazione SSH varia in base alla piattaforma.
Informazioni generali di installazione
PowerShell 6 o versione successiva e SSH devono essere installati in tutti i computer. Installare sia il client SSH (ssh.exe
) sia il server (sshd.exe
) per rendere possibile la comunicazione remota tra i computer. OpenSSH per Windows è ora disponibile in Windows 10 build 1809 e Windows Server 2019. Per altre informazioni, vedere Gestire Windows con OpenSSH. Per Linux, installare SSH (incluso il server sshd) nel modo appropriato per la piattaforma in uso. È necessario installare anche PowerShell da GitHub per ottenere la funzionalità di comunicazione remota SSH.
Il server SSH deve essere configurato per creare un sottosistema SSH in modo da ospitare un processo PowerShell nel computer remoto. È anche necessario abilitare l'autenticazione basata su password o chiave.
Installare il servizio SSH in un computer Windows
Installare la versione più recente di PowerShell. Per altre informazioni, vedere Installazione di PowerShell in Windows.
È possibile verificare che PowerShell includa il supporto per la comunicazione remota SSH elencando i set di parametri
New-PSSession
. Si noterà che sono presenti nomi di set di parametri che iniziano con SSH. Questi set di parametri includono i parametri SSH.(Get-Command New-PSSession).ParameterSets.Name
Name ---- SSHHost SSHHostHashParam
Installare la versione più recente di OpenSSH Win32. Per le istruzioni di installazione, vedere Introduzione a OpenSSH.
Nota
Se si vuole impostare PowerShell come shell predefinita per OpenSSH, vedere Configurazione di Windows per OpenSSH.
Modificare il file
sshd_config
in$env:ProgramData\ssh
.Assicurarsi che l'autenticazione della password sia abilitata:
PasswordAuthentication yes
Creare il sottosistema SSH che ospita un processo di PowerShell nel computer remoto:
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -nologo
Nota
A partire da PowerShell 7.4, non è più necessario usare il
-nologo
parametro quando si esegue PowerShell in modalità server SSH.Nota
Il percorso predefinito del file eseguibile di PowerShell è
c:/progra~1/powershell/7/pwsh.exe
. La posizione può variare a seconda della modalità di installazione di PowerShell.È necessario usare il nome breve 8.3 per tutti i percorsi di file che contengono spazi. È presente un bug in OpenSSH per Windows che impedisce il funzionamento dei percorsi eseguibili nel sottosistema che contengono spazi. Per altre informazioni, vedere questo problema in GitHub.
Il nome breve 8.3 per la cartella
Program Files
in Windows è in genereProgra~1
. È comunque possibile usare il comando seguente per controllare:Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName
EightDotThreeFileName --------------------- c:\progra~1
Facoltativamente è possibile abilitare l'autenticazione della chiave:
PubkeyAuthentication yes
Per altre informazioni, vedere Gestione delle chiavi OpenSSH.
Riavviare il servizio sshd.
Restart-Service sshd
Aggiungere il percorso in cui è installato OpenSSH alla variabile di ambiente Path. Ad esempio:
C:\Program Files\OpenSSH\
. Questa voce permette di trovaressh.exe
.
Installare il servizio SSH in un computer Ubuntu Linux
Installare la versione più recente di PowerShell, vedere Installazione di PowerShell in Ubuntu.
Installare Ubuntu OpenSSH Server.
sudo apt install openssh-client sudo apt install openssh-server
Modificare il file
sshd_config
nel percorso/etc/ssh
.Assicurarsi che l'autenticazione della password sia abilitata:
PasswordAuthentication yes
Facoltativamente è possibile abilitare l'autenticazione della chiave:
PubkeyAuthentication yes
Per altre informazioni sulla creazione di chiavi SSH in Ubuntu, vedere la pagina del manuale (manpage) per ssh-keygen.
Aggiungere una voce del sottosistema PowerShell:
Subsystem powershell /usr/bin/pwsh -sshs -nologo
Nota
Il percorso predefinito del file eseguibile di PowerShell è
/usr/bin/pwsh
. La posizione può variare a seconda della modalità di installazione di PowerShell.Nota
A partire da PowerShell 7.4, non è più necessario usare il
-nologo
parametro quando si esegue PowerShell in modalità server SSH.Riavviare il servizio ssh.
sudo systemctl restart sshd.service
Installare il servizio SSH in un computer macOS
Installare la versione più recente di PowerShell. Per altre informazioni, installare PowerShell in macOS.
Assicurarsi che la comunicazione remota SSH sia abilitata attenendosi alla procedura seguente:
System Settings
aperti.- Fare clic su
General
- Fare clic su
Sharing
. - Selezionare
Remote Login
per impostareRemote Login: On
. - Consentire l'accesso agli utenti appropriati.
Modificare il file
sshd_config
nel percorso/private/etc/ssh/sshd_config
.Aprire un editor di testo, come nano:
sudo nano /private/etc/ssh/sshd_config
Assicurarsi che l'autenticazione della password sia abilitata:
PasswordAuthentication yes
Aggiungere una voce del sottosistema PowerShell:
Subsystem powershell /usr/local/bin/pwsh -sshs -nologo
Nota
Il percorso predefinito del file eseguibile di PowerShell è
/usr/local/bin/pwsh
. La posizione può variare a seconda della modalità di installazione di PowerShell.Nota
A partire da PowerShell 7.4, non è più necessario usare il
-nologo
parametro quando si esegue PowerShell in modalità server SSH.Facoltativamente è possibile abilitare l'autenticazione della chiave:
PubkeyAuthentication yes
Riavviare il servizio sshd.
sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd
Nota
Quando si aggiorna il sistema operativo, il file di configurazione SSH potrebbe essere sovrascritto. Assicurarsi di controllare il file di configurazione dopo un aggiornamento.
Autenticazione
La comunicazione remota di PowerShell su SSH si affida allo scambio di autenticazioni tra il clienti SSH e il servizio SSH e non implementa alcuno schema di autenticazione. Ciò significa che tutti gli schemi di autenticazione configurati, tra cui l'autenticazione a più fattori, sono gestiti da SSH e indipendenti da PowerShell. Ad esempio, è possibile configurare il servizio SSH per richiedere l'autenticazione con chiave pubblica e una password monouso per maggiore sicurezza. La configurazione dell'autenticazione a più fattori non rientra nell'ambito di questa documentazione. Fare riferimento alla documentazione per SSH su come configurare l'autenticazione a più fattori in modo corretto e verificare se funziona all'esterno di PowerShell prima di provare a usarlo con la comunicazione remota di PowerShell.
Nota
Gli utenti mantengono gli stessi privilegi nelle sessioni remote. Ciò significa che i Amministrazione istrator hanno accesso a una shell con privilegi elevati e gli utenti normali non lo fanno.
Esempio di comunicazione remota di PowerShell
Il modo più semplice per testare la comunicazione remota è provarla su un singolo computer. In questo esempio verrà creata una sessione remota verso lo stesso computer Linux. Poiché i cmdlet di PowerShell vengono usati in modo interattivo, vengono visualizzati prompt di SSH che chiedono di verificare il computer host e di immettere una password. È possibile eseguire la stessa operazione in un computer Windows per verificare il funzionamento della comunicazione remota. Stabilire quindi la comunicazione remota tra i computer modificando il nome host.
Da Linux a Linux
$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' can't be established.
ECDSA key fingerprint is SHA256:2kCbnhT2dUE6WCGgVJ8Hyfu1z2wE4lifaJXLO7QJy0Y.
Are you sure you want to continue connecting (yes/no)?
TestUser@UbuntuVM1s password:
$session
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 SSH1 UbuntuVM1 RemoteMachine Opened DefaultShell Available
Enter-PSSession $session
[UbuntuVM1]: PS /home/TestUser> uname -a
Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~16.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[UbuntuVM1]: PS /home/TestUser> Exit-PSSession
Invoke-Command $session -ScriptBlock { Get-Process pwsh }
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName PSComputerName
------- ------ ----- ----- ------ -- -- ----------- --------------
0 0 0 19 3.23 10635 635 pwsh UbuntuVM1
0 0 0 21 4.92 11033 017 pwsh UbuntuVM1
0 0 0 20 3.07 11076 076 pwsh UbuntuVM1
Da Linux a Windows
Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:
[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
Microsoft Windows [Version 10.0.10586]
Da Windows a Windows
C:\Users\PSUser\Documents>pwsh.exe
PowerShell
Copyright (c) Microsoft Corporation. All rights reserved.
$session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser
The authenticity of host 'WinVM2 (10.13.37.3)' can't be established.
ECDSA key fingerprint is SHA256:kSU6slAROyQVMEynVIXAdxSiZpwDBigpAF/TXjjWjmw.
Are you sure you want to continue connecting (yes/no)?
Warning: Permanently added 'WinVM2,10.13.37.3' (ECDSA) to the list of known hosts.
PSRemoteUser@WinVM2's password:
$session
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 SSH1 WinVM2 RemoteMachine Opened DefaultShell Available
Enter-PSSession -Session $session
[WinVM2]: PS C:\Users\PSRemoteUser\Documents> $PSVersionTable
Name Value
---- -----
PSEdition Core
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
SerializationVersion 1.1.0.1
BuildVersion 3.0.0.0
CLRVersion
PSVersion 6.0.0-alpha
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
GitCommitId v6.0.0-alpha.17
[WinVM2]: PS C:\Users\PSRemoteUser\Documents>
Limiti
Il comando sudo non funziona in una sessione remota verso un computer Linux.
PSRemoting su SSH non supporta i profili e non ha accesso a
$PROFILE
. Quando è attiva una sessione, è possibile caricare un profilo eseguendo il dot sourcing del profilo con il percorso di file completo. Questo non è correlato ai profili SSH. È possibile configurare il server SSH per usare PowerShell come shell predefinita e per caricare un profilo tramite SSH. Per altre informazioni, vedere la documentazione di SSH.Prima di PowerShell 7.1, la comunicazione remota su SSH non supportava sessioni remote di secondo hop. Questa funzionalità era limitata alle sessioni che usavano WinRM. PowerShell 7.1 consente a
Enter-PSSession
eEnter-PSHostProcess
di funzionare dall'interno di qualsiasi sessione remota interattiva.