SSH : Authentification multiple avec clefs privés/publiques
En complément d’un ancien article sur l’authentification par clefs avec ssh et parce qu’il ne faut jamais mettre tous ses oeufs dans le même panier, je propose ici une solution toute simple afin d’utiliser une clef spécifique à une identité sur un serveur ssh donné.
Dans notre exemple nous allons utiliser deux clefs, l’une avec passphrase qui nous servira pour nous connecter à un serveur server.mydomain.tld en tapant simplement ssh serv et une deuxième sans passphrase qui nous servira essentiellement pour l’exécution de script de maintenance sur un petit parc de machines clientes cli01.parc01.mydomain.tld etc., dont le serveur ssh écoute sur un port spécifique et le pare-feu n’autorisant que les connexions depuis server.mydomain.tld (soyons fous).
Après génération des clefs idoines et envoie sur les machines respectives:
$ ssh-keygen -f ~/.ssh/admin01.id
[...]
$ ssh-keygen -f ~/.ssh/parc01.id
[...]
$ ssh-copy-id -i ~/.ssh/admin01.id server.mydomain.tld
[...]
$ for i in {001..100};do
ssh-copy-id -i ~/.ssh/parc01.id cli${i}.parc01.mydomain.tld;
done
[...]
Nous éditons tout simplement notre fichier de configuration ssh : ~/.ssh/config pour y définir ceci:
# Prevent "Too many authentication failure" when ssh agent try each key in .ssh directory
IdentitiesOnly yes
# Nous nous connecterons en tapant simplement ssh serv
Host serv
Hostname server.mydomain.tld
User admin01
IdentityFile ~/.ssh/admin01.id
# Pour chaque machines clientes
Host cli01.parc01.mydomain.tld
Hostname cli001.parc01.mydomain.tld
Port 2222
User admin02
IdentityFile ~/.ssh/parc01.id
Le IdentitiesOnly yes est la ligne qui fait tout: sans elle, ssh essaie chaque clé du ~/.ssh/ dans l’ordre, brûle des tentatives d’authentification et finit par un “Too many authentication failures” avant d’atteindre la bonne clé. Avec elle, ssh n’utilise que la clé spécifiée dans IdentityFile pour chaque host.
[edit: 2026] Ce mécanisme est devenu le pattern standard: une clé par identité, IdentitiesOnly yes partout, des alias d’hôtes dans la config. La version moderne (SSH en 2021
) ajoute Include config.d/* pour le split par contexte et myflec
documente le split complet: work, private, lab, chaque bloc Host dans son fichier. Le “Too many authentication failures” reste l’erreur la plus fréquente chez ceux qui accumulent les clés sans IdentitiesOnly.
[edit: 2026] L’implémentation Ansible de tout ceci: le rôle ssh .