L'objectif de l'article est simple : se connecter à un serveur SSH Linux depuis le terminal d'un PC sous Windows via une authentification par clé. Rien de complexe surtout depuis Windows 10. L'idée, c'est aussi de faire un peu de sécurité, nous utiliserons donc une paire de clé ECDH (courbe elliptique ed25519) avec un mot de passe.
Les pré-requis :
- avoir l'accès à la configuration SSH de votre serveur Linux
- version de Windows 10 minimale : 1809 (1909 à privilégier)
Techniquement, la partie Windows est sensiblement la même procédure qu'un PC sous Linux — les commandes sont les mêmes, les emplacements sont similaires.
Partie Windows
Assurez-vous d'avoir l'outil "OpenSSH client" dans votre Windows — pour ce faire, ouvrez les paramètres Windows > Applications > Fonctionnalités facultatives. Une liste vous affichera les outils déjà installés — si "OpenSSH client" n'y est pas, cliquez sur "Ajouter une fonctionnalité", recherchez "OpenSSH client" et cliquez sur "Installer". Pas besoin de redémarrer l'OS, l'outil sera disponible instantanément après l'installation.
Maintenant, ouvrez PowerShell et saisissez la commande "ssh-keygen" suivante :
ssh-keygen -t ed25519
Par défaut, la commande génère une paire de clé RSA. Avec l'attribut "-t ed25519", nous forçons la création d'une paire à courbe elliptique.
Saisissez un mot de passe fort — deux fichiers seront générés (id_ed25519 et id_ed25519.pub) dans le dossier ".ssh" à la racine du dossier utilisateur — exemple pour mon utilisateur : "C:\Users\jho\.ssh".
Veillez à sauvegarder ces deux fichiers sur différents supports — si vous perdez ces fichiers, vous ne pourrez plus vous connecter aux machines ayant le SSH configuré avec l'authentification par clé.
Windows n'a pas l'outil "ssh-copy-id", nous devrons donc créer les dossiers/fichiers/configurations sur les serveurs Linux concernés. Si vous êtes sous Linux, utilisez cette commande pour copier directement la clé publique dans le dossier utilisateur du serveur distant :
ssh-copy-id -i ./ssh/id_ed25519.pub utilisateur@serveurdistant
Partie Linux
J'utilise dans cette documentation les distributions Ubuntu et Debian. Pour rappel, Windows n'a pas la commande "ssh-copy-id", empêchant alors la création automatique du dossier .ssh. Dans un premier temps, connectez-vous avec le compte utilisateur que vous souhaitez utiliser pour l'authentification SSH par clé et effectuez les commandes ci-dessous (création du dossier, ajout des autorisations et création des fichiers nécessaires) :
umask 077 && test -d ~/.ssh || mkdir ~/.ssh
umask 077 && touch ~/.ssh/authorized_keys
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
Éditez le fichier ".ssh/authorized_keys" et ajoutez tout le contenu de votre fichier "id_ed25519.pub". Enregistrez et quittez le fichier.
Le service SSH doit être maintenant configuré — la configuration qui est décrite ci-dessous à but d'arrêter l'authentification de root (clé ou mot de passe) et de forcer l'authentification par clé SSH des utilisateurs. Entre-temps, j'en profiterai pour faire quelques configs pour du "hardening" du service. La plupart des options sont commentées dans le fichier — le fait d'enlever le dièse devant la ligne activera l'option. Ci-dessous un exemple de configuration SSH moins "open" avec des commentaires pour expliciter les lignes :
nano /etc/ssh/sshd_config
######
# configuration
Port 58961 #changement du port d'écoute SSH, pensez à le changer dans le parefeu
Protocol 2 #force la version 2 de SSH uniquement
HostKey /etc/ssh/ssh_host_ed25519_key
IgnoreRhosts yes
# un peu de log
SyslogFacility AUTH
LogLevel INFO
# restrictions diverses (pas bloquantes non plus)
LoginGraceTime 10m #couper automatiquement la connexion après 10 minutes d'inactivité
PermitRootLogin no #empêcher root de s'authentifier via ssh
StrictModes yes
MaxAuthTries 6 #nombre maximal de tentative avant blocage du compte
MaxSessions 2 #nombre de connexion max en simultané
# forcer l'authentification par clé
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys #emplacement du fichier de clé publique, doit être le même pour tous les utilisateurs concernés
PasswordAuthentication no #bloquer l'authentification par mot de passe
PermitEmptyPasswords no #empêcher les mots de passe vide
UsePAM no
ChallengeResponseAuthentication no
# configurations diverses
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
PrintMotd no
VersionAddendum none #masque quelques infos publiques concernant le service SSH
Enregistrez les modifications — redémarrez le service (systemctl restart sshd) et testez une connexion SSH depuis votre PC Windows comme ceci (ajoutez "-p n°_du_port" si vous avez modifié la ligne "Port" dans le sshd_config) :
ssh utilisateur@serveurdisant
ssh -p n°_du_port utilisateur@serveurdisant
Le mot de passe de la clé SSH devra être saisi — si votre configuration est correcte, vous devrez dès à présent être connecté en SSH sur votre serveur.