OpenSSH et FIDO/U2F  : exigez une clé de sécurité pour la connexion à vos serveurs

OpenSSH et FIDO/U2F  : exigez une clé de sécurité pour la connexion à vos serveurs

Une procédure à répandre !

Avatar de l'auteur
David Legrand

Publié dans

Internet

05/05/2020 9 minutes
35

OpenSSH et FIDO/U2F  : exigez une clé de sécurité pour la connexion à vos serveurs

Mi-février, la version 8.2 d'OpenSSH voyait le jour et apportait une nouveauté importante : la possibilité de créer une paire de clés publique/privée nécessitant la présence d'une clé de sécurité pour qu'elle soit considérée comme valide, et permette la connexion à un serveur. Voici comment procéder.

Si la connexion sans mot de passe est une tendance « hype » dans les services en ligne, elle n'a rien de nouveau pour les administrateurs de serveurs. Mais plutôt que de reposer sur des solutions telles que des liens envoyés par email contenant un jeton temporaire ou des notifications sur smartphone, cela passe par une bonne vieille paire de clés publique/privée.

On peut ainsi accéder au terminal d'un serveur via OpenSSH sans avoir le moindre mot de passe à taper. Le serveur doit connaître la clé publique associée à une clé privée disponible sur la machine de l'utilisateur pour que cela fonctionne. Il reste tout de même possible d'ajouter une phrase de passe pour renforcer la sécurité, à la mode « ceinture bretelle »

Ainsi si le mot de passe est diffusé dans une fuite ou découvert, l'accès au serveur n'est pas compromis. Même chose si le fichier de la clé privée est récupéré par un acteur malveillant. Il faut disposer des deux pour assurer un accès. Avec la montée en puissance des clés de sécurité, leur intégration à OpenSSH et à ses mécaniques de connexion était attendue.

Pendant longtemps, il fallait bidouiller pour arriver à quelque chose d'à peu près exploitable. Fort heureusement, le travail sur des standards tels que FIDO a fini par payer : il est supporté dans la version 8.2 d'OpenSSH. Présente sur certaines distributions mettant rapidement leurs outils à jour, elle est désormais largement exploitable sous Linux.

Un point important, car pour profiter de cette nouveauté il faut que le client et le serveur soient à jour. Par contre, ne comptez pas en profiter sous Windows pour le moment, le portage n'a pas encore été effectué.

Créer une paire de clés, se connecter à un serveur

Tout d'abord, commençons par la base : comment se connecter à un serveur via OpenSSH ? Si vous savez déjà comment faire, passez à la suite. Sinon, voici quelques explications avec l'exemple le plus simple qui existe : celui d'un service de type Cloud. Pour nos tests du jour, nous nous reposerons sur l'offre de Scaleway dont l'interface est simple en la matière.

Commençons par créer une paire de clés publique/privée. Cela peut passer par l'outil intégré à votre système ou à d'autres comme PuttyGen sous Windows par exemple. Nous utilisons le classique ssh-keygen :

ssh-keygen -b 4096
ssh-keygen -t ecdsa -b 521
ssh-keygen -t ed25519

Ces trois commandes initient la création d'une paire de clés RSA (4096 bits), ECDSA (521 bits) ou ED25519. L'interface vous demandera alors de préciser un emplacement et un nom de fichier (scaleway dans notre exemple) et une phrase de passe à taper deux fois qui n'est pas obligatoire :

Generating public/private rsa key pair.
Enter file in which to save the key (/home/davlgd/.ssh/id_rsa): (/home/davlgd/.ssh/scaleway
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/davlgd/.ssh/scaleway.
Your public key has been saved in /home/davlgd/.ssh/scaleway.pub.

Comme le précise le texte ci-dessus, deux fichiers sont alors créés, par défaut dans le dossier caché .ssh de votre compte utilisateur. Sinon dans celui que vous avez indiqué. La pratique est la même, que ce soit sous Linux ou Windows. Vous pouvez dès le départ préciser l'emplacement final de vos clés de la sorte : 

ssh-keygen -b 4096 -f /home/davlgd/.ssh/scaleway

Le premier fichier (sans extension) contient la clé privée qui est une suite de caractères devant rester secrète. C'est pour cela qu'on l'accompagne en général d'une phrase de passe. L'autre ficher (avec une extension.pub) est la clé publique, qui n'a pas besoin d'être spécialement protégée. Au contraire, elle doit être transmise au serveur auquel on veut se connecter.

Pour cela, il faut tout d'abord en afficher le contenu : 

cat /home/davlgd/.ssh/scaleway.pub  // sous Linux
type /home/davlgd/.ssh/scaleway.pub // sous Windows

Dans le cas d'un service en ligne tel que Scaleway, il faut ensuite se rendre dans la section Credentials de l'interface utilisateur (qui est en anglais uniquement, malheureusement). Cliquez sur Add a news SSH Key, collez ensuite le contenu dans la partie principale. Indiquez un nom pour savoir à quelle machine elle correspond et validez le formulaire :

Scaleway Add SSH Key

Chacune des clés est liée à votre compte. Elles permettent donc toutes de se connecter à l'ensemble de vos instances. Si vous ajoutez une clé, il faut que la liste soit mise à jour pour que les machines déjà en route puissent la prendre en compte. Cela intervient à deux moments : lorsque l'utilisateur tape la commande scw-fetch-ssh-keys --upgrade dans un terminal, ou lors d'un redémarrage si la machine est inaccessible via SSH.

Dans tous les cas, l'interface ne permet pas d'attribuer une clé à une instance en particulier. Il faut pour cela passer par des manipulations supplémentaires comme nous le verrons plus loin.

Une fois l'instance créée, vous pouvez vous y connecter depuis le poste client avec la commande suivante :

ssh -i emplacement_de_la_clé_privée root@ip_du_serveur

Si vous avez ajouté une phrase de passe à votre clé, elle vous sera demandée. Vous serez ensuite connecté avec le compte administrateur (root) de votre machine. Vous pouvez ainsi l'administrer, la mettre à jour, y installer des applications, créer d'autres comptes utilisateurs, lui attribuer des clés publiques permettant de se connecter, etc. 

Si jamais vous voulez utiliser OpenSSH pour vous connecter à un serveur local plutôt qu'une instance Cloud par exemple, vous pouvez éditer le fichier de configuration d'OpenSSH pour ajouter la possibilité de connexion via une paire de clés et indiquer celles devant être autorisées (mais cela pourra faire l'objet d'un prochain article plus détaillé) :

sudo nano /etc/ssh/ssh_config

N'hésitez pas à regarder du côté des recommandations de l'ANSSI concernant les procédures de sécurité à suivre.

Générer une paire de clés utilisant FIDO/U2F

Si vous voulez utiliser une clé de sécurité en complément de votre paire de clés publique/privée, il faudra bien entendu en avoir une sous la main. Pour le moment, cela concerne celles respectant la première version de FIDO et U2F (USB, Bluetooth ou NFC). Ce sont en général les plus accessibles, on en trouve dès 10 euros

Il faut également vérifier que vous disposez au moins de la version 8.2 d'OpenSSH sur votre machine locale et le serveur. Celle-ci est en général disponible avec les distributions en rolling release ou celles qui ont une politique de mise à jour rapide. C'est aussi le cas sur Fedora 32 et Ubuntu 20.04 selon nos constatations.

Pour le vérifier, tapez cette commande :

ssh -V

Pour notre test, nous avons utilisé une simple clé U2F de base. Une fois connectée à la machine, il suffit de demander la création d'une paire de clés en précisant un algorithme à utiliser. Deux possibilités sont offertes : ECDSA (Elliptic Curve Digital Signature Algorithm) et ED25519 (Edwards-curve Digital Signature Algorithm, SHA-2, Curve 25519).

L'une ou l'autre peut être utilisée, certaines clés de sécurité pourront ne fonctionner qu'avec l'une d'entre elles. Notez que l'utilisation de FIDO/U2F peut venir en complément d'une phrase de passe. Ainsi, pour se connecter un utilisateur devra disposer de la bonne clé privée, disposer d'une clé de sécurité connectée et connaître cette phrase.

ssh-keygen -t ecdsa-sk
ssh-keygen -t ed25519-sk

Attention tout de même : si vous perdez la clé de sécurité, que vous ne l'avez pas sous la main ou qu'elle est cassée, vous perdrez l'accès à votre serveur. Il est donc sage de garder une paire de clés classique pour une connexion de secours. Il est aussi possible d'exporter la clé privée de la clé de sécurité, tout est détaillé dans la documentation d'OpenSSH 8.2.

Vous avez aussi la possibilité de demander à ce qu'un appui de l'utilisateur ne soit pas nécessaire pour initier la connexion :

ssh-keygen -t ecdsa-sk -no-touch-required
ssh-keygen -t ed25519-sk -no-touch-required

Une fois la paire générée, il faut transmettre la clé publique au serveur. Problème : l'interface de Scaleway n'accepte pas ce nouveau format de clé publique pour le moment. Il faut donc procéder autrement.

Ajouter une clé publique FIDO/U2F à un serveur Scaleway

La procédure sera similaire chez d'autres fournisseurs de cloud ou avec un serveur maison, même s'il faudra en général l'adapter à la marge. L'objectif est d'ajouter la clé publique générée à la liste de celles acceptées.

Pour cela, il faut tout d'abord disposer d'une paire de clés classique pour se connecter au serveur. Par défaut, c'est le fichier authorized_keys du dossier .ssh qui contient la liste des clés publiques acceptées. Mais chez Scaleway, ce fichier est remis à zéro à chaque lancement de l'instance ou lorsque la commande scw-fetch-ssh-keys --upgrade est lancée.

Cela permet de s'assurer constamment que seules les clés validées pour le compte sont reconnues. Il existe néanmoins un moyen de contourner cela : en ajoutant les clés publiques de votre choix au fichier instance_keys. Ce dernier contient une liste de clés n'étant acceptées que sur une instance en particulier. Utilisez la commande suivante :

echo votre_clef_publique >> /root/.ssh/instance_keys
scw-fetch-ssh-keys --upgrade

Vous pouvez bien entendu adapter cette commande à d'autres utilisateurs. Seule contrainte en attendant que Scaleway gère ce type de clés directement depuis son interface en ligne : il faudra répéter cette procédure autant de fois que vous avez de serveurs où vous voulez que votre clé publique FIDO/U2F soit reconnue. N'hésitez donc pas à l'automatiser.

Écrit par David Legrand

Tiens, en parlant de ça :

Sommaire de l'article

Introduction

Créer une paire de clés, se connecter à un serveur

Générer une paire de clés utilisant FIDO/U2F

Ajouter une clé publique FIDO/U2F à un serveur Scaleway

Fermer

Commentaires (35)


ca va mettre du temps pour arriver sur debian stable.

est ce que qu’il y a des choses à savoir sur les clefs FIDO  ?


ne pas oublier de sécuriser le compte qui contient les clés avec password/123456 - sans oublier le post it - <img data-src=" />


Debian Stable est encore en version 7.9 pour le moment, mais la 8.2 est dans Testing.











psn00ps a écrit :



ne pas oublier de sécuriser le compte qui contient les clés avec password/123456 - sans oublier le post it -&nbsp;<img data-src=" />



La sécurité est un ensemble ;) (Mais Scaleway gère la 2FA, pas encore via WebAuthn par contre)



Il m’a fallu du temps pour comprendre pourquoi ça fonctionne. ecdsa-sk -&gt; le sk est pour « secure-key ». J’imagine que si deux clés de sécurité sont branchées sur la machine, ça va probablement faire de la merde…



Conceptuellement, avoir mis la destination dans laquelle stocker la clé au niveau du type de clé est un choix étonnant.


Bon tuto, par contre utiliser le connexion root et en plus en SSH, c’est pas le plus conseillé ;)



Il faut bien configurer la propriété PermitRootLogin pour uniquement autoriser les connexions via la clef (PermitRootLogin without-password).


C’est la procédure de base pour la première connexion à un serveur chez Scaleway (entre autres). Comme dit, rien n’empêche ensuite de configurer aux petits oignons (ou d’aller coller un cloud init spécifique, mais ce n’était pas trop le sujet ici <img data-src=" />)




Super !

Je commençais à m’intéresser au sujet, voilà un tuto qui tombe à pic.



<img data-src=" />


Me semble que Debian désactive le root login par défaut maintenant.



J’ai pas encore mis en place car c’était le bordel, mais je vais me garder ce tuto sous le coude pour mes serveurs maison vu que ça a l’air plus simple à mettre en place.



Je me demande si on peut faire de la double-clef d’ailleurs, genre PermitRootLogin à false, tu te log avec une clef à ton user et tu as besoin d’une deuxième clef pour faire un su (ça fait bourrin mais c’est juste par curiosité. De toute façon il y a toujours moyen de faire plus bourrin, en rajoutant du port knocking encore par dessus <img data-src=" /> )


Je n’ai jamais testé Scaleway, mais le port SSH est forcément accessible de l’extérieur ?



Je veux dire, on ne peut pas changer le port SSH et configurer firewalld pour n’autoriser qu’une IP à s’y connecter ?


Tu peux modifier les paramètres des ports dans l’interface de gestion en plus de ce que le système permet. Par contre faut penser à gérer les accès avant de tout fermer sinon l’instance partira à la poubelle 😀


Effectivement, avoir l’accès via un compte dépourvu de pouvoir (et configurer sshd pour que seul les membres d’un certain groupe aient accès par exemple, pour éviter le vol de compte de service ou générique mal configuré) avec un sudoers* permettant de basculer en admin permet d’éviter des drames.



Il suffit de lire une log fail2ban pour se rendre compte de la vitesse à laquelle ça bombarde pour faire des bruteforce sur les comptes génériques… <img data-src=" />



(*pas de nopasswd, évidemment)


Ce n’est pas la partie Scaleway qui m’étonnait, mais la génération de la clé. Avec la ligne de commande donnée, comment openssh sait-il qu’il doit utiliser la clé u2f ? Je persiste dans l’idée qu’avoir encodé ça dans le type de clé est surprenant (et que ça ne marche pas s’il y a deux clés physiques).



Quand on n’a pas de u2f physique, ça donne :

root@bullseye:~# ssh-keygen -t ecdsa-sk

Generating public/private ecdsa-sk key pair.

You may need to touch your authenticator to authorize key generation.

Key enrollment failed: device not found


Bonjour David,



Merci pour cet article intéressant. Toutefois, quelques petites précisions que je pioche directement des recommandations de l’ANSSI sur OPENSSH et la gestion des clefs.




  • Le compte root ne doit pas être accessible directement à un utilisateur :

    PermitRootLogin no



  • et l’ANSSI recommande l’utilisation des clefs ECDSA à celles de RSA même si ces dernières sont acceptables à partir de 2048 bits.



    C’est pour aider à répandre les bonnes habitudes … pour reprendre le sous-titre de l’article :-)


Voir mes réponses plus haut ;)








Kazer2.0 a écrit :



Me semble que Debian désactive le root login par défaut maintenant.



J’ai pas encore mis en place car c’était le bordel, mais je vais me garder ce tuto sous le coude pour mes serveurs maison vu que ça a l’air plus simple à mettre en place.



Je me demande si on peut faire de la double-clef d’ailleurs, genre PermitRootLogin à false, tu te log avec une clef à ton user et tu as besoin d’une deuxième clef pour faire un su (ça fait bourrin mais c’est juste par curiosité. De toute façon il y a toujours moyen de faire plus bourrin, en rajoutant du port knocking encore par dessus <img data-src=" /> )







depuis la 10 oui. Tu te connecte avec ton user, puis tu fait un sudo -s ou un su -l et tu est root









David_L a écrit :



Tu peux modifier les paramètres des ports dans l’interface de gestion en plus de ce que le système permet. Par contre faut penser à gérer les accès avant de tout fermer sinon l’instance partira à la poubelle 😀





Ah ok il n’y a pas de kvm :)



&nbsp;



Tu as une console accessible dans l’interface, mais je ne sais plus quand elle est active ou non et ce qu’elle permet quand tu fais tout foirer (je ne l’utilise jamais à titre perso). Dans le cas évoqué, on reste sur des instances, donc difficile de parler de KVM ;)&nbsp;



Comme dit, tu as des paramètres de sécurité avec la liste des ports et requêtes que tu veux accepter/rejeter, que tu peux attribuer à des groupes de VM. Modifier le port d’accès d’OpenSSH peut en faire partie. Mais il faudra forcément avoir fait la modification en amont dans la config OpenSSH. Comme on peut également ajouter une couche de sécurité logicielle ou via un service tiers qui sera en front du serveur.








David_L a écrit :



Voir mes réponses plus haut ;)





Cela ne doit pas t’empêcher de mettre à jour l’article pour remplacer quelques commandes de création des clefs SSH <img data-src=" />



<img data-src=" />


Sujet intéressant, il mériterait d’être suivi par un test / comparatif de clés de sécurité matérielles.



La marque allemande Nitrokey semble plus «libre», en effet sur leur site ils prétendent «Hardware and software are available as open source and Free Software» mais ne bénéficie pas d’autant d’attention de votre part (pour une bonne raison ?).


MERCI! Je cherchais le lien aussi…


Je ne comprends pas ce que tu entends par plus ou moins d’attention, on parle des projets quand on a une occasion. Pour Solo Tap par exemple on avait déjà évoqué une de leurs clés. On a déjà évoqué le cas de la Nitro Key HSM de mémoire et évoqué le projet dans un papier après leur sortie :



https://www.nextinpact.com/news/102201-clefs-gpg-comment-stocker-et-utiliser-via-clef-usb-openpgp-card.htm&nbsp;

https://www.nextinpact.com/news/98743-safari-pour-ios-gere-cles-securite-nfc-via-fido2-et-webauthn-notre-test-avec-solo-tap.htm


J’ai un peu de mal à voir en quoi cette méthode ajoute une sécurité supplémentaire par rapport à ce qui existe déjà.



Personnellement, j’utilise une double authentification avec google authenticator, et une phrasse de passe, fail2ban et bien sûr une interdiction de se connecter directement en root.

En prime, je limite les adresses IP qui peuvent accéder à ssh.


Effectivement, j’aurais dû développer un peu plus.



Par «vous» j’entendais plus médias que vous NextInpact. <img data-src=" />

C’est d’ailleurs peut-être grâce à vous que je connais l’existence de Nitrokey.



Un exemple sur NextInpact : Nitrokey sur NXI. = «Aucun résultat ne correspond à votre recherche : Nitrokey »



Même choseavec le mot clé «yubico» = deux entrées



Mon souhait serait, de vous voir faire, un comparatif des différentes clés sur le maché.








wanou a écrit :



J’ai un peu de mal à voir en quoi cette méthode ajoute une sécurité supplémentaire par rapport à ce qui existe déjà.



Personnellement, j’utilise une double authentification avec google authenticator, et une phrasse de passe, fail2ban et bien sûr une interdiction de se connecter directement en root.

En prime, je limite les adresses IP qui peuvent accéder à ssh.





La méthode repose sur un standard et un support natif d’OpenSSH ;) En soit, c’est largement une avancée par rapport à ce qui existe. Surtout que dans le cas d’Authenticator, on est dans une mécanique de type OTP (reposant sur une intégration logicielle à un smartphone) de mémoire non ?&nbsp;

&nbsp;



Jeanprofite a écrit :









Ne pas trop se fier au moteur de recherche v6; ce n’est pas vraiment le plus efficace. Par contre, tu voudrais quoi comme élément de comparaison dans un tel article ? (Vu que lister les projets et ce qu’ils proposent on a déjà fait en fait <img data-src=" />)









David_L a écrit :



(Vu que lister les projets et ce qu’ils proposent on a déjà fait en fait <img data-src=" />)







Bha je voudrais une actualisation avec ce que permettent les divers clés selon le prix et la marque.

Oui un beau tableau du style «FIDO2, U2F, Smart card, OpenPGP, OTP, SSH, FREE Hardware ou non»

Les éventuelles compatibilités et incompatibilités à prévoir dans un futur proche avec tel logiciel ou service.



Est-ce que telle ou telle clé a été auditée par un cabinet ou une agence de sécurité.

(Laquelle fait le café et est-il bon) <img data-src=" />




Y’a aussi des experts qui doutent de la fiabilité des courbes elliptiques face à RSA.





Bruce Schneier • November 6, 2013 8:35 AM



“Did we have any insight from the Snowden papers if the NSA has identified any vulnerabilities in this?”



We do not – at least not yet – but I strongly believe that the NSA has a significant advantage in breaking ECC. This doesn’t mean it’s bad, but I think we need to 1) make sure we know where our curves come from, and 2) build in a hefty security margin.



https://www.schneier.com/blog/archives/2013/11/elliptic_curve.html


Ouais +1, bonne idée.



En plus je voudrais voir comment concrètement avec une triple vie qui est de plus en plus courante (PC perso, PC boulot, smartphone) on arrive à concilier ça.



Merci d’avance !


Qu’est-ce qui te parait compliqué à concilier ?


Est-ce que les services auxquels j’accède aujourd’hui indifféremment sur ces périphériques continuent de fonctionner sur ces 3 périphériques si je les configure pour utiliser la clé.



D’ailleurs aujourd’hui je sais faire du SSH avec mon smartphone Android (pour du dépanage, ça sert toujours), est-ce que la manip décrite dans l’article marche ensuite avec un JuiceSSH par exemple ?








Tr4ks a écrit :



Y’a aussi des experts qui doutent de la fiabilité des courbes elliptiques face à RSA.





Bruce Schneier • November 6, 2013 8:35 AM



“Did we have any insight from the Snowden papers if the NSA has identified any vulnerabilities in this?”



We do not – at least not yet – but I strongly believe that the NSA has a significant advantage in breaking ECC. This doesn’t mean it’s bad, but I think we need to 1) make sure we know where our curves come from, and 2) build in a hefty security margin.



https://www.schneier.com/blog/archives/2013/11/elliptic_curve.html





Cela veut rien dire. Il y aura toujours des gens pour mettre le doute sur tout.

&nbsp; Et les personnes à l’ANSSI sont bien plus qualifiées que moi pour se prononcer sur la robustesse des algorithmes.



Dans le fond je suis d’accord pour faire confiance à l’ANSSI, mais disons que dans ce cas précis je fais autant confiance à Bruce Schneier qu’à l’ANSSI.



En soit personne n’a réussi à démontrer que la NSA avait un avantage à décrypter les courbes elliptiques, mais si les volumes à chiffrer/déchiffrer ne sont pas énormes certains préfèrent utiliser des clé RSA de 16 kbits à la place (clé pgp pour des mails), là au moins on est sûr d’être tranquille.



Je trouve que c’est un sujet intéressant ECC vs RSA.


Toujours dans la partie ligne de commande/illustrations.

Il serait peux être pertinent de ne pas utiliser ssh-rsa comme exemple étant donné la faiblesse dont il fait preuve en se basant sur SHA-1.

Mais surtout du fait qu’il soit retirer d’OpenSSH 8.2 version que vous mentionnez.



Cela assurerait la sécurité et éviterai de futur problème aux lecteurs non initiés.


Je ne vois pas trop à quoi tu fais référence dans le tuto exactement ? De mémoire, SHA1 est déprécié et sera retiré à terme, SHA2 étant désormais utilisé par défaut pour la signature de certificats. Mais il n’en est pas question ici.&nbsp;


Autant pour moi, je me suis trompé, je faisais référence à cette partie de la release notes d’OpenSSH 8.2 :



&nbsp;* The RFC8332 RSA SHA-2 signature algorithms rsa-sha2-256512. These

&nbsp;&nbsp; algorithms have the advantage of using the same key type as

&nbsp;&nbsp; “ssh-rsa” but use the safe SHA-2 hash algorithms. These have been

&nbsp;&nbsp; supported since OpenSSH 7.2 and are already used by default if the

&nbsp;&nbsp; client and server support them.



Les commandes “ssh-keygen -b 4096” dans l’article utilise l’algo par défaut qui est ssh-rsa en &lt;8.2

&nbsp;et dans le screenshot on voit bien que la clé générer est de type ssh-rsa.



Sauf que je pensais que le type de clef changerait, passant de “ssh-rsa” en “rsa-sha2-XXX”.



My bad, je suis désolé du dérangement.