Générer correctement sa clé SSH

En crypto asymétrique, il existe grossièrement deux catégories d’algorithme :
- Ceux qui exploitent la factorisation des grands nombres premiers (RSA, DSA) - c’est la taille qui compte !
- Ceux qui se basent sur les courbes elliptiques (clés ECC avec : ECDSA, Ed25519).
Depuis plusieurs années la recommandation est l’utilisation des algorithmes à base de courbes elliptics et côté de l’ANSSI plus spécifique l’ECDSA.

La source : le guide de l’ANSSI
Pour nuancer ces propos, il semble peser quelques doutes sur les modèles mathématiques retenus (pour rappel choisi par le NIST et donc potentiellement la NSA #théorieducomplot). Pour ne rien arranger son implémentation ne serait pas trivial (ce qui a permis le célèbre hack de la PS3 en 2010…).
Le consensus est maintenant de se tourner vers ED25519 supporté depuis la version 6.5 d’OpenSSH. Les autres avantages reconnu d’ED25519 sont sa performance et une meilleure robustesse aux attaques par canaux auxiliaires (ce qui peut avoir du sens dans les environnements cloud mutualisés). source
En complément, il est conseillé d’appliquer la fonction de dérivation de clé pour RSA (avec ED25519 c’est natif), sur cette fonction de dérivation on appliquera un nombre de tour de chiffrement (par défaut 16).
En conclusion
- DSA
On oubli.
- RSA
Maximum de compatibilité avec une longueur minimum de 2048 (je n’ai pas trouvé de recommendation officielle), ni de contrainte donc autant selectionner une longueur de 4096 ! Pour le nombre de tour de chiffrement, par défaut il est positionné à 16, 64 serait pour les paranoïaques !
ssh-keygen -o -a 64 -t rsa -b 4096 -f id_rsa
- EDSA
Préconisation de l’ANSSI mais pas validé par la communauté.
- ED22519
Recommandé mais pas compatible partout, pour le nombre de tour de chiffrement, la valeur 100 semble être le mode paranoïaques.
ssh-keygen -a 100 -t ed25519 -f id_ed25519
Astuce pour lister les algorithmes utilisés sur sa station
for key in ~/.ssh/id_*; do ssh-keygen -l -f "${key}"; done | uniq
256 SHA256:1m2JO+lDINIwfp38cGSjfQNCzPQtthl1Pfr1mfK6aZ4 eric@DESKTOP-JS69KRL (ECDSA)
256 SHA256:xbCWp2EQElijV8uBn1+gB38uUoxcvDRNN/bEEK/iV2o eric@DESKTOP-DUSU067 (ED25519)
256 SHA256:JBrStodYETM9PV9FHcY0U/dZi5twxZ/oNU0EyUwbgXM eric@DESKTOP-JS69KRL (ED25519)
256 SHA256:PmJTTXQWUnl+c7CQQl5S4LOjuaqG5xn/NTG5Qqhc+nw eric@DESKTOP-DUSU067 (ED25519)
Compléments côté serveur
Une fois que nous avons dit cela, sur notre serveur on interdit la connexion par mot de passe
/etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
Pour aller encore un peu plus loin dans le hardening, il est possible de sélectionner les algorithmes utilisés lors de l’échange de clé et l’authentification des messages :
/etc/ssh/sshd_config
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com
Pour dépanner les problèmes d’authentification:
/usr/sbin/sshd -d -p 2222
ssh -v -i ~/.ssh/id_backup backup_rocket@51.158.112.234 -p 2222
Transférer la clé publique sur le serveur distant
La commande ssh-copy-id permet d’envoyer une ou plusieurs clés publique et les déclarer dans le fichier authorized_keys vers un hôte distant.
~$ ssh-keygen -a 100 -t ed25519 -f ~/.ssh/id_ed25519_migration
Generating public/private ed25519 key pair.
Created directory '/home/eric/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/eric/.ssh/id_ed25519_migration.
Your public key has been saved in /home/eric/.ssh/id_ed25519_migration.pub.
The key fingerprint is:
SHA256:y/xeJqAwqZ3G8/9YcREt3unNmVxIl67OOgie/QnI2Yg eric@debian-gitlab
The key's randomart image is:
+--[ED25519 256]--+
| .. .|
| ..o..|
| ..+.+ |
| . ..+..|
| + S . ..oo+|
| + +o==o o ..+o|
| . *Eo=Bo+ = |
| . o o *.=.o |
| ..oo=+o |
+----[SHA256]-----+
~$ ssh-copy-id -i ~/.ssh/id_ed25519_migration eric@192.168.2.111
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/eric/.ssh/id_ed25519_migration.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
eric@192.168.2.111's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'eric@192.168.2.111'"
and check to make sure that only the key(s) you wanted were added.
Attention si la clé n’est pas précisée : toutes les clés apparaissant dans ssh-add -L seront envoyées.
Ressources complémentaires :