Installation et configuration de OpenSSH en 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  :

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 :

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 :

Path          :
Online        : True
RestartNeeded : False

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

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

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 :

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 :

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 :

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 :

Set-Service sshd -StartupType Automatic

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

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 :

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 :

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

Pour accéder au script depuis l’utilisateur :

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.

Set-ExecutionPolicy -Scope CurrentUser

Il faut désormais ajouter :

RemoteSigned

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

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 :

function sshserver1 { ssh "user@ip"}

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

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) :

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 :

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) :

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 :

 notepad.exe "C:ProgramDatasshsshd_config"

Voici mon fichier de configuration sshd_config :

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  :

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.