Chez Octopuce, nous cherchons toujours à automatiser au maximum les opérations de maintenance et de déploiement de nos serveurs et machines virtuelles.
Pour ce faire, nous utilisons Puppet, qui nous permet de déployer et maintenir facilement nos serveurs. Puppet met en œuvre le concept de Fact (pour « faits » comme dans « faits et gestes »), qui sont des clés/valeurs stockées sur le serveur puppetmaster décrivant chaque serveur.
Parmi ces facts, on trouve les empreintes des clés SSH de nos serveurs.
Or, il est possible, depuis quelques années, de publier ces empreintes dans le DNS pour permettre aux utilisateurs souhaitant se connecter à un serveur de vérifier l’empreinte via le DNS. Ces enregistrements DNS sont appellés SSHFP (pour SSH FingerPrint, décrit dans la RFC4255)
Exemple, pour la machine tim hébergeant ce site, on pourrait publier les enregistrements DNS suivants
tim IN SSHFP 1 1 D0E807C05493B54400AB9B3FE21E66621B91ED83 tim IN SSHFP 2 1 B7C3873C9E5B98DBD6B6907339207FBD91BA0FF5
Ces 2 lignes correspondent aux empreintes des clés RSA et DSA de ce serveur.
Grâce à Jean-Piet Mens, qui publia en 2012 un script permettant d’extraire les clés des facts puppet et les publier dans le DNS, nous publions donc depuis lors de manière totalement automatique les clés SSH des serveurs d’Octopuce sur le domaine octopuce.fr.
Récemment, nous avons mis à jour tous nos serveurs pour qu’ils disposent aussi d’une clé ECDSA, mettant en œuvre la cryptographie à courbes elliptiques. Or le script de Jean-Piet ne gérant pas les clés ECDSA, il fallu le corriger pour cela.
Vous trouverez donc ici le script facts2sshfp.py de Jean-Piet, mis à jour pour gérer les clés ECDSA.
Donc à ce jour, tim (et les centaines d’autres machines automatiquement gérées par notre puppet) ont toute des enregistrements similaires à ceux-ci :
tim IN SSHFP 1 1 D0E807C05493B54400AB9B3FE21E66621B91ED83 tim IN SSHFP 2 1 B7C3873C9E5B98DBD6B6907339207FBD91BA0FF5 tim IN SSHFP 3 1 8F7843A19D36A2BC5F1ACC402EE2E40078AC7863
Du côté du Client SSH
Pour que votre client SSH utilise ces enregistrements DNS, il faut ajouter la directive suivante, soit dans votre /etc/ssh/ssh_config , soit dans votre home dans ~/.ssh/config :
VerifyHostKeyDNS yes
Ainsi votre client vous le dira à la connexion :
debug1: Server host key: RSA ad:47:3a:95:be:f3:12:50:b2:b4:e1:84:84:88:b5:2e debug1: found 2 insecure fingerprints in DNS debug1: matching host key fingerprint found in DNS
Notez que ce domaine n’a pas DNSSEC pour l’instant, donc l’intérêt de publier ces enregistrements est faible pour l’instant (mais non nul, car faire un mitm ssh ET falsifier le DNS dans le même temps requiert bien plus de motivation). À court terme, quand nous passerons le domaine octopuce.fr en DNSSEC, l’intérêt d’une telle configuration sera bien supérieur, et ainsi nous n’aurons plus besoin de croire le serveur la première fois (TOFU, Trust On First Use) ou nous nous y connecterons, autant l’équipe système d’Octopuce que nos clients.
Note: tous les codes de nos scripts pour administrateurs système sont publiés sous licence CC0 dans un dépôt git public. Retrouvez-les sur notre compte GitHub