Apprenez à configurer et à utiliser PowerShell SSH remoting

Lorsque Microsoft a déclaré que PowerShell deviendrait un projet open source fonctionnant sous Windows, Linux et macOS en août 2016, il y avait une ride intéressante liée à PowerShell remoting.

Microsoft a déclaré que ce noyau PowerShell prendrait en charge la connexion à distance via Secure Shell (SSH) ainsi que la gestion des services Web (WS-MAN). Vous pouvez toujours utiliser les binaires SSH PowerShell, mais l’annonce indiquait que le support SSH ferait partie intégrante de PowerShell. Cela a ouvert la possibilité d’effectuer facilement l’administration à distance des systèmes Windows et Linux en utilisant les mêmes technologies.

Une courte histoire de PowerShell remoting

Microsoft a introduit le remoting dans PowerShell version 2.0 dans Windows 7 et Windows Server 2008 R2, ce qui a radicalement changé le paysage pour les administrateurs Windows. Ils pouvaient créer des sessions de bureau à distance sur des serveurs, mais le remoting PowerShell permettait de gérer un grand nombre de serveurs simultanément.

L’accès à distance dans Windows PowerShell est basé sur WS-MAN, un standard ouvert du Groupe de travail sur la gestion distribuée. Mais comme la télécommande basée sur WS-MAN est orientée vers Windows, vous deviez utiliser une autre technologie, généralement SSH, pour administrer les systèmes Linux.

Présentation de SSH sur PowerShell Core

Nous nous sommes habitués à installer des logiciels sur Windows à l’aide des assistants, mais l’installation d’OpenSSH nécessite plus d’informations de base et plus de travail de la part de l’administrateur.

SSH est un protocole de gestion de systèmes sur un réseau éventuellement non sécurisé. SSH fonctionne en mode client-serveur et est la norme de facto pour l’administration à distance dans les environnements Linux.

PowerShell Core utilise OpenSSH, un fork de SSH 1.2.12 qui a été publié sous une licence open source. OpenSSH est probablement l’implémentation SSH la plus populaire.

Le code requis pour utiliser WS-MAN remoting est installé dans le système d’exploitation Windows. Vous devez installer OpenSSH manuellement.

Installation d’OpenSSH

Nous nous sommes habitués à installer des logiciels sous Windows à l’aide des assistants, mais l’installation d’OpenSSH nécessite plus d’informations de base et plus de travail de la part de l’administrateur. Sans une intervention manuelle, de nombreux problèmes peuvent survenir.

Le processus d’installation d’OpenSSH sous Windows s’est amélioré au fil du temps, mais ce n’est toujours pas aussi facile qu’il devrait l’être. Travailler avec le fichier de configuration laisse beaucoup à désirer.

Il existe deux options lors de l’installation de PowerShell SSH:

  1. Sous Windows 10 1809, Windows Server 1809, Windows Server 2019 et versions ultérieures, OpenSSH est disponible en option.
  2. Sur les versions antérieures de Windows, vous pouvez télécharger et installer OpenSSH depuis GitHub.

Assurez-vous que votre système dispose des derniers correctifs avant d’installer OpenSSH.

Installation de la fonctionnalité optionnelle OpenSSH

Vous pouvez installer la fonctionnalité optionnelle OpenSSH à l’aide de PowerShell. Tout d’abord, vérifiez votre système avec la commande suivante:

Get-WindowsCapability -Online | where Name -like '*SSH*'
Composants OpenSSH
Figure 1. Trouvez les composants OpenSSH dans votre système.

La figure 1 montre que le logiciel client OpenSSH est préinstallé.

Vous devrez utiliser Windows PowerShell pour l’installation, sauf si vous téléchargez le module WindowsCompatibility pour PowerShell Core. Ensuite, vous pouvez importer le module de maintenance et de gestion des images de déploiement à partir de Windows PowerShell et exécuter les commandes dans PowerShell Core.

Installez la fonction serveur :

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Path :
Online : True
RestartNeeded : False

Les fichiers SSH s’installent dans le C:\Windows\System32\OpenSSH dossier.

Téléchargez OpenSSH depuis GitHub

Commencez par télécharger la dernière version depuis GitHub. La dernière version des instructions d’installation se trouve sur ce lien.

Une fois le téléchargement terminé, extrayez le fichier zip dans le C:\Program Fichiers \ Dossier OpenSSH. Changer d’emplacement pour C:\Program Fichiers \ OpenSSH pour installer les services SSH:

.\install-sshd.ps1
SetServiceObjectSecurity SUCCESS
ChangeServiceConfig2 SUCCESS
ChangeServiceConfig2 SUCCESS

Configuration d’OpenSSH

Après l’installation d’OpenSSH, effectuez quelques étapes de configuration supplémentaires.

Assurez-vous que le dossier OpenSSH est inclus dans la variable d’environnement path système :

  • C:\Windows\System32\OpenSSH \ s’il est installé en tant que fonctionnalité facultative de Windows
  • C:\Program Files\OpenSSH\ si installé via le téléchargement OpenSSH

Définissez les deux services pour qu’ils démarrent automatiquement:

Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic

Si vous avez installé OpenSSH avec la fonctionnalité optionnelle, Windows crée une nouvelle règle de pare-feu pour autoriser l’accès entrant de SSH sur le port 22. Si vous avez installé OpenSSH à partir du téléchargement, créez la règle de pare-feu avec cette commande :

New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' `
-Enabled True -Direction Inbound -Protocol TCP `
-Action Allow -LocalPort 22

Démarrez le service sshd pour générer les clés SSH :

Start-Service sshd

Les clés SSH et le fichier de configuration résident dans C:\ProgramData\ssh , qui est un dossier caché. Le shell par défaut utilisé par SSH est le shell de commande Windows. Cela doit changer pour PowerShell:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell `
-Value "C:\Program Files\PowerShell\6\pwsh.exe" -PropertyType String -Force

Maintenant, lorsque vous vous connectez au système via SSH, PowerShell Core démarre et sera le shell par défaut. Vous pouvez également créer le shell par défaut Windows PowerShell si vous le souhaitez.

Il y a un bug dans OpenSSH sous Windows. Cela ne fonctionne pas avec les chemins avec un espace, comme le chemin d’accès à l’exécutable PowerShell Core! La solution consiste à créer un lien symbolique qui crée un chemin que OpenSSH peut utiliser :

New-Item -ItemType SymbolicLink -Path C:\pwsh -Target 'C:\Program Files\PowerShell\6'

Dans le fichier sshd_config, dé-commentez les lignes suivantes :

PubkeyAuthentication yes
PasswordAuthentication yes

Ajoutez cette ligne avant les autres lignes du sous-système:

Subsystem powershell C:\pwsh\pwsh.exe -sshs -NoLogo -NoProfile

Cela indique à OpenSSH d’exécuter PowerShell Core.

Commentez la ligne:

AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

Après avoir enregistré les modifications apportées au fichier sshd_config, redémarrez les services:

Restart-Service sshd
Start-Service ssh-agent

Vous devez redémarrer le service sshd après toute modification du fichier de configuration.

Utilisation de la télécommande SSH PowerShell

L’utilisation de la télécommande via SSH est très similaire à la télécommande via WS-MAN. Vous pouvez accéder directement au système distant avec la commande Invoke:

Invoke-Command -HostName W19DC01 -ScriptBlock {Get-Process}
richard@MANTICORE@w19dc01's password:

Vous obtiendrez une invite pour le mot de passe, qui ne sera pas affiché lorsque vous le tapez.

Si c’est la première fois que vous vous connectez au système distant via SSH, un message similaire s’affiche :

The authenticity of host 'servername (10.00.00.001)' can't be established.
ECDSA key fingerprint is SHA256:(<a large string>).
Are you sure you want to continue connecting (yes/no)?

Tapez yes et appuyez sur Entrée.

Vous pouvez créer une session de remoting :

$sshs = New-PSSession -HostName W19FS01
richard@MANTICORE@w19fs01's password:

Puis l’utiliser :

Invoke-Command -Session $sshs -ScriptBlock {$env:COMPUTERNAME}
W19FS01

Vous pouvez entrer une session de remoting OpenSSH en utilisant Enter-PSSession de la même manière qu’une session WS-MAN. Vous pouvez entrer une session existante ou utiliser le paramètre HostName sur Enter-PSSession pour créer la session interactive.

Vous ne pouvez pas déconnecter une session basée sur SSH ; c’est une technique WS-MAN.

Vous pouvez utiliser les sessions WS-MAN et SSH pour gérer plusieurs ordinateurs, comme le montre la figure 2.

Les informations de session montrent les différents mécanismes de transport – WS-MAN et SSH, respectivement – et le point de terminaison utilisé par chaque session.

Sessions de gestion à distance
Figure 2. Utilisez les sessions WS-MAN et SSH ensemble pour gérer les machines distantes.

Si vous regardez de près la figure 2, vous remarquerez qu’il n’y avait pas d’invite pour le mot de passe sur la session SSH car le système a été configuré avec une authentification basée sur une clé SSH.

À l’aide d’une authentification basée sur une clé SSH

Ouvrez une session PowerShell élevée. Changez l’emplacement pour le.dossier ssh dans votre espace utilisateur :

Set-Location -Path ~\.ssh

Générez la paire de clés :

ssh-keygen -t ed25519

Ajoutez le fichier de clés dans l’agent SSH sur la machine locale:

ssh-add id_ed25519

Une fois que vous avez ajouté la clé privée dans SSH-agent, sauvegardez la clé privée dans un emplacement sûr et supprimez la clé de la machine locale.

Copiez l’id_ed25519.fichier pub dans le.dossier ssh pour le compte utilisateur correspondant sur le serveur distant. Vous pouvez créer un tel compte si nécessaire:

$pwd = Read-Host -Prompt 'Password' -AsSecureString
Password: ********
New-LocalUser -Name Richard -Password $pwd -PasswordNeverExpires
Add-LocalGroupMember -Group Administrators -Member Richard

Sur la machine distante, copiez le contenu du fichier de clés dans le fichier authorized_keys:

scp id_ed25519.pub authorized_keys

Le fichier authorized_keys a besoin que ses autorisations soient modifiées:

  • Ouvrez l’Explorateur de fichiers, cliquez avec le bouton droit sur authorized_keys et accédez à Properties–Security–Advanced
  • Cliquez sur Désactiver l’héritage.
  • Sélectionnez Convertir les autorisations héritées en autorisations explicites sur cet objet.
  • Supprimez toutes les autorisations à l’exception du SYSTÈME et de votre compte utilisateur. Les deux devraient avoir un contrôle total.

Introduction à SSH avec PowerShell Core.

Vous verrez des références à l’utilisation du module OpenSSHUtils pour définir les autorisations, mais il y a un bogue dans la version de la galerie PowerShell qui rend le fichier authorized_keys inutilisable.

Redémarrez le service sshd sur la machine distante.

Vous pouvez maintenant vous connecter à la machine distante sans utiliser de mot de passe comme illustré à la figure 2.

Si vous vous connectez à une machine hors domaine à partir d’une machine du domaine, vous devez utiliser le paramètre UserName après avoir activé l’authentification par paire de clés:

$ss = New-PSSession -HostName W19ND01 -UserName Richard

Vous avez besoin du nom d’utilisateur sur la machine distante pour correspondre au nom d’utilisateur de votre domaine. Aucun mot de passe ne vous sera demandé.

Télécommande WS-MAN ou SSH ?

Devriez-vous utiliser la télécommande basée sur WS-MAN ou SSH ? WS-MAN remoting est disponible sur tous les systèmes Windows et est activé par défaut sur les versions de serveur Windows Server 2012 et ultérieures. WS-MAN remoting a quelques problèmes, notamment le problème du double saut. WS-MAN a également besoin de travail supplémentaire pour les systèmes distants vers des systèmes non domains.

Le remoting SSH n’est disponible que dans PowerShell Core ; Windows PowerShell est limité au remoting WS-MAN. L’installation et la configuration de la connexion à distance SSH nécessitent un travail considérable. La documentation n’est pas aussi bonne qu’elle doit l’être. Les avantages du remoting SSH sont que vous pouvez facilement accéder à des machines non domaines et à des systèmes non Windows où SSH est la norme pour l’accès à distance.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.