Activer la connexion par clé SSH sur un serveur Linux
Par Erwan C.
Le 19.11.2024
Introduction
Afin de faire du password-less en toute sécurité (ou mettre en place une 2auth), et restreindre au mieux vos accès, l'utilisation de clés SSH pour se connecter à distance sur vos serveur est le moyen incontournable,
Ici nous allons voir comment mettre en place une authentification sans mot de passe sécurisée sur l'infra suivante :
- Un serveur Debian qui sera le serveur distant où l'on souhaite se connecter
- Un client Linux Fedora
- Un client Windows 11
J'ai choisi volontairement deux clients différent afin de montrer comment faire sur les deux OS.
Pré-requis :
L'accès à la commande ssh-keygen, soit :
- OpenSSH installé sur votre Linux
- Sur Windows, le client SSH par défaut permet d'effectuer un SSH keygen
Génération des clés SSH (SSH et Windows)
Ici, rien de bien sorcier, si vous n'avez pas de clé SSH générée sur votre PC (ce qui est probablement le cas), on va entrer la commande suivante :
ssh-keygen -t ed25519 -C "mail@it-discover.fr"
Ici, on spécifie ed25519, mais on pourrait très bien choisir un autre format (RSA par exemple )
ssh-keygen -b 4096 -t rsa -C "mail@it-discover.fr"
Une fois la commande entrée, on peut garder le nom par défaut, ou indiquer un chemin et nom différent de fichier, ici on va appeler là clé 'test' :
Ensuite, le prompt nous demande une passphrase. Vous n'êtes pas obligé d'en utiliser une, mais c'est toujours mieux en termes de sécurité.
Vous devriez avoir ce résultat :
Et maintenant si vous vous rendez dans le dossier de création (ici: C:\Users\erwan/.ssh
) vous devriez voir vos deux fichiers, la clé privée et la clé publique :
Précision : La clé privée ne doit absolument jamais être publié ou accessible par quelqu'un d'autre que vous, il faut voir ça comme la clé d'un coffre fort. Si celle-ci est divulguée, il vous faudra de toute urgence supprimer la clé publique des sites / machines où elle a été installée.
Envoi de la clé sur le serveur
Il faut faire connaître votre clé publique au serveur afin de lui permettre de gérer l'authentification avec celle-ci, donc pour se faire, deux possibilités :
- Sur ma machine Fedora :
ssh-copy-id [votre_utilisateur]@[ip_du_ serveur]
- Sur Windows :
cat ~/.ssh/id_test.pub | ssh [votre_utilisateur]@[ip_du_serveur] 'mkdir -p ~/.ssh && cat >> .ssh/authorized_keys'
(Remplacez bien sur id_test.pub par votre clé publique)
Sinon vous pouvez simplement copier le contenu de votre id_test.pub
dans le fichier .ssh/authorized_keys de votre utilisateur du serveur (il ne sera pas forcément créé par défaut, vous pouvez le faire avec touch .ssh/authorized_keys
).
Peu importe la méthode, le contenu du fichier ressemblera à ça à la fin :
Se connecter avec le client
Vous pouvez dès maintenant vous connecter en précisant la clé avec l'option -i et cela va fonctionner. Vous devrez entrer votre passphrase pour vous connecter si vous en avez définit un :
ssh -i ~\.ssh\id_test.pub[votre_utilisateur]@[ip_du_serveur]
Cependant cela indique de préciser la clé SSH à chaque fois, et ici on cherche la rapidité.
Utilisation automatique de la clé SSH
Windows
Ouvrez un Powershell en adminstrateur et entrer les commandes suivantes pour démarrer le service d'agent SSH :
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
Start-Service ssh-agent
Il vous faudra après ajouter votre clé privée à l'agent :
ssh-add ~/.ssh/id_test
Linux
Sur Linux, vous devez démarrer l'agent comme sur Windows, mais cette fois avec la commande suivante :
eval "$(ssh-agent -s)"
Puis on ajoute la clé privée :
ssh-add ~/.ssh/id_test
Résultat de la connexion automatique
Maintenant vous pouvez réessayer de vous connecter avec une commande SSH classique et vous pourrez vous connecter sans préciser votre mot de passe :
Désactiver les connexions par mot de passe pour les utilisateurs ayant des clés SSH
Vous voulez potentiellement restreindre vos utilisateurs principaux pour qu'ils n'utilisent pas leur password, cependant si vous avez plusieurs utilisateurs, vous en avez probablement qui ne peuvent pas / n'ont pas l'utilité d'avoir de clé SSH. On va apprendre ici à bloquer les connexions par mot de passe pour les utilisateurs ayant des clés SSH configurées.
Nativement, SSH ne permet pas de gérer ce point. Il y a plusieurs moyen de contournement, mais pour moi le plus propre est d'utiliser des groupes. On va créer un groupe additionnel qui contiendra nos utilisateur utilisant une clé SSH.
Pour se faire, rendez-vous sur le serveur et créez un groupe avec la commande suivante :
sudo groupadd passwordless
Ajoutez ensuite l'utilisateur souhaité :
sudo usermod -a -G passwordless erwanc
Remplacez passwordless par le nom de groupe souhaité
Maintenant que ceci est fait, il faut préciser au serveur SSH de gérer ce fonctionnement. Pour se faire, rendez-vous dans le fichier de configuration du serveur :
vim /etc/ssh/sshd_config
Ou pour plus de maintenabilité, je recommande de créer un fichier de configuration séparé qui va "étendre" la configuration initiale :
mkdir /etc/ssh/sshd_config.d/
vim /etc/ssh/sshd_config.d/custom_auth.conf
Si vous choisissez la seconde méthode, ouvrez avec vim le fichier /etc/ssh/sshd_config et insérer la directive suivante :
Include /etc/ssh/sshd_config.d/*.conf
Dans le nouveau fichier ouvert (ou dans /etc/ssh/sshd_config selon votre choix), entrez tout à la fin les directives suivantes :
# Activer l'authentification possible par clé pour tous
PubkeyAuthentication yes
# Désactiver l'authentification par mot de passe pour les membres du groupe
Match Group passwordless
PasswordAuthentication no
Remplacez passwordless par le nom de groupe précédemment créé
Enfin, il vous suffit de redémarrer le service pour voir la magie opérer :
sudo systemctl restart sshd