Condividi tramite


Comunicazione remota di PowerShell su SSH

Informazioni generali

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 consente di eseguire la comunicazione remota della sessione di PowerShell di base tra computer Windows e Linux. La comunicazione remota SSH crea un processo host di PowerShell come sottosistema SSH sul computer di destinazione. Infine verrà implementato un modello di hosting generale, simile a WinRM, per supportare la configurazione degli endpoint e JEA.

I cmdlet New-PSSession, Enter-PSSessione Invoke-Command dispongono ora di un nuovo parametro impostato per supportare questa nuova connessione remota.

[-HostName <string>]  [-UserName <string>]  [-KeyFilePath <string>]

Per creare una sessione remota, specificare il computer di destinazione con il parametro HostName e specificare il nome utente con UserName. Quando si eseguono i cmdlet in modo interattivo, viene richiesta una password. È anche possibile usare l'autenticazione con chiave SSH usando un file di chiave privata con il parametro KeyFilePath. La creazione di chiavi per l'autenticazione SSH varia in base alla piattaforma.

Informazioni generali sulla configurazione

PowerShell 6 o versione successiva e SSH deve essere installato in tutti i computer. Installare sia il client SSH (ssh.exe) che il server (sshd.exe) in modo da poter essere remoti da e verso i computer. OpenSSH per Windows è ora disponibile in Windows 10 build 1809 e Windows Server 2019. Per altre informazioni, vedere Gestire Windows con OpenSSH. Su Linux, installare SSH, incluso il server sshd, adatto alla tua piattaforma. È anche necessario installare PowerShell da GitHub per ottenere la funzionalità di comunicazione remota SSH. Il server SSH deve essere configurato per creare un sottosistema SSH per ospitare un processo di PowerShell nel computer remoto. È inoltre necessario abilitare l'autenticazione con password o l'autenticazione basata su 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 disponga del 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 parametri SSH.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Installare la versione più recente di OpenSSH Win32. Per istruzioni sull'installazione, vedere Introduzione a OpenSSH.

    Nota

    Per impostare PowerShell come shell predefinita per OpenSSH, vedere Configurazione di Windows per OpenSSH.

  3. Modifica il file sshd_config situato 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 parametro -NoLogo quando si esegue PowerShell in modalità server SSH.

    Nota

    Il percorso predefinito dell'eseguibile di PowerShell è C:/progra~1/powershell/7/pwsh.exe. Il percorso 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 l'uso di spazi nei percorsi di file eseguibili del sottosistema. Per altre informazioni, vedere questo problema in GitHub.

    Il nome breve 8.3 per la cartella Program Files in Windows è in genere Progra~1. Tuttavia, è possibile usare il comando seguente per assicurarsi:

    Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' |
      Select-Object EightDotThreeFileName
    
    EightDotThreeFileName
    ---------------------
    C:\progra~1
    

    Facoltativamente, 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 nella variabile di ambiente PATH. Ad esempio: C:\Program Files\OpenSSH\. Questa voce consente di trovare il 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 il server OpenSSH di Ubuntu .

    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, abilitare l'autenticazione della chiave:

    PubkeyAuthentication yes
    

    Per altre informazioni sulla creazione di chiavi SSH in Ubuntu, vedere la pagina manpage per ssh-keygen.

    Aggiungere una voce del sottosistema PowerShell:

    Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
    

    Nota

    Il percorso predefinito dell'eseguibile di PowerShell è /usr/bin/pwsh. Il percorso può variare a seconda della modalità di installazione di PowerShell.

    Nota

    A partire da PowerShell 7.4, non è più necessario usare il parametro -NoLogo 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, Installazione di PowerShell su macOS.

    Assicurarsi che la comunicazione remota SSH sia abilitata seguendo questa procedura:

    1. Apri System Settings.
    2. Fare clic su General
    3. Cliccare su Sharing.
    4. Controllare 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.

    Usare un editor di testo, ad esempio nano:

    sudo nano /private/etc/ssh/sshd_config
    

    Assicurarsi che l'autenticazione della password sia abilitata:

    PasswordAuthentication yes
    

    Aggiungi una voce del sottosistema PowerShell:

    Subsystem powershell /usr/local/bin/pwsh -sshs -NoLogo
    

    Nota

    Il percorso predefinito dell'eseguibile di PowerShell è /usr/local/bin/pwsh. Il percorso può variare a seconda della modalità di installazione di PowerShell.

    Nota

    A partire da PowerShell 7.4, non è più necessario usare il parametro -NoLogo quando si esegue PowerShell in modalità server SSH.

    Facoltativamente, 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 tramite SSH si basa sullo scambio di autenticazione tra il client SSH e il servizio SSH e non implementa schemi di autenticazione. Il risultato è che tutti gli schemi di autenticazione configurati, inclusa l'autenticazione a più fattori, vengono gestiti da SSH e indipendenti da PowerShell. Ad esempio, è possibile configurare il servizio SSH per richiedere l'autenticazione a chiave pubblica e una password una tantum per una maggiore sicurezza. La configurazione dell'autenticazione a più fattori non rientra nell'ambito di questa documentazione. Consultare la documentazione di SSH su come configurare correttamente l'autenticazione a più fattori e verificarne il funzionamento al di fuori di PowerShell prima di tentare di usarla con il remoting di PowerShell.

Nota

Gli utenti mantengono gli stessi privilegi nelle sessioni remote. Ciò significa che gli amministratori hanno accesso a una shell con privilegi elevati e gli utenti normali non hanno accesso.

Esempio di remotizzazione di PowerShell

Il modo più semplice per testare la comunicazione remota consiste nel provarlo in un singolo computer. In questo esempio viene creata una sessione remota nello stesso computer Linux. Si usano i cmdlet di PowerShell in modo interattivo, quindi vengono visualizzati prompt da SSH che chiedono di verificare il computer host e di richiedere una password. È possibile eseguire la stessa operazione in un computer Windows per garantire il funzionamento della comunicazione remota. Quindi, connettersi in remoto ai computer modificando il nome del 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>

Limitazioni

  • Il comando sudo non funziona in una sessione remota in un computer Linux.

  • PSRemoting su SSH non supporta i profili e non ha accesso a $PROFILE. Una volta in una sessione, è possibile caricare un profilo eseguendo il dot sourcing del profilo con il percorso file completo. Questo non è correlato ai profili SSH. È possibile configurare il server SSH per l'uso di 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 usano WinRM. PowerShell 7.1 consente Enter-PSSession e Enter-PSHostProcess di funzionare da qualsiasi sessione remota interattiva.

Vedere anche