Installer et se connecter à une machine Windows avec OpenSSH

Ces derniers temps je travaille sur pas mal de portage d'applications sous Windows (et macOS, mais c'est pas le sujet du jour). Quand je développe des applications pour des OS différents de Linux, le workflow le plus confortable pour moi est le suivant :

  • Je fais l'essentiel du travail sur ma machine Linux : il s'agit de l'environnement que je maitrise le mieux et sur lequel j'ai mes habitudes et tous les logiciels dont j'ai besoin.
  • Puis, au moment où j'ai besoin de tester mon code sous Windows, je copie les fichiers de mon projet sur ma machine Windows à l'aide de la commande scp.
  • Et enfin je lance la compilation et mon logiciel en ligne de commande à travers une connexion SSH.

Bon dans les faits j'ai un petit script qui reprend toutes ces étapes pour pas avoir à me taper les diverses commandes à la main. 😉️

Aujourd'hui on va donc voir comment installer et configurer un serveur OpenSSH sous Windows.

Vous l'aurez compris, cet article est avant tout un mémo pour moi-même, par ce que j'en ai marre de faire les mêmes recherches en boucle, et de tomber à chaque fois sur plein de sites douteux et plein de pubs avec la moitié des infos manquantes... 😅️

Note

NOTE : Cet article n'est pas une introduction à OpenSSH : je pars du principe que vous êtes déjà un minimum familiers avec SSH.

Je vais par exemple aborder la connexion par clef, mais je n'expliquerai pas comment générer une paire de clefs. Vous trouverez en bas de l'article des liens vers des documentations complémentaires si vous avez besoin de plus de précisions sur certains points. 🙂️

Installer le serveur OpenSSH

Pour installer OpenSSH sous Windows, il faut commencer par ouvrir un terminal PowerShell en tant qu'administrateur.

Normalement quand vous avez un terminal administrateur, c'est écrit dessus, mais ça peut également être vérifié à l'aide de la commande à rallonge (merci PowerShell 🙃️) suivante :

(New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Si vous êtes administrateur, la commande retournera "True", et dans le cas contraire elle retournera "False". En pratique cette vérification est surtout utile si vous développez un script. 🙂️

On peut ensuite vérifier si OpenSSH est déjà installé sur la machine ou pas à l'aide de cette commande :

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

Ce qui vous donnera un résultat similaire à celui-ci :

Name  : OpenSSH.Client~~~~0.0.1.0
State : NotPresent

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

Ici on peut voir que je n'ai ni le serveur ni le client OpenSSH d'installés ("State: NotPresent"). Si ça avait été le cas, l'état serait "Installed".

Et maintenant, il ne nous reste plus qu'à installer le serveur OpenSSH à l'aide de la commande suivante (oui oui, il faut bien taper 4 tildes dans la commande... 🙃️) :

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Capture d'écran de l'installation du serveur OpenSSH via PowerShell dans une fenêtre de Windows Terminal

Installation du serveur OpenSSH en cours dans un terminal PowerShell

Vous pouvez également installer le client si vous en avez besoin avec la commande :

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

Démarrer le service / démarrage automatique

Maintenant que le service est installé, il ne nous reste plus qu'à le lancer. En effet le serveur OpenSSH ne se lance pas tout seul après l'installation, et il n'est d'ailleurs pas configuré pour se lancer automatiquement au démarrage de la machine non plus.

Pour démarrer le service, entrez la commande suivante dans votre terminal PowerShell administrateur :

Start-Service sshd

Et si vous souhaitez qu'il se lance automatiquement au démarrage, vous pouvez le configurer à l'aide de la commande suivante :

Set-Service -Name sshd -StartupType 'Automatic'

Vous pouvez également faire tout ça de manière graphique via le gestionnaire de service de Windows :

  • Faites "<Touche Windows> + R" et entrez "services.msv",
  • Cherchez la ligne concernant le serveur OpenSSH et éditez ses paramètres suivant vos besoins.
Capture d'écran de l'édition des paramètres du service OpenSSH à l'aide du gestionnaire de services Windows

Se connecter à la machine

À présent vous pouvez vous connecter à la machine de manière classique :

ssh <USER>@<MACHINE>             # Utilisateur local
ssh <DOMAIN>\\<USER>@<MACHINE>   # Machine faisant parti d'un domaine

Par exemple :

ssh User@192.168.1.42

Si tout s'est bien passé, SSH devrait vous demander de confirmer que vous faites bien confiance à la machine (à la première connexion uniquement), répondez-lui « yes », puis il vous demandera ensuite votre mot de passe (celui de l'utilisateur Windows).

Note

NOTE : Le nom d'utilisateur n'est pas sensible à la case sous Windows.

Configurer une clef SSH pour se connecter à la machine

À présent que tout fonctionne, on va voir comment configurer sa clef SSH pour se connecter à la machine sans avoir à taper son mot de passe à chaque fois.

La procédure diffère un peu suivant que l'utilisateur avec lequel vous vous connectez est administrateur de la machine ou non, mais pas de panique, je vais aborder les deux situations ! 😉️

Utilisateur standard

Si vous souhaitez vous connecter avec un utilisateur standard (qui n'est pas administrateur), ouvrez un terminal PowerShell en tant que cet utilisateur.

Il faut ensuite créer le dossier "C:\Users\<USER>\.ssh" s'il n'existe pas déjà. Cela peut être fait à l'aide de la commande suivante :

New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh

Puis on va créer un fichier "authorized_keys" dans ce dossier à l'aide de la commande suivante :

New-Item -ItemType File -Path $env:USERPROFILE\.ssh\authorized_keys

Et enfin on va l'ouvrir avec un éditeur de texte et y coller notre clef SSH publique :

notepad.exe $env:USERPROFILE\.ssh\authorized_keys

Enregistrez le fichier.

À présent vous devriez pouvoir vous connecter à la machine sans avoir à entrer le mot de passe.

Utilisateur administrateur

Si l'utilisateur avec lequel vous souhaitez vous connecter est administrateur de la machine, la clef publique doit être configurée à un endroit différent, et il faudra également modifier les permissions du fichier pour que tout fonctionne.

Commencez par ouvrir un terminal PowerShell administrateur, puis créez le fichier "<PROGRAMDATA>\ssh\administrators_authorized_keys" à l'aide de la commande suivante :

New-Item -ItemType File -Path $env:ProgramData\ssh\administrators_authorized_keys

Éditez ensuite ce fichier à l'aide de Notepad.exe ou de votre éditeur favoris :

notepad.exe $env:ProgramData\ssh\administrators_authorized_keys

Et ajoutez-y votre clef SSH publique puis enregistrez le fichier.

Il ne reste plus qu'à définir correctement les permissions du fichier... Et c'est là que ça se complique (un peu). En effet, la commande exacte va dépendre de la langue du système.

Si votre système est en anglais, vous pouvez utiliser la commande suivante :

icacls.exe "$env:ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

Si comme moi, votre système a été installé en français, la commande devient :

icacls.exe "$env:ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrateurs:F" /grant "SYSTEM:F"

Et si votre système est dans une autre langue... Et bah faudra que vous adaptiez vous-même en replaçant le nom du groupe "Administators" par celui correspondant dans votre langue. 😅️

Si tout s'est bien déroulé, la commande devrait vous retourner quelque chose de similaire à ceci :

1 fichiers correctement traités ; échec du traitement de 0 fichiers

Dans le cas contraire, il indiquera que les fichiers n'ont pas pu être traités :

0 fichiers correctement traités ; échec du traitement de 1 fichiers

Vous devriez à présent être en mesure de vous connecter à la machine en utilisant votre clef SSH au lieu d'un mot de passe ! 😁️

Utilisation de SCP pour copier des fichiers

Comme je l'ai évoqué en introduction, j'utilise SCP pour copier des fichiers entre ma machine Linux et ma machine Windows. Il n'y a rien de bien particulier à en dire par rapport à une utilisation classique de Linux à Linux ; il faut juste remplacer les backslashes ("\") des chemins Windows par des slashes ("/") pour que ça marche :

scp User@192.168.1.42:C:/Users/User/Desktop/hello.txt ./hello.txt

Et voilà !

L'installation d'un serveur SSH sous Windows me facilite grandement la vie et me fait gagner pas mal de temps au quotidien. Cela me permet également de provisionner des machines Windows avec Ansible (je pourrai éventuellement aborder ce sujet dans un autre article si cela vous intéresse).

Pour terminer, je vous mets le lien de la doc officielle de Microsoft qui est assez complète ainsi que celle d'OpenSSH :

En espérant que cet article ait pu vous être utiles, je vous souhaite une bonne journée ! 🙂️