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 :
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.
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é.



