Installation et configuration de OpenSSH en PowerShell

Découvrez comment installer et gérer OpenSSH sous Windows. La version 1809 de Windows affiche une version stable de OpenSSH.

Jérémie KassianoffÉquipe Cybernetics 6 min de lecture
Installation et configuration de OpenSSH en PowerShell

Cas d'usage concret

Vous devez administrer un serveur Windows en SSH plutôt qu'en RDP : voici comment installer et gérer OpenSSH via PowerShell.

Installation et configuration de OpenSSH en PowerShell

Le protocole de communication sécurisé SSH est devenu incontournable sur système BSD et GNU/LINUX, son histoire remonte au milieu des années 90. Microsoft est parvenu, en 2017 à intégrer le support natif du protocole SSH (beta) sur Windows. En 2018, grand soulagement la version OpenSSH est désormais stable depuis la build 1809 de Windows.

Avec l’externalisation grandissante des systèmes d’informations, Microsoft fait la promotion des technologies libres dans leurs produits propriétaires. Il est aujourd’hui possible de se connecter à une machine Windows en utilisant le protocole de communication SSH. Dans l’article suivant, nous utilisons le client OpenSSH dans Windows 10 et le serveur OpenSSH dans Windows Server 2019 avec une paire de clé et nous découvrirons également les alias PowerShell.

Installation du client/serveur OpenSSH

L’ensemble des étapes seront réalisées en PowerShell en tant qu’administrateur. Dans le cas d’un poste sous Windows 10 ou d’un serveur Windows 2019, il est possible de vérifier l’état de la fonctionnalité OpenSSH  :

powershell
Get-WindowsCapability -Online | ? Name -like "OpenSSH*"

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

Actuellement, la fonctionnalité est disponible dans un état notPresent pour installer le client ou le serveur OpenSSH :

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

Une fois l’installation de la fonctionnalité Windows faite, le résultat est le suivant :

bash
Path          :
Online        : True
RestartNeeded : False

Aucun redémarrage n’est nécessaire, nous allons désormais faire un test du client SSH en PowerShell :

bash
ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]

Le client fonctionne, nous retrouvons les fichiers sources à l’emplacement suivant C:WindowsSystem32OpenSSH

bash
ls C:WindowsSystem32OpenSSH

Répertoire : C:WindowsSystem32OpenSSH

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       05/09/2018     16:07         322560 scp.exe
-a----       05/09/2018     16:07         390144 sftp.exe
-a----       05/09/2018     16:07         491520 ssh-add.exe
-a----       05/09/2018     16:07         384512 ssh-agent.exe
-a----       05/09/2018     16:07         637952 ssh-keygen.exe
-a----       05/09/2018     16:07         530432 ssh-keyscan.exe
-a----       05/09/2018     16:07         882688 ssh.exe

Le serveur OpenSSH utilise un service dédié, l’état des services SSH annonce :

bash
Get-service ssh*

Status   Name               DisplayName
------   ----               -----------
Stopped  ssh-agent          OpenSSH Authentication Agent
Stopped  sshd               OpenSSH SSH Server

Pour lancer le service SSHD et SSH-agent :

bash
net start sshd
The OpenSSH SSH Server service is starting..
The OpenSSH SSH Server service was started successfully.

net start ssh-agent
Le service OpenSSH Authentication Agent démarre.
Le service OpenSSH Authentication Agent a démarré.

Vérifions que les services sont bien démarrés :

bash
Get-service ssh*

Status   Name               DisplayName
------   ----               -----------
Running  ssh-agent          OpenSSH Authentication Agent
Running  sshd               OpenSSH SSH Server

Nous allons ajouter le démarrage automatique à notre service SSH :

powershell
Set-Service sshd -StartupType Automatic

Également au service de contrôle des clés publiques, afin de pouvoir utiliser ssh-add.exe ultérieurement :

bash
Set-Service ssh-agent -StartupType Automatic

Le client et le server OpenSSH sont installés sur la machine Windows. Il est possible de faire un test de connexion :

bash
ssh user@ip

Configuration d’alias SSH dans PowerShell

Dans le cas d’un nombre important de connexions SSH, il peut être indispensable d’utiliser des alias dans PowerShell.
Pour cela, il faut configurer un profil à notre invite de commande PowerShell et autoriser l’execution de script PS1 :

bash
new-item $PROFILE.CurrentUserAllHosts -ItemType file -Force

Pour accéder au script depuis l’utilisateur :

bash
ise $PROFILE.CurrentUserAllHosts

Un message d’avertissement apparaît car par défaut la stratégie de groupe s’applique sur l’exécution des scripts. Afin de pouvoir lire notre script : profile.ps1, il faut changer la valeur à non restreint.

powershell
Set-ExecutionPolicy -Scope CurrentUser

Il faut désormais ajouter :

bash
RemoteSigned

Il faut executer de nouveau la commande pour accéder au script depuis l’utilisateur :

bash
ise $PROFILE.CurrentUserAllHosts

Un nouveau dossier est présent dans Mes documents ainsi qu’un script profile.ps1. Editons-le avec un éditeur de texte ou l’éditeur PowerShell ISE afin d’ajouter un alias SSH :

bash
function sshserver1 { ssh "user@ip"}

Il est également possible d’utiliser la redirection de port comme ceci (ex : vnc) :

bash
function sshvncserver1 {ssh -L "localhost:5900:localhost:5900" "user@ip"}

Générer une paire de clé SSH dans PowerShell

L’authentification par paire de clé est une méthode recommandée, par défaut le dossier qui la contient se trouve dans l’emplacement personnel de votre utilisateur : ~.ssh . Si il n’existe pas il faut gérérer une paire de clé SSH (ex : ecdsa) :

bash
ssh-keygen -t ecdsa -b 521
Generating public/private ecdsa key pair.
Enter file in which to save the key (C:Usersmonuser/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:Usersmonuser/.ssh/id_ecdsa.
Your public key has been saved in C:Usersmonuser/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:tryXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX mondomainemonuser@nondns
The key's randomart image is:
+---[ECDSA 521]---+
|                 |
|                 |
|.        .       |
|X.  . ... .      |
|.X. .XXXXx       |
|x .#.X-X.*.      |
|. ..X)+&XX       |
| . X .-.X.       |
|  . .  ...       |
+----[SHA256]-----+

Il faut désormais ajouter la clé privée à notre serveur SSH :

bash
ssh-add.exe .id_ecdsa 
Enter passphrase for .id_ecdsa: 
Identity added: 
.id_ecdsa (.id_ecdsa)

Pour transférer une clé publique SSH depuis notre client vers notre serveur (en écoute sur le port ex : 2222) :

bash
scp -P 2222 C:Usersmonuser.sshid_ecdsa.pub mondomaineuser@ip:C:Usersmonuser.ssh/authorized_keys

Une fois la copie terminée, il est possible de se connecter avec notre clé SSH vers le serveur Windows.

Configuration du serveur OpenSSH en PowerShell

Les possibilités de configuration d’un serveur SSH Windows sont limitées, comme l’explique le wiki : non supportées.
En PowerShell, exécutons la commande suivante afin d’éditer le fichier de configuration du serveur OpenSSH :

bash
 notepad.exe "C:ProgramDatasshsshd_config"

Voici mon fichier de configuration sshd_config :

bash
Port 2222
ListenAddress 192.168.0.2
PubkeyAuthentication yes
AuthorizedKeysFile    .ssh/authorized_keys
PasswordAuthentication no
Subsystem    sftp    sftp-server.exe
DenyUsers mondomain.local*
Match Group administrators
       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

Il peut être nécessaire d’ajouter une règle de pare-feu pour autoriser l’accès en SSH  :

powershell
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Service sshd -Enabled True -Direction Inbound -Protocol TCP -Action Allow -Profile Domain

Name                  : sshd
DisplayName           : OpenSSH Server (sshd)
Description           :
DisplayGroup          :
Group                 :
Enabled               : True
Profile               : Domain
Platform              : {}
Direction             : Inbound
Action                : Allow
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False
Owner                 :
PrimaryStatus         : OK
Status                : La règle a été analysée à partir de la banque. (65536)
EnforcementStatus     : NotApplicable
PolicyStoreSource     : PersistentStore
PolicyStoreSourceType : Local

L’installation et la configuration de OpenSSH en PowerShell sont terminées.

Conclusion

J'ai présenté ici l'installation et la configuration du client et du serveur OpenSSH nativement disponibles depuis la build 1809 de Windows, entièrement pilotées en PowerShell. La mise en place d'alias de connexion, la génération d'une paire de clés SSH et le paramétrage du fichier sshd_config permettent d'obtenir un usage de SSH sous Windows proche de celui de Linux. Cette évolution facilite grandement l'administration de parcs mixtes Windows/Linux via un protocole de connexion unique et sécurisé.

Jérémie Kassianoff

Équipe Cybernetics

Voir son profil

À lire ensuite

Assurer un score d'exposition de 0% avec Microsoft Defender Vulnerability Management
Microsoft

Assurer un score d'exposition de 0% avec Microsoft Defender Vulnerability Management

Lire l'article
Reprenez le contrôle de vos annuaires Microsoft avec l'approche Infrastructure as Code
Microsoft

Reprenez le contrôle de vos annuaires Microsoft avec l'approche Infrastructure as Code

Lire l'article
Installation et configuration d’Azure Active Directory Connect
Microsoft

Installation et configuration d’Azure Active Directory Connect

Lire l'article