TL;DR — Résumé Rapide
Guide de gestion des clés SSH pour sysadmins: générez des clés Ed25519, utilisez ssh-agent, configurez ~/.ssh/config et utilisez des certificats SSH.
Les clés SSH sont le fondement de l’accès distant sécurisé pour tout sysadmin et professionnel DevOps. Ce guide de gestion des clés SSH couvre le cycle de vie complet: générer des clés, les mettre en cache avec ssh-agent, organiser plusieurs hôtes avec ~/.ssh/config, déployer des clés publiques, faire la rotation et révoquer les credentials compromis, passer à l’échelle avec des certificats SSH et renforcer la sécurité avec des clés matérielles.
Prérequis
- Linux, macOS ou WSL avec le client OpenSSH (
ssh,ssh-keygen,ssh-agent,ssh-copy-id). - Accès SSH à au moins un serveur distant pour s’exercer.
- Optionnel:
ssh-audit(pip install ssh-audit) pour l’audit des algorithmes. - Optionnel: YubiKey ou autre clé matérielle FIDO2 pour une protection maximale.
Génération de Clés SSH: Ed25519 vs RSA
Ed25519 (recommandé)
ssh-keygen -t ed25519 -C "vous@exemple.com"
Ed25519 utilise la cryptographie sur courbe elliptique Curve25519. Les clés font 256 bits, les signatures sont rapides et l’algorithme est résistant aux attaques par canal auxiliaire. C’est le choix par défaut pour toutes les nouvelles clés.
RSA (compatibilité héritée)
ssh-keygen -t rsa -b 4096 -C "vous@exemple.com"
Utilisez RSA-4096 uniquement lorsque le système distant ne supporte pas Ed25519 — par exemple, de très anciennes versions d’OpenSSH (< 6.5) ou certains équipements réseau. RSA-2048 n’est plus recommandé.
Meilleures pratiques pour les phrases secrètes
- Définissez toujours une phrase secrète. Elle chiffre votre clé privée sur le disque. Une clé volée sans la phrase secrète est inutile.
- Utilisez au moins 20 caractères — une phrase aléatoire générée par votre gestionnaire de mots de passe est idéale.
- Stockez-la dans votre gestionnaire de mots de passe (1Password, Bitwarden, pass).
SSH Agent: Mise en Cache des Clés pour la Session
# Démarrer l'agent
eval "$(ssh-agent -s)"
# Ajouter votre clé (demande la phrase secrète une fois)
ssh-add ~/.ssh/id_ed25519
# Lister les clés chargées
ssh-add -l
# Supprimer toutes les clés
ssh-add -D
Conseil de sécurité: Passez -t 3600 à ssh-add pour expirer automatiquement la clé après une heure:
ssh-add -t 3600 ~/.ssh/id_ed25519
Fichier de Configuration SSH: Gestion de Plusieurs Hôtes
# ~/.ssh/config
# Paramètres par défaut pour tous les hôtes
Host *
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 3
# Serveur web de production
Host prod-web
HostName 203.0.113.10
User deploy
Port 22
IdentityFile ~/.ssh/id_ed25519_prod
# Serveur de base de données interne via jump host
Host db-internal
HostName 10.0.1.50
User dbadmin
ProxyJump prod-web
# GitHub
Host github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
Avec cette configuration, ssh prod-web se connecte avec le bon utilisateur et la bonne clé, et ssh db-internal tunnelise automatiquement via le bastion.
Déploiement des Clés Publiques
ssh-copy-id (le plus simple)
ssh-copy-id -i ~/.ssh/id_ed25519.pub utilisateur@hote
Déploiement manuel
cat ~/.ssh/id_ed25519.pub | ssh utilisateur@hote \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
cat >> ~/.ssh/authorized_keys && \
chmod 600 ~/.ssh/authorized_keys"
Permissions de fichiers — critique
| Chemin | Permission | Pourquoi |
|---|---|---|
~/.ssh/ | 700 | Seul le propriétaire peut lister/entrer |
~/.ssh/id_ed25519 | 600 | Clé privée — lecture/écriture propriétaire uniquement |
~/.ssh/id_ed25519.pub | 644 | Clé publique — lisible par tous |
~/.ssh/authorized_keys | 600 | Seul le propriétaire peut modifier |
~/.ssh/config | 600 | Empêche les autres de lire votre configuration |
SSH refusera d’utiliser des clés avec des permissions lisibles par tous et échouera silencieusement.
Stratégies de Rotation des Clés
Faites la rotation des clés SSH lorsque:
- Une clé est plus ancienne que la politique de votre organisation (généralement 1–2 ans).
- Un employé ayant accès aux clés quitte l’entreprise.
- Une machine ou un support contenant la clé privée est mis hors service ou perdu.
- Vous suspectez une compromission.
Procédure de rotation sécurisée:
- Générez une nouvelle paire de clés:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_nouvelle. - Déployez la nouvelle clé publique sur tous les hôtes sans supprimer l’ancienne.
- Vérifiez que vous pouvez vous connecter avec la nouvelle clé:
ssh -i ~/.ssh/id_ed25519_nouvelle utilisateur@hote. - Mettez à jour
~/.ssh/configpour utiliser la nouvelle clé. - Supprimez l’ancienne clé publique de tous les fichiers
authorized_keys. - Supprimez de façon sécurisée l’ancienne clé privée:
shred -u ~/.ssh/id_ed25519_ancienne.
Révocation des Clés Compromises
SSH n’a pas de liste de révocation intégrée pour les clés publiques, la révocation est donc un processus manuel:
- Supprimez la clé immédiatement de tous les fichiers
authorized_keyssur tous les hôtes. - Pour les infrastructures de certificats SSH, ajoutez la clé à un fichier
RevokedKeyssur le serveur (RevokedKeys /etc/ssh/revoked_keysdanssshd_config). - Auditez les journaux de connexion (
/var/log/auth.log,journalctl -u ssh) pour les sessions utilisant la clé compromise. - Faites la rotation de tout secret ou credential qui pourrait avoir été accédé.
Certificats SSH: Gestion de Flottes à Grande Échelle
Lorsque vous avez des dizaines ou des centaines de serveurs, gérer authorized_keys sur chaque machine est source d’erreurs. Les certificats SSH résolvent ce problème en introduisant une Autorité de Certification (CA).
Créer une paire de clés CA
ssh-keygen -t ed25519 -f /etc/ssh/ca_key -C "org-ssh-ca"
Gardez ca_key privée et hors ligne. Distribuez ca_key.pub à chaque serveur.
Configurer les serveurs pour faire confiance à la CA
# /etc/ssh/sshd_config
TrustedUserCAKeys /etc/ssh/ca_key.pub
Signer une clé d’utilisateur
ssh-keygen -s /etc/ssh/ca_key \
-I "alice@corp" \
-n alice,admin \
-V +30d \
~/.ssh/id_ed25519.pub
Avantages par rapport à authorized_keys
- Expiration automatique — les certificats expirent sans nettoyage manuel.
- Contrôle centralisé — révoquez en supprimant la confiance CA ou en utilisant
RevokedKeys. - Application des principals — un certificat ne peut se connecter qu’avec des noms d’utilisateur spécifiques.
Clés Matérielles: YubiKey et FIDO2
# Générer une clé stockée sur YubiKey/FIDO2 (OpenSSH 8.2+)
ssh-keygen -t ed25519-sk -O resident -C "yubikey@corp"
La clé privée ne quitte jamais le dispositif. Lors de l’authentification, le dispositif nécessite un contact physique, rendant impossible le vol à distance des clés.
Tableau Comparatif: Ed25519 vs RSA vs ECDSA
| Caractéristique | Ed25519 | RSA-4096 | ECDSA P-256 |
|---|---|---|---|
| Taille de clé | 256 bits | 4096 bits | 256 bits |
| Vitesse de signature | Très rapide | Lente | Rapide |
| Vitesse de vérification | Rapide | Rapide | Rapide |
| Taille du fichier de clé | ~400 octets | ~3.3 Ko | ~600 octets |
| Compatibilité héritée | OpenSSH 6.5+ (2014) | Universelle | OpenSSH 5.7+ (2011) |
| Résistance aux attaques par canal auxiliaire | Excellente | Modérée | Faible |
| Clé FIDO2/matérielle | Oui (ed25519-sk) | Non | Oui (ecdsa-sk) |
| Recommandation | Premier choix | Héritage seulement | À éviter |
Scénario Réel
Vous avez une flotte de production de 40 serveurs Linux. Trois développeurs ont quitté l’entreprise le mois dernier. Vous devez révoquer immédiatement leur accès SSH sans interruption de service.
Avec authorized_keys: Vous devez accéder (ou utiliser Ansible) sur les 40 serveurs, trouver l’empreinte de clé publique de chaque utilisateur partant, supprimer ces lignes et répéter. Un serveur oublié est une faille.
Avec des certificats SSH: La CA cesse simplement de signer des certificats pour ces utilisateurs. Les certificats existants expirent naturellement. Pour une révocation immédiate, ajoutez leurs empreintes au fichier RevokedKeys déployé via Ansible en quelques secondes:
ssh-keygen -lf utilisateur-partant-cert.pub >> /tmp/révoqués
ansible all -m copy -a "src=/tmp/révoqués dest=/etc/ssh/revoked_keys mode=0644"
ansible all -m service -a "name=sshd state=reloaded"
Terminé en moins de deux minutes sur toute la flotte.
Configuration SSH sur GitHub et GitLab
GitHub
gh ssh-key add ~/.ssh/id_ed25519.pub --title "poste-travail-2026"
Test: ssh -T git@github.com
GitLab
Ajoutez la clé dans GitLab → Paramètres utilisateur → Clés SSH.
Test: ssh -T git@gitlab.com
Pièges et Cas Limites
- StrictHostKeyChecking=no dans les scripts — Désactiver la vérification de la clé d’hôte supprime la protection contre les attaques man-in-the-middle. Pré-remplissez plutôt
~/.ssh/known_hostsavecssh-keyscanlors du provisionnement. - Clés partagées — Ne partagez jamais une clé privée entre plusieurs personnes ou machines. Chaque personne et machine doit avoir sa propre paire de clés.
- Connexion root — Désactivez
PermitRootLogin yesdanssshd_config. Utilisez un utilisateur normal avecsudo. - Noms de clés non standard — Si vous créez une clé avec un nom non standard, SSH ne l’utilisera pas automatiquement. Spécifiez-la dans
~/.ssh/configou passez-iexplicitement.
Dépannage
| Problème | Solution |
|---|---|
| ”Permission denied (publickey)“ | Vérifiez les permissions avec ls -la ~/.ssh/. Exécutez ssh -vvv hote pour voir quelles clés sont essayées |
| L’agent ne fonctionne pas | Vérifiez avec ssh-add -l. Si “Could not open connection to agent”, exécutez eval $(ssh-agent -s) |
| Mauvaise clé utilisée pour l’hôte | Ajoutez IdentityFile explicite et IdentitiesOnly yes dans ~/.ssh/config |
| ”Host key verification failed” | La clé du serveur a changé. Supprimez l’ancienne entrée: ssh-keygen -R hostname |
| Certificat rejeté | Vérifiez l’expiration avec ssh-keygen -L -f cert.pub. Vérifiez que le principal correspond au nom d’utilisateur |
| YubiKey non détecté | Assurez-vous que pcscd est actif (systemctl start pcscd). Essayez ssh-add -K pour charger les clés résidentes |
Résumé
- Générez des clés Ed25519 pour toutes les nouvelles paires; utilisez RSA-4096 uniquement pour la compatibilité héritée.
- Définissez toujours une phrase secrète et utilisez
ssh-agentpour la mettre en cache pour la session. - Utilisez
~/.ssh/configavecProxyJumppour gérer proprement plusieurs hôtes et bastions. - Déployez les clés avec
ssh-copy-id; ne partagez jamais les clés privées entre personnes ou machines. - Pour les flottes de plus de ~10 serveurs, adoptez les certificats SSH pour l’expiration, les principals et la révocation centralisée.
- Stockez les clés sur matériel FIDO2 (YubiKey) pour une sécurité maximale.
- Appliquez les permissions de fichiers correctes (
700sur~/.ssh/,600sur les clés etauthorized_keys). - Auditez régulièrement votre configuration de serveur SSH avec
ssh-audit.