I. Introduction

Cela fait déjà de nombreuses années que l’authentification par mot de passe sur un service SSH est considérée comme problématique. Elle est sensible à de nombreuses attaques : MiTM, attaques par force brute ou par dictionnaire, keylogger notamment.

Ainsi, il est fortement recommandé de mettre en place une authentification forte à l’aide d’une paire de clés. Cette solution est efficace mais elle repose avant tout sur la clé privée qui doit être conservée jalousement et ne doit pas être dérobée par une personne malveillante. Cette clé est par ailleurs généralement stockée sur le disque dur du poste client (.ssh/id_*).

Depuis la sortie d’OpenSSH 8.2 en février 2020, il est possible de renforcer la sécurité dans l’utilisation de cette paire de clés à l’aide de la norme FIDO 2. Ainsi, un attaquant devra dérober une première clé (handle private key) servant à générer (dérivation) la clé privée SSH mais également avoir un accès physique à la clé de sécurité matérielle comme la yubikey par exemple.

II. Mise en oeuvre

a. Préambule

Il existe deux méthodes de sécurisation FIDO2 possibles :

  • Le mode “résident” qui permet de stocker la clé (handle private key) nécessaire à la génération de la clé privée dans la clé de sécurité matérielle. L’avantage de cette méthode est qu’elle permet de s’authentifier à partir de différents clients. Par contre, il est indispensable de mettre en place un code PIN autorisant l’accès à la “handle private key” ainsi qu’une solution de secours en cas de perte ou de vol de le clé de sécurité physique.
  • Le mode “non résident” ou partagé qui impose la présence d’un fichier sur le client (~/.ssh/id_*_sk) et de la clé de sécurité matérielle pour être en mesure de générer la clé privée nécessaire à l’authentification sur le serveur SSH. L’avantage de cette méthode est que seul le client disposant du fichier id_*_sk sera en mesure de s’authentifier.

b. Schéma concernant le mode résident

Fido2 SSH

c. Paramétrage sur le client

Dans le cas présent, nous allons configurer l’authentification avec la méthode “résident”.

bilbo@comte:~$ ssh-keygen -t ed25519-sk -O resident -O application=ssh:bilbo -O verify-required

Dans le cas présent, la clé privée sera stockée dans la clé de sécurité physique elle-même grâce au paramétre -O resident.

  • Le paramétre -O application=ssh: permet d’utiliser un slot particulier sur la clé de sécurité.
  • Le paramètre -O verify-required oblige l’utilisateur à utiliser un code PIN et à toucher la clé de sécurité pour y avoir accès. Ce paramètre est donc important pour renforcer la sécurité.

d. Paramétrage sur le serveur

La première étape consiste à transférer notre clé publique SSH générée sur le client (~/.ssh/id_*_sk.pub) sur le serveur SSH.

bilbo@comte:~$ ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub bilbo@fondcombe.middleearth.fr

La seconde consiste à nous assurer que le serveur supporte ce format de clés SSH (version d’OpenSSH >= 8.2 pour le mode non résident et OpenSSH >= 8.3 pour le mode résident).

elrond@fondcombe:~$ sudoedit /etc/ssh/sshd_config

Il faut ajouter la ligne suivante dans le fichier /etc/ssh/sshd_config puis redémarrer le service OpenSSH.

PubkeyAcceptedKeyTypes ssh-ed25519,sk-ssh-ed25519@openssh.com
elrond@fondcombe:~$ sudo systemctl restart ssh

e. Test de connexion SSH depuis le client

Insérer la clé de sécurité sur le poste client. Ouvrir un terminal et taper la commande :

bilbo@comte:~$ ssh bilbo@fondcombe.middleearth.fr
Confirm user presence for key ED25519-SK SHA256:
Enter PIN for ED25519-SK key /home/bilbo/.ssh/id_ed25519_sk:
User presence confirmed
Linux fondcombe 5.10.0-13-amd64 #1 SMP Debian 5.10.106-1 x86_64
bilbo@fondcombe:~$

Il faudra alors rentrer le code PIN puis toucher la clé pour pouvoir accéder à son contenu. L’authentification est valide, l’accès SSH opérationnel.

III. Conclusion

Cette méthode permet de renforcer la sécurité de l’authentification par clés SSH sur un serveur. Elle sera d’autant plus pertinente dans des environnements sensibles tout en respectant l’état de l’art.

Si vous n’avez pas de clé de sécurité matérielle, vous pouvez vous en procurer une auprès de Yubico ou Nitrokey par exemple.

Sources

https://developers.yubico.com/SSH/Securing_SSH_with_FIDO2.html

https://wonderfall.dev/openssh-fido2/

https://blog.maxds.fr/ssh-with-yubikey/