Clés SSH : génération, configuration et gestion multi-comptes

Outils de développement

Clés SSH : une méthode d'authentification plus sûre que les mots de passe

Comparaison Mot de passe Clé SSH
Méthode d'authentification Facteur de connaissance (ce que vous savez) Facteur de possession (ce que vous possédez)
Force brute Possible Pratiquement impossible
Risque de hameçonnage Élevé Faible (la clé privée ne quitte jamais la machine locale)
Fuite serveur Mots de passe en clair/hachages vulnérables Seule la clé publique est stockée, la clé privée n'est pas dérivable
Commodité Saisir à chaque fois Configuration unique, authentification automatique

1. Générer une paire de clés

Ed25519 (recommandé)

ssh-keygen -t ed25519 -C "your@email.com"
Paramètre Description
-t ed25519 Type d'algorithme (Ed25519, le plus sûr et le plus rapide)
-C Commentaire (généralement l'email pour l'identification)

RSA (alternative de compatibilité)

ssh-keygen -t rsa -b 4096 -C "your@email.com"
Algorithme Longueur de clé Sécurité Performance Recommandation
Ed25519 256 bit Maximale Le plus rapide ✅
ECDSA P256 256 bit Élevée Rapide Optionnel
RSA 4096 4096 bit Élevée Lent Alternative de compatibilité
RSA 2048 2048 bit Moyenne Lent ❌ Non recommandé

Processus de génération

$ ssh-keygen -t ed25519 -C "dev@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase): ****
Enter same passphrase again: ****
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub

Il est fortement recommandé de définir une passphrase : même si la clé privée fuite, une passphrase empêche son utilisation directe.


2. Déployer la clé publique

GitHub / GitLab

# Copier la clé publique
cat ~/.ssh/id_ed25519.pub | clip

# GitHub → Settings → SSH and GPG keys → New SSH key
# Coller le contenu de la clé publique

Serveur

# Méthode 1 : ssh-copy-id
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server.com

# Méthode 2 : Ajout manuel
cat ~/.ssh/id_ed25519.pub | ssh user@server.com 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'

Vérifier la connexion

ssh -T git@github.com
# Hi username! You've successfully authenticated...

ssh user@server.com
# Connexion directe, sans mot de passe

3. Configuration multi-comptes

Scénario : GitHub professionnel + GitHub personnel

# Générer deux paires de clés
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_work
ssh-keygen -t ed25519 -C "personal@gmail.com" -f ~/.ssh/id_personal

SSH Config

# ~/.ssh/config
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_work
  IdentitiesOnly yes

Host github-personal
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_personal
  IdentitiesOnly yes

Utilisation avec Git

# Dépôt professionnel
git clone git@github-work:company/project.git

# Dépôt personnel
git clone git@github-personal:username/project.git

Configuration multi-plateforme

# ~/.ssh/config
Host github.com
  User git
  IdentityFile ~/.ssh/id_github

Host gitlab.com
  User git
  IdentityFile ~/.ssh/id_gitlab

Host gitee.com
  User git
  IdentityFile ~/.ssh/id_gitee

Host dev.azure.com
  User git
  IdentityFile ~/.ssh/id_azure

4. Gestion de l'Agent SSH

Démarrer l'Agent

eval "$(ssh-agent -s)"

Ajouter une clé

ssh-add ~/.ssh/id_ed25519
# Enter passphrase: ****

# Voir les clés ajoutées
ssh-add -l
# 256 SHA256:xxx... dev@example.com (ED25519)

Démarrage automatique (bashrc)

# ~/.bashrc ou ~/.zshrc
if [ -z "$SSH_AUTH_SOCK" ]; then
  eval "$(ssh-agent -s)"
  ssh-add ~/.ssh/id_ed25519 2>/dev/null
fi

Persistance avec keychain

# macOS : utiliser Keychain pour stocker la passphrase
ssh-add --apple-use-keychain ~/.ssh/id_ed25519

# Linux : utiliser keychain
eval "$(keychain --eval id_ed25519)"

5. Configuration du serveur de rebond

Scénario : Local → Serveur de rebond → Serveur de production

# ~/.ssh/config
Host jumpbox
  HostName jump.example.com
  User jump-user
  IdentityFile ~/.ssh/id_jump

Host production
  HostName 10.0.1.100
  User deploy
  IdentityFile ~/.ssh/id_prod
  ProxyJump jumpbox
# Connexion directe au serveur de production (passe automatiquement par le serveur de rebond)
ssh production

Transfert d'Agent

Host jumpbox
  HostName jump.example.com
  ForwardAgent yes

Avertissement de sécurité : N'activez le transfert d'Agent que si vous faites confiance au serveur de rebond.


6. Renforcement de la sécurité

sshd_config côté serveur

# /etc/ssh/sshd_config
PermitRootLogin no                    # Interdire la connexion root
PasswordAuthentication no             # Interdire la connexion par mot de passe
PubkeyAuthentication yes             # Autoriser uniquement la connexion par clé
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3                       # Nombre maximum de tentatives
LoginGraceTime 30                    # Délai de connexion de 30 secondes
AllowUsers deploy admin              # Liste blanche des utilisateurs

Permissions des clés

# La clé privée doit être 600
chmod 600 ~/.ssh/id_ed25519

# Le répertoire .ssh doit être 700
chmod 700 ~/.ssh

# authorized_keys doit être 600
chmod 600 ~/.ssh/authorized_keys

Rotation des clés

# 1. Générer une nouvelle clé
ssh-keygen -t ed25519 -C "dev@example.com" -f ~/.ssh/id_ed25519_new

# 2. Déployer la nouvelle clé publique sur tous les serveurs/platformes Git
ssh-copy-id -i ~/.ssh/id_ed25519_new.pub user@server

# 3. Vérifier que la nouvelle clé fonctionne
ssh -i ~/.ssh/id_ed25519_new user@server

# 4. Supprimer l'ancienne clé publique
# Éditer ~/.ssh/authorized_keys sur le serveur, supprimer la ligne de l'ancienne clé

# 5. Supprimer l'ancienne clé
rm ~/.ssh/id_ed25519_old

7. Résolution des problèmes courants

Problème Cause Solution
Permission denied Clé publique non déployée ssh-copy-id
Too many authentication failures Trop de clés dans l'Agent IdentitiesOnly yes
Are you sure you want to continue connecting Première connexion StrictHostKeyChecking=accept-new
Connexion lente Requête DNS inversée UseDNS no (côté serveur)
Clé non fonctionnelle Permissions incorrectes chmod 600 pour la clé privée

Mode débogage

ssh -vvv user@server.com
# Sortie détaillée du processus de connexion, localiser la cause de l'échec d'authentification
#SSH#密钥#Git#免密登录#安全