Certificats SSH : une meilleure expérience SSH
(jpmens.net)- Les certificats SSH résolvent les contraintes de l’authentification SSH classique basée sur des clés publiques et fournissent une confiance automatique entre le client et le serveur
- Pris en charge depuis OpenSSH 5.4, ils permettent à une CA (autorité de certification) de signer les clés utilisateur et hôte afin d’authentifier sans modifier
authorized_keys - Les certificats peuvent inclure une durée de validité, des utilisateurs autorisés (principals), des IP d’accès, une commande forcée (force-command), etc., pour un contrôle d’accès fin
- La procédure TOFU (Trust on First Use) disparaît, et il devient possible de se connecter en toute sécurité sans avertissement lors d’un changement de clé hôte
- Avec un serveur ou des outils de signature automatique, il est possible d’automatiser la gestion SSH dans de grands environnements serveurs tout en améliorant la sécurité
Présentation des certificats SSH et limites de l’authentification SSH classique par clés
- Lors d’une connexion SSH, il faut vérifier l’empreinte (fingerprint) de la clé hôte du serveur lors de la première connexion. En pratique, la plupart des utilisateurs ne la valident pas et saisissent simplement « yes », suivant ainsi le modèle TOFU (Trust on First Use)
- Un administrateur peut vérifier directement l’empreinte du serveur ou la valider avec la commande
ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key
- Un administrateur peut vérifier directement l’empreinte du serveur ou la valider avec la commande
- L’authentification par clé publique permet de se connecter sans mot de passe, mais il faut déployer la clé publique dans le fichier
authorized_keysde chaque serveur - Avec l’agent SSH (
ssh-agent), il est possible de conserver la clé privée en mémoire afin de s’authentifier sans la ressaisir à chaque fois - Limites de l’approche classique
- Il faut copier la clé publique de chaque utilisateur sur les serveurs
- Un message d’avertissement apparaît côté client lorsqu’une clé hôte change
- La gestion de la confiance devient contraignante à cause du TOFU
Certificats SSH et autorité de certification (CA)
- Le certificat SSH (Certificate) est pris en charge depuis OpenSSH 5.4 (mars 2010) et repose sur une extension du format de clé SSH existant
- Une CA SSH est constituée d’une paire de clés SSH, dont la clé publique joue le rôle de racine de confiance
- Principaux avantages
- Aucune modification du fichier
authorized_keysdu serveur n’est nécessaire - Aucun avertissement lors du remplacement d’une clé hôte
- La suppression de la procédure TOFU permet une confiance automatique
- Le certificat peut contenir des utilisateurs autorisés (principals), des IP autorisées, une durée de validité, une commande forcée (force-command), etc.
- L’accès est automatiquement bloqué à l’expiration du certificat
- Aucune modification du fichier
Mise en place d’une CA SSH et procédure de signature
- Sur le système CA, création d’une paire de clés CA avec l’algorithme ECDSA
ssh-keygen -t ecdsa -C "SSH CA" -f CA/ssh-ca
- L’utilisateur transmet sa clé publique (
*.pub) à la CA, qui la signe (sign) et émet un certificat (*-cert.pub)- Exemple :
ssh-keygen -s CA/ssh-ca -I "Jane Jolie" -n jane -z 001 -V +1w jane.pub
- Exemple :
- Configuration du serveur
- Enregistrer la clé publique de la CA dans
/etc/ssh/ssh-ca.pubet ajouter le paramètreTrustedUserCAKeys - Signer la clé hôte du serveur avec la CA (
ssh-keygen -h -s CA/ssh-ca ...) puis l’enregistrer dans l’entréeHostCertificate
- Enregistrer la clé publique de la CA dans
- Configuration du client
- Ajouter une ligne
@cert-authoritydans le fichierknown_hosts - Exemple :
@cert-authority *.example.com $(cat CA/ssh-ca.pub)
- Ajouter une ligne
Connexion et vérification avec des certificats SSH
- L’utilisateur se connecte avec le certificat signé et la clé privée (
ssh -i jane -l jane alice.example.com) - Les journaux du serveur enregistrent l’ID, le numéro de série (serial) et l’empreinte de la CA du certificat
- Il est possible d’ajouter plusieurs noms d’hôte ou adresses IP comme principal dans le certificat
- Si l’on tente de se connecter avec un utilisateur autre qu’un principal déclaré dans le certificat, l’erreur « Certificate invalid: name is not a listed principal » apparaît
- On peut appliquer un contrôle d’accès fin avec une commande forcée (force-command) ou des IP autorisées (
source-address)
Liste de vérification pour contrôle et dépannage
-
Éléments à vérifier côté serveur
- Paramètre
TrustedUserCAKeysprésent et clé publique de la CA disponible - Clé hôte signée et
HostCertificatedéfini - Redémarrage de
sshdnécessaire
- Paramètre
-
Éléments à vérifier côté client
- La clé utilisateur doit être signée par la CA
- L’entrée
@cert-authoritydeknown_hostset le principal doivent correspondre - À l’expiration du certificat, le message « Certificate invalid: expired » s’affiche
- En cas de non-concordance avec les contraintes du certificat, une demande de mot de passe apparaît
- Lors de l’ajout du certificat à l’agent SSH, la clé et le certificat sont tous deux enregistrés (
ssh-add jane) - Les options de signature (
-O) permettent de contrôler les fonctionnalités - Exemple : avec
-O clear, tous les droits sont retirés puis seulspermit-agent-forwardingetpermit-port-forwardingsont autorisés
Automatisation des certificats de clés hôtes
- Le module Python sshkey-tools et BottlePy permettent d’implémenter un serveur de signature automatique (hkbot)
- Après lancement de
hkbot.pysur le serveur CA, l’envoi d’une requête HTTP avec la clé publique hôte déclenche automatiquement la signature - Côté client, la commande
curl -F hostkey=@/etc/ssh/ssh_host_ed25519_key.pub http://CA:8870 | shpermet l’installation automatique - La configuration est appliquée après modification de
/etc/ssh/sshd_config, vérification, puissystemctl restart sshd
- Après lancement de
- Les connexions SSH peuvent ensuite s’appuyer sur les certificats pour établir automatiquement la confiance et permettre la connexion
Résumé des avantages des certificats SSH
- TOFU inutile, avec une confiance automatique entre client et serveur
- Émission de certificats à courte durée de validité pour un contrôle d’accès temporaire
- Blocage automatique de l’accès à l’expiration du certificat, sans nettoyage de
authorized_keys - Possibilité de définir des politiques fines avec commande forcée, restriction PTY, contrôle par IP d’accès
- Les outils d’automatisation permettent de simplifier la gestion de grands environnements serveurs
- Le projet Smallstep SSH est présenté comme ressource associée
Références complémentaires
- Guide de sécurité OpenSSH de Mozilla
- Article de recherche sur la vérification des empreintes de clés hôtes SSH via DNS
- Documentation d’implémentation de la prise en charge des certificats OpenSSH dans PuTTY et guide de configuration
Mise à jour
- Une CA SSH est particulièrement utile dans un environnement où l’on possède ses propres serveurs avec des privilèges root
- Sur les systèmes multi-utilisateurs, les approches classiques avec
known_hostsetauthorized_keysrestent toujours nécessaires - Projet de standardisation du format des certificats SSH :
draft-miller-ssh-cert-06
1 commentaires
Commentaires Hacker News
Je suis surpris que des gens utilisent encore des mots de passe SSH
Surtout dans les grands groupes, où plusieurs politiques de mot de passe s’entremêlent, au point que se connecter à un simple serveur prend du temps
Donc même si on leur explique d’utiliser des clés avec ssh-keygen, la plupart se disent juste « il faudra que j’essaie un jour » et ne le font jamais
Mais en pratique, la gestion tourne vite au chaos, avec une même clé publique utilisée sur plusieurs serveurs ou des clés partagées entre personnes
Les mots de passe ont au moins l’avantage d’être simples
Il n’y a pas de mot de passe, mais il faut toucher physiquement la Yubikey au moment de la connexion
Tous les quelques mois, quelqu’un redécouvre les certificats SSH et écrit un billet de blog à ce sujet
Moi aussi, j’ai écrit un article sur le sujet il y a 15 ans, et avec le recul il était incomplet
Même des ingénieurs sécurité oublient parfois qu’ils utilisent une authentification par clé, et non des certificats SSH
Gérer manuellement les clés sur plusieurs serveurs est bien trop pénible
Je me demande s’il vaut encore la peine de migrer maintenant
L’approche TOFU (Trust On First Use) est simple, mais elle va déjà assez loin
Sur mes serveurs, une fois que j’ai vérifié moi-même la clé d’hôte, cela me suffit
Dans un grand environnement d’entreprise, il suffit de publier la liste des clés publiques des serveurs internes sur un site web interne signé en SSL
Mais dans les environnements avec beaucoup de serveurs ou des changements fréquents, les certificats sont bien meilleurs, et TOFU a ses limites à plusieurs niveaux
J’aimerais aussi que les navigateurs avertissent quand la clé TLS d’un serveur change
La plupart tapent simplement « yes » et passent à autre chose
Dans mon entreprise, nous gaspillons énormément de temps et d’argent à cause de l’inspection SSL de Zscaler
Quand l’erreur « self-signed certificate in certificate chain » s’affiche, c’est toujours une galère
Il installe son propre certificat racine et verrouille les paramètres du navigateur pour empêcher l’usage d’un proxy
Même si on modifie les fichiers de configuration de Firefox ou Chrome, ils sont immédiatement écrasés
Il faut même un mot de passe IT pour le désactiver via l’interface graphique
C’est à peine mieux que l’antivirus Cybereason
Il casse tous les protocoles basés sur HTTP
Git, RubyGems, go mod, Nix et quantité d’autres outils se retrouvent cassés
Le fournisseur prétend que c’est « transparent », mais en réalité pas du tout
Il faut des heures pour diagnostiquer les problèmes, et la plupart des administrateurs ignorent à quel point c’est destructeur
L’article ne mentionnait que les avantages des certificats d’autorité de certification, mais il y a clairement aussi des inconvénients
Je n’ai jamais eu de problème de sécurité lié à TOFU
S’il y a des inconvénients aux certificats SSH, j’aimerais savoir lesquels précisément
Pour renforcer la sécurité, on peut échanger les clés publiques par un canal sûr comme une clé USB
Même avec des certificats, il faut au fond suivre la même procédure ; la seule différence est que la responsabilité de la gestion passe de l’utilisateur à l’administrateur
Dans les grandes organisations, les certificats peuvent être utiles, mais le niveau de sécurité général reste le même
Il suffit de l’inclure dans un script d’installation ou une image de déploiement
TOFU n’a de sens que lorsqu’on accède à une machine déjà configurée
Dans nos environnements dev/stg, nous réinstallons la moitié des machines chaque jour
Grâce aux certificats d’hôte SSH, c’est bien plus pratique : plus besoin de nettoyer
known_hostsni de conserver les clésJe développe en projet perso un outil appelé Sshifu
C’est un outil qui facilite la connexion basée sur des certificats SSH et le SSO
Il suffit d’installer sshifu-server sur le serveur pour l’utiliser comme CA, puis de configurer chaque serveur SSH pour faire confiance à cette CA
L’utilisateur n’a plus qu’à se connecter avec la commande
npx sshifuVoir le dépôt GitHub
En production réelle, l’accès basé sur des certificats mène à des problèmes de gestion complexes
Expiration des certificats, suppression des utilisateurs, connexion en cas de panne serveur : de nombreux sujets apparaissent
Chez Userify, nous traitons ces problèmes depuis 15 ans, et bâtir une infrastructure d’authentification SSH stable n’a rien de simple
J’ai ajouté la prise en charge des certificats SSH à pico.sh, et cela a été très utile pour mettre en place un contrôle d’accès de style RBAC
Voir la documentation
En production, les certificats SSH ont plutôt tendance à centraliser la complexité et à aggraver les problèmes
Une CA unique doit être disponible en permanence, et en cas de panne tout accès est bloqué
Il y a aussi des problèmes très concrets comme le réglage du TTL, la gestion de la racine de confiance ou la difficulté du débogage
Au final, les gens réintroduisent des caches ou des agents
Nous faisons l’inverse : chaque nœud synchronise via HTTPS les informations utilisateur dans authorized_keys en local
Cela permet de conserver un contrôle centralisé tout en localisant les pannes
C’est l’approche utilisée chez Userify, qui gère non seulement l’authentification mais aussi les autorisations
Les certificats seuls ne résolvent pas des problèmes comme la création des utilisateurs, les rôles sudo ou le nettoyage des répertoires personnels