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.