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

  1. 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
    
  2. 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.

  3. 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 genere Progra~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.

  4. Riavviare il servizio sshd.

    Restart-Service sshd
    
  5. Aggiungere il percorso in cui è installato OpenSSH alla variabile di ambiente Path. Ad esempio: C:\Program Files\OpenSSH\. Questa voce permette di trovare ssh.exe.

Installare il servizio SSH in un computer Ubuntu Linux

  1. Installare la versione più recente di PowerShell, vedere Installazione di PowerShell in Ubuntu.

  2. Installare Ubuntu OpenSSH Server.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. 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.

  4. Riavviare il servizio ssh.

    sudo systemctl restart sshd.service
    

Installare il servizio SSH in un computer macOS

  1. 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:

    1. System Settings aperti.
    2. Fare clic su General
    3. Fare clic su Sharing.
    4. Selezionare Remote Login per impostare Remote Login: On.
    5. Consentire l'accesso agli utenti appropriati.
  2. 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
    
  3. 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 e Enter-PSHostProcess di funzionare dall'interno di qualsiasi sessione remota interattiva.

Vedi anche