Partager via


Accès distant à PowerShell via SSH

Aperçu

L’accès distant PowerShell utilise normalement WinRM pour la négociation de la connexion et le transport des données. SSH est désormais disponible pour les plateformes Linux et Windows, et permet une réelle communication à distance PowerShell multiplateforme.

WinRM fournit un modèle d’hébergement robuste pour les sessions distantes PowerShell. La communication à distance SSH ne prend actuellement en charge ni la configuration de points de terminaison distants ni l’administration JEA (Just Enough Administration).

La communication à distance SSH vous permet d’effectuer une communication à distance de session PowerShell de base entre les ordinateurs Windows et Linux. La communication à distance SSH crée un processus hôte PowerShell sur l’ordinateur cible en tant que sous-système SSH. Finalement, nous allons implémenter un modèle d’hébergement général, similaire à WinRM, pour prendre en charge la configuration du point de terminaison et JEA.

Les New-PSSessionapplets de commande et Invoke-Command les applets Enter-PSSessionde commande ont désormais un nouveau paramètre défini pour prendre en charge cette nouvelle connexion de communication à distance.

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

Pour créer une session distante, vous spécifiez l’ordinateur cible avec le paramètre HostName et indiquez le nom d’utilisateur avec UserName. Lorsque vous exécutez les applets de commande de manière interactive, vous êtes invité à entrer un mot de passe. Vous pouvez également utiliser l’authentification par clé SSH à l’aide d’un fichier de clé privée avec le paramètre KeyFilePath . La création de clés pour l’authentification SSH varie selon la plateforme.

Informations générales sur la configuration

PowerShell 6 ou version ultérieure, et SSH doit être installé sur tous les ordinateurs. Installez à la fois le client SSH (ssh.exe) et le serveur (sshd.exe) afin que vous puissiez vous connecter à distance et à partir des ordinateurs. OpenSSH pour Windows est désormais disponible dans Windows 10 build 1809 et Windows Server 2019. Pour plus d’informations, consultez Gérer Windows avec OpenSSH. Pour Linux, installez SSH, y compris le serveur sshd, qui convient à votre plateforme. Vous devez également installer PowerShell à partir de GitHub pour obtenir la fonctionnalité de communication à distance SSH. Le serveur SSH doit être configuré pour créer un sous-système SSH pour héberger un processus PowerShell sur l’ordinateur distant. Vous devez également activer l’authentification par mot de passe ou par clé .

Installer le service SSH sur un ordinateur Windows

  1. Installez la dernière version de PowerShell. Pour plus d’informations, consultez Installation de PowerShell sur Windows.

    Vous pouvez confirmer que PowerShell dispose d’une prise en charge de la communication à distance SSH en répertoriant les New-PSSession ensembles de paramètres. Vous remarquerez qu’il existe des noms de jeu de paramètres qui commencent par SSH. Ces ensembles de paramètres incluent des paramètres SSH .

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Installez la dernière version de Win32 OpenSSH. Pour obtenir des instructions d’installation, consultez Prise en main d’OpenSSH.

    Remarque

    Si vous souhaitez définir PowerShell comme interpréteur de commandes par défaut pour OpenSSH, consultez Configuration de Windows pour OpenSSH.

  3. Modifiez le fichier situé à l’adresse sshd_config$Env:ProgramData\ssh.

    • Vérifiez que l’authentification par mot de passe est activée :

      PasswordAuthentication yes
      
    • Créez le sous-système SSH qui héberge un processus PowerShell sur l’ordinateur distant :

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

      Remarque

      Il existe un bogue dans OpenSSH pour Windows qui vous empêche d’utiliser un chemin d’accès avec des espaces pour l’exécutable du sous-système. Il existe deux façons de contourner ce problème :

      • Utilisez le nom court de style Windows 8.3 pour le chemin d’accès exécutable PowerShell
      • Créer un lien symbolique vers l’exécutable PowerShell qui entraîne un chemin d’accès sans espaces

      Pour plus d’informations, consultez le problème n° 784 dans le référentiel PowerShell/Win32-OpenSSH.

      Vous devez uniquement obtenir le nom de style 8.3 pour le segment du chemin d’accès qui contient l’espace. Par défaut, PowerShell 7 est installé dans C:\Program Files\PowerShell\7\. Le nom de style 8.3 doit Program Files être progra~1. Vous pouvez utiliser la commande suivante pour vérifier le nom :

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

      Le nom 8.3 est une fonctionnalité héritée du système de fichiers NTFS qui peut être désactivé. Cette fonctionnalité doit être activée pour le volume sur lequel PowerShell est installé.

      Vous pouvez également créer un lien symbolique vers l’exécutable PowerShell qui entraîne un chemin d’accès sans espace. Cette méthode est préférée, car elle vous permet de mettre à jour le lien si le chemin d’accès à l’exécutable PowerShell change jamais, sans avoir également besoin de mettre à jour votre sshd_config fichier.

      Utilisez la commande suivante pour créer un lien symbolique vers l’exécutable :

      $newItemSplat = @{
           ItemType = 'SymbolicLink'
           Path = 'C:\ProgramData\ssh\'
           Name = 'pwsh.exe'
           Value = (Get-Command pwsh.exe).Source
      }
      New-Item @newItemSplat
      

      Cette commande crée le lien symbolique dans le même répertoire que celui utilisé par le serveur OpenSSH pour stocker les clés d’hôte et d’autres configurations.

    • Si vous le souhaitez, activez l’authentification par clé :

      PubkeyAuthentication yes
      

      Pour plus d’informations, consultez Gestion des clés OpenSSH.

  4. Redémarrez le service sshd.

    Restart-Service sshd
    
  5. Ajoutez le chemin d’accès où OpenSSH est installé sur votre variable d’environnement PATH. Par exemple : C:\Program Files\OpenSSH\. Cette entrée permet d’être ssh.exe trouvée.

Installer le service SSH sur un ordinateur Ubuntu Linux

  1. Installez la dernière version de PowerShell, consultez Installation de PowerShell sur Ubuntu.

  2. Installez Ubuntu OpenSSH Server.

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

    • Vérifiez que l’authentification par mot de passe est activée :

      PasswordAuthentication yes
      
    • Si vous le souhaitez, activez l’authentification par clé :

      PubkeyAuthentication yes
      

      Pour plus d’informations sur la création de clés SSH sur Ubuntu, consultez la page manpage pour ssh-keygen.

    • Ajoutez une entrée de sous-système PowerShell :

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

      Remarque

      L’emplacement par défaut de l’exécutable PowerShell est /usr/bin/pwsh. L’emplacement peut varier en fonction de la façon dont vous avez installé PowerShell.

  4. Redémarrez le service ssh .

    sudo systemctl restart sshd.service
    

Installer le service SSH sur un ordinateur macOS

  1. Installez la dernière version de PowerShell. Pour plus d’informations, installez PowerShell sur macOS.

    Vérifiez que la communication à distance SSH est activée en procédant comme suit :

    1. Ouvrez System Settings.
    2. Cliquez sur General
    3. Cliquez sur Sharing.
    4. Vérifier Remote Login la définition Remote Login: On.
    5. Autoriser l’accès aux utilisateurs appropriés.
  2. Modifiez le fichier à l’emplacement sshd_config/private/etc/ssh/sshd_config.

    Utilisez un éditeur de texte tel que nano :

    sudo nano /private/etc/ssh/sshd_config
    
    • Vérifiez que l’authentification par mot de passe est activée :

      PasswordAuthentication yes
      
    • Ajoutez une entrée de sous-système PowerShell :

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

      Remarque

      L’emplacement par défaut de l’exécutable PowerShell est /usr/local/bin/pwsh. L’emplacement peut varier en fonction de la façon dont vous avez installé PowerShell.

    • Si vous le souhaitez, activez l’authentification par clé :

      PubkeyAuthentication yes
      
  3. Redémarrez le service sshd.

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

Remarque

Lorsque vous mettez à niveau votre système d’exploitation, le fichier de configuration SSH peut être remplacé. Vérifiez que vous vérifiez le fichier de configuration après une mise à niveau.

Authentification

La communication à distance PowerShell sur SSH s’appuie sur l’échange d’authentification entre le client SSH et le service SSH et n’implémente aucun schéma d’authentification lui-même. Le résultat est que tous les schémas d’authentification configurés, y compris l’authentification multifacteur, sont gérés par SSH et indépendamment de PowerShell. Par exemple, vous pouvez configurer le service SSH pour exiger l’authentification par clé publique et un mot de passe unique pour renforcer la sécurité. La configuration de l’authentification multifacteur est en dehors de l’étendue de cette documentation. Reportez-vous à la documentation de SSH sur la configuration correcte de l’authentification multifacteur et la validation qu’elle fonctionne en dehors de PowerShell avant de tenter de l’utiliser avec la communication à distance PowerShell.

Remarque

Les utilisateurs conservent les mêmes privilèges dans les sessions à distance. Cela signifie que les administrateurs ont accès à un interpréteur de commandes avec élévation de privilèges et les utilisateurs normaux ne le font pas.

Exemple de communication à distance PowerShell

Le moyen le plus simple de tester la communication à distance consiste à l’essayer sur un seul ordinateur. Dans cet exemple, nous créons une session à distance sur le même ordinateur Linux. Nous utilisons des applets de commande PowerShell de manière interactive afin que nous voyions des invites de SSH demandant de vérifier l’ordinateur hôte et d’inviter un mot de passe. Vous pouvez faire la même chose sur un ordinateur Windows pour vous assurer que la communication à distance fonctionne. Ensuite, à distance entre les ordinateurs en modifiant le nom d’hôte.

Linux vers 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

Linux vers 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 vers 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>

Limites

  • La commande sudo ne fonctionne pas dans une session à distance sur un ordinateur Linux.

  • PSRemoting sur SSH ne prend pas en charge les profils et n’a pas accès à $PROFILE. Une fois dans une session, vous pouvez charger un profil en pointant le profil avec le chemin de fichier complet. Cela n’est pas lié aux profils SSH. Vous pouvez configurer le serveur SSH pour utiliser PowerShell comme interpréteur de commandes par défaut et charger un profil via SSH. Pour plus d’informations, consultez la documentation SSH.

  • Avant PowerShell 7.1, la communication à distance via SSH ne prenait pas en charge les sessions distantes du deuxième tronçon. Cette fonctionnalité était limitée aux sessions utilisant WinRM. PowerShell 7.1 permet Enter-PSSession et Enter-PSHostProcess de fonctionner à partir de n’importe quelle session distante interactive.

Voir aussi