13/05/2024

AstucesPowerShell

Comment configurer l’administration à distance PowerShell via SSH ?

I. Présentation

Dans ce tutoriel, nous allons apprendre à établir une connexion PowerShell distante au travers du protocole SSH, entre deux machines sous Windows. PowerShell étant multi plateforme comme SSH, on peut imaginer appliquer cette configuration entre deux machines Linux, entre une machine Linux et une machine Windows, mais aussi avec macOS. Dans un document publié récemment, l'agence américaine NSA recommande l'utilisation du SSH pour l'administration à distance avec PowerShell, plutôt que d'utiliser WinRM. Le fait d'utiliser SSH permet d'utiliser l'authentification par clé et le support de différents systèmes, contrairement à WinRM qui nécessite la mise en place d'un certificat pour passer les connexions en HTTPS.

Je vais vous expliquer comment installer le serveur SSH, le client SSH, mais aussi comment configurer le serveur SSH pour faire du PowerShell SSH remoting. Nous verrons l'authentification par mot de passe, puis l'authentification par clé. Mon serveur SSH est la machine SRV-ADDS-01 sous Windows Server 2019 tandis que le client SSH est SRV-APPS sous Windows Server 2022 (mais il pourrait être sur une autre version, un autre système). Il est à noter que l'administration avec PowerShell au travers de SSH est une fonctionnalité disponible depuis PowerShell 7. Vous devez donc installer la bonne version de PowerShell, côté client et côté serveur, avant toute chose.

Précédemment, j'ai mis en ligne deux articles (et vidéos) au sujet de l'utilisation du SSH sur Windows :

II. Préparer le serveur SSH sur Windows

Sur le serveur SSH, je commence par installer OpenSSH Server grâce à cette commande PowerShell à exécuter en tant qu'administrateur :

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Une fois que c'est fait, il faut démarrer le service :

Start-Service sshd

Puis, on configure le service pour qu'il démarre automatiquement :

Set-Service -Name sshd -StartupType "Automatic"

Le fait de lancer le service va permettre de générer la configuration de base de SSH et de mettre en ligne le serveur SSH. Le fichier de configuration "sshd_config" est situé dans "C:\ProgramData\ssh" : nous allons le modifier.

cd c:\ProgramData\ssh
notepad .\sshd_config

Grâce au Bloc-notes de Windows, on peut modifier la configuration du serveur SSH. Pour le moment, autorisez la connexion par mot de passe en retirant le caractère "#" en début de ligne, car l'option est actuellement commentée.

PasswordAuthentication yes

Nous devons ajouter la prise en charge de PowerShell en l'intégrant en tant que sous-système, sinon il n'y a que quelques commandes qui vont fonctionner (non PowerShell). Vous devez ajouter cette nouvelle ligne à la suite de ces deux lignes :

# override default of no subsystems
Subsystem sftp sftp-server.exe

La ligne ci-dessous est celle que vous devez ajouter à votre fichier de configuration SSH. Si vous n'avez pas installé PowerShell dans son emplacement par défaut, il faudra adapter le chemin. Comme le précise Microsoft dans sa documentation, il faut utiliser un nom abrégé au format 8.3 puisque le nom contient des espaces.

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

Voilà, le fichier de configuration est prêt pour le moment. Libre à vous de le personnaliser un peu plus, pour changer le port d'écoute de SSH par exemple (attention à la règle de pare-feu Windows). Pour que la modification soit effective, il faut redémarrer le service SSH :

Restart-Service sshd

Maintenant, passons à la machine qui jouera le rôle de client SSH.

III. Préparer le client SSH sur Windows

Là encore, une commande PowerShell exécutée avec les droits administrateur permet d'installer le client OpenSSH :

Add-WindowsCapability -Online -Name OpenSSH.Client

Une fois que le client OpenSSH est installé, on peut utiliser la commande "ssh" pour se connecter sur un hôte distant, mais aussi New-PSSession et Enter-PSSession pour utiliser SSH au travers de PowerShell. Sur Windows 10 et Windows 11, le client SSH est préinstallé.

IV. Connexion PowerShell distante via SSH

Avec la commande "New-PSSession", je vais initier une session SSH vers mon serveur SRV-ADDS-01 en prenant un compte de mon domaine Active Directory. L'état de cette session sera stocké dans la variable $Session que l'on va pouvoir réutiliser.

$Session = New-PSSession -HostName SRV-ADDS-01 -UserName IT-Connect\admin.fb

Pour la première fois, il faut indiquer le mot de passe du compte, mais aussi accepter la connexion. Une fois que c'est fait, si l'on regarde le contenu de la variable $Session, on peut clairement voir que cette connexion PowerShell s'appuie sur le protocole SSH !

$Session

Pour se connecter dans cette session et administrer le serveur SRV-ADDS-01, on utilise "Enter-PSSession" et on appelle la variable $Session. À partir de là, le prompt change puisque l'on se retrouve connecté au serveur distant.

Enter-PSSession -Session $Session

Pour revenir sur l'hôte local :

exit

Plutôt que de se connecter à la session distante PowerShell, on peut simplement exécuter une commande PowerShell (ou un petit bloc de code) par l'intermédiaire du cmdlet Invoke-Command. Voici un exemple pour exécuter la commande "Get-Service sshd" sur l'hôte SRV-ADDS-01.

Invoke-Command -Session $Session -ScriptBlock { Get-Service sshd }

Pour terminer cet article, nous allons voir comment établir une connexion avec une clé publique.

V. Connexion SSH par clé publique sous Windows

 

A. Générer la paire de clés

Tout d'abord, sur le client SSH, c'est-à-dire le serveur SRV-APPS dans mon exemple, il faut configurer le service "ssh-agent". On va le paramétrer en démarrage automatique et le démarrer dans la foulée.

Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent

Ensuite, il faut que l'on génère un couple de clés pour l'authentification, afin d'obtenir une clé privée qui restera toujours en local sur le serveur et une clé publique qui sera copiée sur les serveurs sur lesquels on veut s'authentifier. L'utilitaire ssh-keygen va permettre de générer nos clés, et pendant ce processus, il faudra nommer les clés et définir une passphrase afin de protéger la clé privée.

cd ~\.ssh\
ssh-keygen -t ed25519

Une fois que c'est fait, toujours à partir du dossier "~\.ssh", on charge nos clés dans l'agent SSH :

ssh-add id_rsa

B. Envoyer la clé publique sur l'hôte distant

Maintenant, il faut que l'on interagisse avec le serveur cible, à savoir SRV-ADDS-01. Sur ce serveur, je veux me connecter avec le compte "[email protected]", donc il faut que j'envoie ma clé publique sur ce serveur. Première étape, créer un dossier ".ssh" dans le répertoire du profil de l'utilisateur sur le serveur distant :

ssh admin.fb@it-connect.local@srv-adds-01 mkdir C:\Users\admin.fb\.ssh\

Quand c'est fait, on va pouvoir envoyer le fichier "id_rsa.pub" correspondant à la clé publique vers le serveur SRV-ADDS-01, dans le fichier "authorized_keys". SSH se réfère à ce fichier pour obtenir la liste des clés publiques autorisées.

scp C:\users\Administrateur.IT-CONNECT\.ssh\id_rsa.pub admin.fb@it-connect.local@srv-adds-01:C:\Users\admin.fb\.ssh\authorized_keys

Pour cette première phase, nous avons eu recourt à l'authentification par mot de passe, car bien sûr il faut s'authentifier lors de l'usage des commandes "ssh" et "scp".

À partir de là, il nous reste encore à affiner la configuration du serveur SSH (SRV-ADDS-01).

C. Activer l'authentification par clé publique

Sur le serveur SSH, nous devons modifier le fichier de configuration de SSH :

cd c:\ProgramData\ssh 
notepad .\sshd_config

Dans ce fichier, activez l'authentification par clé publique :

PubkeyAuthentication yes

Puis, profitez-en pour désactiver l'authentification par mot de passe :

PasswordAuthentication no

Enregistrez le fichier et redémarrez le service SSH pour prendre en compte les changements.

Restart-Service sshd

Le serveur SSH est configuré et sur ce même serveur, le profil du compte "admin.fb" contient le fichier "authorized_keys". Il ne reste plus qu'à tester.

D. Connexion par clé SSH avec New-PSSession

Reprenons le principe utilisé précédemment avec la commande New-PSSession et la variable $Session. Sauf que cette fois-ci, nous devons ajouter le paramètre "IdentityFilePath" afin de préciser le chemin vers la clé (même si SSH peut trouver la clé comme un grand si elle est dans le répertoire par défaut). On précise aussi le nom de l'utilisateur pour que les deux correspondent (le bon fichier "authorized_keys" doit être lu).

Ce qui donne :

$Session = New-PSSession -HostName SRV-ADDS-01 -UserName IT-Connect\admin.fb -IdentityFilePath .\id_rsa

Grâce à cette nouvelle configuration, la connexion est établie sans même que l'on ait besoin de saisir le mot de passe du compte utilisateur ! La connexion est sécurisée puisque sans la clé privée, il est impossible de s'authentifier. Si l'on essaie de s'authentifier avec un autre compte non autorisé, un message d'erreur s'affiche :

New-PSSession: [srv-adds-01] The background process reported an error with the following message: The SSH client session has ended with error message: guy.mauve@IT-Connect@srv-adds-01: Permission denied (publickey,keyboard-interactive)..

Voilà, nous venons de voir comment utiliser une connexion SSH pour l'administration à distance PowerShell ! Pour en savoir plus sur la gestion des clés, vous pouvez lire cette documentation de Microsoft : Gestion des clés SSH.

author avatar
Florian BURNEL Co-founder
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.