Accès distant à PowerShell via SSHPowerShell remoting over SSH

Vue d’ensembleOverview

L’accès distant PowerShell utilise normalement WinRM pour la négociation de la connexion et le transport des données.PowerShell remoting normally uses WinRM for connection negotiation and data transport. SSH est désormais disponible pour les plateformes Linux et Windows, et permet une réelle communication à distance PowerShell multiplateforme.SSH is now available for Linux and Windows platforms and allows true multiplatform PowerShell remoting.

WinRM fournit un modèle d’hébergement robuste pour les sessions distantes PowerShell.WinRM provides a robust hosting model for PowerShell remote sessions. La communication à distance SSH ne prend actuellement en charge ni la configuration de points de terminaison distants ni l’administration JEA (Just Enough Administration).SSH-based remoting doesn't currently support remote endpoint configuration and Just Enough Administration (JEA).

La communication à distance SSH vous permet d’établir la communication à distance pour une session PowerShell de base entre des ordinateurs Windows et Linux.SSH remoting lets you do basic PowerShell session remoting between Windows and Linux computers. La communication à distance SSH crée un processus hôte PowerShell sur l’ordinateur cible en tant que sous-système SSH.SSH remoting creates a PowerShell host process on the target computer as an SSH subsystem. Nous implémenterons prochainement un modèle d’hébergement général, similaire à WinRM, pour prendre en charge la configuration de point de terminaison et JEA.Eventually we'll implement a general hosting model, similar to WinRM, to support endpoint configuration and JEA.

Les cmdlets New-PSSession``Enter-PSSession et Invoke-Command ont maintenant un nouvel ensemble de paramètres pour prendre en charge cette nouvelle connexion de communication à distance.The New-PSSession, Enter-PSSession, and Invoke-Command cmdlets now have a new parameter set to support this new remoting connection.

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

Pour créer une session distante, vous devez spécifier l’ordinateur cible avec le paramètre HostName, et indiquer le nom d’utilisateur avec UserName.To create a remote session, you specify the target computer with the HostName parameter and provide the user name with UserName. Lors de l’exécution des cmdlets de manière interactive, vous êtes invité à entrer un mot de passe.When running the cmdlets interactively, you're prompted for a password. Vous pouvez également utiliser l’authentification par clé SSH à l’aide d’un fichier de clé privée avec le paramètre KeyFilePath.You can also, use SSH key authentication using a private key file with the KeyFilePath parameter.

Informations générales sur l’installationGeneral setup information

PowerShell 6 ou version ultérieure et SSH doivent être installés sur tous les ordinateurs.PowerShell 6 or higher, and SSH must be installed on all computers. Installez le client SSH (ssh.exe) et le serveur (sshd.exe) pour pouvoir communiquer à distance vers et à partir des ordinateurs.Install both the SSH client (ssh.exe) and server (sshd.exe) so that you can remote to and from the computers. OpenSSH pour Windows est désormais disponible dans Windows 10 build 1809 et Windows Server 2019.OpenSSH for Windows is now available in Windows 10 build 1809 and Windows Server 2019. Pour plus d’informations, consultez Gérer Windows avec OpenSSH.For more information, see Manage Windows with OpenSSH. Pour Linux, installez la version de SSH (avec le serveur sshd) qui correspond à votre plateforme.For Linux, install SSH, including sshd server, that's appropriate for your platform. Vous devez aussi installer PowerShell à partir de GitHub pour obtenir la fonctionnalité de communication à distance SSH.You also need to install PowerShell from GitHub to get the SSH remoting feature. Le serveur SSH doit être configuré pour créer un sous-système SSH destiné à héberger un processus PowerShell sur l’ordinateur distant.The SSH server must be configured to create an SSH subsystem to host a PowerShell process on the remote computer. Par ailleurs, vous devez activer l’authentification par mot de passe ou clé.And, you must enable password or key-based authentication.

Installation sur un ordinateur WindowsSet up on a Windows computer

  1. Installez la dernière version de PowerShell (voir Installation de PowerShell Core sur Windows).Install the latest version of PowerShell, see Installing PowerShell Core on Windows.

    Vous pouvez vérifier que PowerShell prend bien en charge la communication à distance SSH en listant les jeux de paramètres New-PSSession.You can confirm that PowerShell has SSH remoting support by listing the New-PSSession parameter sets. Vous noterez la présence de noms de jeux de paramètres commençant par SSH.You'll notice there are parameter set names that begin with SSH. Ces jeux de paramètres comportent des paramètres SSH.Those parameter sets include SSH parameters.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Installez la dernière version d’OpenSSH Win32.Install the latest Win32 OpenSSH. Pour obtenir des instructions d’installation, consultez Bien démarrer avec OpenSSH.For installation instructions, see Getting started with OpenSSH.

    Notes

    Si vous voulez définir PowerShell en tant qu’interpréteur de commandes par défaut pour OpenSSH, consultez Configuration de Windows pour OpenSSH.If you want to set PowerShell as the default shell for OpenSSH, see Configuring Windows for OpenSSH.

  3. Modifiez le fichier sshd_config situé dans $env:ProgramData\ssh.Edit the sshd_config file located at $env:ProgramData\ssh.

    Vérifiez que l’authentification par mot de passe est activée :Make sure password authentication is enabled:

    PasswordAuthentication yes
    

    Créez le sous-système SSH destiné à héberger un processus PowerShell sur l’ordinateur distant :Create the SSH subsystem that hosts a PowerShell process on the remote computer:

    Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo
    

    Notes

    L’emplacement par défaut de l’exécutable PowerShell est c:/progra~1/powershell/7/pwsh.exe.The default location of the PowerShell executable is c:/progra~1/powershell/7/pwsh.exe. L’emplacement peut varier en fonction de la façon dont vous avez installé PowerShell.The location can vary depending on how you installed PowerShell.

    Vous devez utiliser le nom abrégé 8.3 pour les chemins de fichiers qui contiennent des espaces.You must use the 8.3 short name for any file paths that contain spaces. OpenSSH pour Windows présente un bogue qui empêche les espaces de fonctionner dans les chemins exécutables du sous-système.There's a bug in OpenSSH for Windows that prevents spaces from working in subsystem executable paths. Pour plus d’informations, consultez ce problème GitHub.For more information, see this GitHub issue.

    Le nom abrégé 8.3 du dossier Program Files dans Windows est généralement Progra~1.The 8.3 short name for the Program Files folder in Windows is usually Progra~1. Cependant, vous pouvez utiliser la commande suivante pour vous en assurer :However, you can use the following command to make sure:

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

    Vous pouvez éventuellement activer l’authentification par clé :Optionally, enable key authentication:

    PubkeyAuthentication yes
    

    Pour plus d’informations, consultez Gestion des clés OpenSSH.For more information, see Managing OpenSSH Keys.

  4. Redémarrez le service sshd.Restart the sshd service.

    Restart-Service sshd
    
  5. Ajoutez le chemin où OpenSSH est installé à votre variable d’environnement Path.Add the path where OpenSSH is installed to your Path environment variable. Par exemple : C:\Program Files\OpenSSH\.For example, C:\Program Files\OpenSSH\. Cette entrée permet au système de trouver ssh.exe.This entry allows for the ssh.exe to be found.

Installation sur un ordinateur Linux Ubuntu 16.04Set up on an Ubuntu 16.04 Linux computer

  1. Installez la dernière version de PowerShell (voir Installation de PowerShell Core sur Linux).Install the latest version of PowerShell, see Installing PowerShell Core on Linux.

  2. Installez Ubuntu OpenSSH Server.Install Ubuntu OpenSSH Server.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. Modifiez le fichier sshd_config à l’emplacement /etc/ssh.Edit the sshd_config file at location /etc/ssh.

    Vérifiez que l’authentification par mot de passe est activée :Make sure password authentication is enabled:

    PasswordAuthentication yes
    

    Ajoutez une entrée de sous-système PowerShell :Add a PowerShell subsystem entry:

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

    Notes

    L’emplacement par défaut de l’exécutable PowerShell est /usr/bin/pwsh.The default location of the PowerShell executable is /usr/bin/pwsh. L’emplacement peut varier en fonction de la façon dont vous avez installé PowerShell.The location can vary depending on how you installed PowerShell.

    Vous pouvez éventuellement activer l’authentification par clé :Optionally, enable key authentication:

    PubkeyAuthentication yes
    
  4. Redémarrez le service sshd.Restart the sshd service.

    sudo service sshd restart
    

Installation sur un ordinateur macOSSet up on a macOS computer

  1. Installez la dernière version de PowerShell (voir Installation de PowerShell Core sur macOS).Install the latest version of PowerShell, see Installing PowerShell Core on macOS.

    Vérifiez que l’accès distant SSH est activé en suivant ces étapes :Make sure SSH Remoting is enabled by following these steps:

    1. Ouvrez System Preferences.Open System Preferences.
    2. Cliquez sur Sharing.Click on Sharing.
    3. Vérifiez Remote Login pour définir Remote Login: On.Check Remote Login to set Remote Login: On.
    4. Autorisez l’accès aux utilisateurs appropriés.Allow access to the appropriate users.
  2. Modifiez le fichier sshd_config à l’emplacement /private/etc/ssh/sshd_config.Edit the sshd_config file at location /private/etc/ssh/sshd_config.

    Utilisez un éditeur de texte tel que nano :Use a text editor such as nano:

    sudo nano /private/etc/ssh/sshd_config
    

    Vérifiez que l’authentification par mot de passe est activée :Make sure password authentication is enabled:

    PasswordAuthentication yes
    

    Ajoutez une entrée de sous-système PowerShell :Add a PowerShell subsystem entry:

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

    Notes

    L’emplacement par défaut de l’exécutable PowerShell est /usr/local/bin/pwsh.The default location of the PowerShell executable is /usr/local/bin/pwsh. L’emplacement peut varier en fonction de la façon dont vous avez installé PowerShell.The location can vary depending on how you installed PowerShell.

    Vous pouvez éventuellement activer l’authentification par clé :Optionally, enable key authentication:

    PubkeyAuthentication yes
    
  3. Redémarrez le service sshd.Restart the sshd service.

    sudo launchctl stop com.openssh.sshd
    sudo launchctl start com.openssh.sshd
    

AuthentificationAuthentication

L’accès distant PowerShell via SSH repose sur l’échange d’authentification entre le client SSH et le service SSH et n’implémente aucun schéma d’authentification par lui-même.PowerShell remoting over SSH relies on the authentication exchange between the SSH client and SSH service and doesn't implement any authentication schemes itself. Résultat : les schémas d’authentification éventuellement configurés, comme l’authentification multifacteur, sont gérés par SSH et sont indépendants de PowerShell.The result is that any configured authentication schemes including multi-factor authentication are handled by SSH and independent of PowerShell. Par exemple, vous pouvez configurer le service SSH pour exiger une authentification par clé publique et un mot de passe à usage unique pour une sécurité renforcée.For example, you can configure the SSH service to require public key authentication and a one-time password for added security. La configuration de l’authentification multifacteur sort du cadre de cette documentation.Configuration of multi-factor authentication is outside the scope of this documentation. Reportez-vous à la documentation SSH pour savoir comment configurer correctement l’authentification multifacteur et vérifier qu’elle fonctionne en dehors de PowerShell avant d’essayer de l’utiliser avec l’accès distant PowerShell.Refer to documentation for SSH on how to correctly configure multi-factor authentication and validate it works outside of PowerShell before attempting to use it with PowerShell remoting.

Notes

Les utilisateurs conservent les mêmes privilèges dans les sessions à distance.Users retain the same privileges in remote sessions. Cela signifie que les administrateurs ont accès à un interpréteur de commandes avec élévation de privilèges, contrairement aux utilisateurs normaux.Meaning, Administrators have access to an elevated shell, and normal users will not.

Exemple d’accès distant PowerShellPowerShell remoting example

Le moyen le plus simple de tester l’accès distant est de l’essayer sur un seul ordinateur.The easiest way to test remoting is to try it on a single computer. Dans cet exemple, nous créons une session distante avec le même ordinateur Linux.In this example, we create a remote session back to the same Linux computer. Comme nous utilisons des applets de commande PowerShell de manière interactive, des invites SSH s’affichent pour demander de vérifier l’ordinateur hôte et de fournir un mot de passe.We're using PowerShell cmdlets interactively so we see prompts from SSH asking to verify the host computer and prompting for a password. Vous pouvez faire la même chose sur un ordinateur Windows pour vérifier que l’accès distant fonctionne.You can do the same thing on a Windows computer to ensure remoting is working. Ensuite, établissez une communication à distance entre les ordinateurs en changeant le nom d’hôte.Then, remote between computers by changing the host name.

# Linux to Linux
#
$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' cannot 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 powershell }
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName                    PSComputerName
-------  ------    -----      -----     ------     --  -- -----------                    --------------
      0       0        0         19       3.23  10635 635 powershell                     UbuntuVM1
      0       0        0         21       4.92  11033 017 powershell                     UbuntuVM1
      0       0        0         20       3.07  11076 076 powershell                     UbuntuVM1
#
# Linux to 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]
#
# Windows to 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>

LimitesLimitations

  • La commande sudo ne fonctionne pas dans une session distante sur un ordinateur Linux.The sudo command doesn't work in a remote session to a Linux computer.

  • PSRemoting sur SSH ne prend pas en charge les profils et n’a pas accès à $PROFILE.PSRemoting over SSH does not support Profiles and does not have access to $PROFILE. Une fois que vous avez ouvert une session, vous pouvez charger un profil en le « dot sourçant » avec le chemin de fichier complet.Once in a session, you can load a profile by dot sourcing the profile with the full filepath. Cela n’a pas de rapports avec les profils SSH.This is not related to SSH profiles. Vous pouvez configurer le serveur SSH pour utiliser PowerShell comme interpréteur de commandes par défaut et charger un profil par le biais du SSH.You can configure the SSH server to use PowerShell as the default shell and to load a profile through SSH. Pour plus d’informations, consultez la documentation SSH.See the SSH documentation for more information.

  • Avant PowerShell 7.1, la communication à distance via SSH ne prenait pas en charge les sessions à distance de deuxième saut.Prior to PowerShell 7.1, remoting over SSH did not support second-hop remote sessions. Cette fonctionnalité était limitée aux sessions qui utilisaient WinRM.This capability was limited to sessions using WinRM. PowerShell 7.1 permet à Enter-PSSession et Enter-PSHostProcess de fonctionner dans n’importe quelle session à distance interactive.PowerShell 7.1 allows Enter-PSSession and Enter-PSHostProcess to work from within any interactive remote session.

Voir aussiSee also

Installation de PowerShell Core sur LinuxInstalling PowerShell Core on Linux

Installation de PowerShell Core sur macOSInstalling PowerShell Core on macOS

Installation de PowerShell Core sur WindowsInstalling PowerShell Core on Windows

Gérer Windows avec OpenSSHManage Windows with OpenSSH

Gestion des clés OpenSSHManaging OpenSSH Keys

Ubuntu SSHUbuntu SSH