Maîtriser l'Agent SSH et le Transfert d'Agent pour une Authentification Transparente
Utilisez ssh-agent et le transfert d'agent en toute sécurité pour les clés avec phrase de passe, les hôtes de rebond et les workflows SSH multi-sauts.
Maîtrise de l'agent SSH et du transfert d'agent pour une authentification transparente
L'authentification par clé Secure Shell (SSH) est plus sûre que les mots de passe réutilisables, mais les phrases de passe peuvent vous ralentir lorsque vous vous connectez à de nombreux hôtes. ssh-agent résout ce problème en conservant les clés déverrouillées disponibles pour votre session de connexion actuelle, et le transfert d'agent vous permet d'utiliser ces clés locales via un hôte de rebond de confiance. Utilisé avec précaution, cela vous offre un accès SSH plus fluide sans copier les clés privées sur les serveurs.
Comprendre l'agent SSH
Le ssh-agent est un programme d'arrière-plan qui conserve vos clés SSH privées en mémoire de manière sécurisée, déchiffrées et prêtes à être utilisées. Au lieu de vous obliger à saisir votre phrase de passe à chaque fois que vous vous connectez à un serveur distant, vous ne la saisissez qu'une seule fois lors de l'ajout de la clé à l'agent. Cela améliore considérablement l'efficacité du flux de travail sans sacrifier la sécurité offerte par la protection par phrase de passe.
Démarrer et gérer l'agent SSH
Le processus de démarrage de l'agent et de mise à disposition de son socket pour votre session shell est crucial. Sur la plupart des systèmes Linux et macOS modernes, l'agent est souvent démarré automatiquement par les scripts d'initialisation du système ou votre environnement de bureau.
Si vous devez le démarrer manuellement, utilisez la séquence de commandes suivante. Cela garantit que les variables d'environnement nécessaires (SSH_AUTH_SOCK et SSH_AGENT_PID) sont correctement définies pour votre session shell actuelle :
# Démarrer l'agent et afficher les variables d'environnement nécessaires
eval "$(ssh-agent -s)"
Ajouter des clés à l'agent
Une fois l'agent en cours d'exécution, vous utilisez la commande ssh-add pour charger vos clés privées dans sa mémoire. Si votre clé est protégée par une phrase de passe, vous serez invité à la saisir maintenant.
Exemple : ajout d'une clé par défaut
ssh-add
# Saisir la phrase de passe lorsque vous y êtes invité
# Identité ajoutée : /home/user/.ssh/id_ed25519 (user@localbox)
Exemple : ajout d'un fichier de clé spécifique
ssh-add ~/.ssh/my_project_key
Vérifier les clés chargées
Vous pouvez vérifier les clés que l'agent gère actuellement à l'aide de l'option -l :
ssh-add -l
# Exemple de sortie :
2048 SHA256:abcdef1234567890... user@localbox (RSA)
Utilisez des phrases de passe sur les clés privées. L'agent vous évite des invites répétées pendant la session ; il ne rend pas une clé privée non protégée plus sûre sur le disque.
Démystifier le transfert d'agent SSH
Le transfert d'agent est une fonctionnalité puissante qui vous permet d'utiliser les clés chargées dans votre ssh-agent local pour vous authentifier auprès d'un deuxième hôte distant auquel vous vous connectez depuis le premier hôte distant.
Ceci est utile pour les workflows multi-sauts, comme la connexion de votre ordinateur portable à un hôte bastion, puis de cet hôte bastion à un serveur interne.
Comment fonctionne le transfert d'agent
Lorsque vous vous connectez à l'hôte A avec le transfert d'agent activé, SSH crée un socket de domaine UNIX spécial sur l'hôte A. Ce socket agit comme un proxy. Lorsque vous essayez de vous connecter en SSH de l'hôte A à l'hôte cible B, le client SSH de l'hôte A transmet la demande d'authentification via ce socket proxy à votre ssh-agent local en cours d'exécution. L'agent traite le défi cryptographique en utilisant votre clé privée stockée et renvoie le signal de réussite, complétant ainsi l'authentification auprès de l'hôte B.
Votre clé privée ne quitte pas votre machine locale. L'hôte distant reçoit l'accès à un socket d'agent temporaire, pas au fichier de clé lui-même.
Activer le transfert d'agent
Pour activer le transfert d'agent lors de la connexion à un hôte distant, utilisez l'option -A avec la commande ssh :
ssh -A user@bastion-host
Vous pouvez également le configurer pour un hôte de confiance dans ~/.ssh/config :
Host bastion-host
Hostname 192.168.1.100
User myuser
ForwardAgent yes
Tester le transfert d'agent
Après vous être connecté avec succès à l'hôte bastion avec le transfert activé, testez si le socket de l'agent est disponible sur la machine distante. Vous pouvez vérifier la présence de la variable d'environnement SSH_AUTH_SOCK ou utiliser ssh-add -l sur la machine distante :
Sur l'hôte bastion :
# Vérifier si les clés sont transférées (l'agent s'exécutant localement doit répondre)
ssh-add -l
# En cas de succès, vous verrez les clés gérées par votre agent LOCAL.
Maintenant, vous pouvez vous connecter en SSH de l'hôte bastion à l'hôte cible interne en utilisant l'authentification par clé, sans jamais avoir le fichier de clé privée présent sur l'hôte bastion :
Sur l'hôte bastion :
ssh user@target-host
# L'authentification se produit de manière transparente en utilisant votre clé locale via le socket de l'agent transféré.
Considérations de sécurité
Le transfert d'agent est pratique, mais il modifie votre profil de risque.
Lorsque le transfert est actif sur un hôte distant, un utilisateur disposant d'un accès root sur cet hôte peut généralement accéder à votre socket d'agent transféré pendant que votre session SSH est ouverte. Il ne peut pas lire votre clé privée depuis l'agent, mais il peut être en mesure de demander à l'agent de signer des défis d'authentification pour d'autres serveurs auxquels vous pouvez accéder.
Stratégies d'atténuation
- Laissez le transfert désactivé par défaut : Utilisez
-Auniquement lorsque vous en avez besoin pour une tâche multi-sauts spécifique. - Limitez le transfert dans
~/.ssh/config: Activez le transfert uniquement pour les serveurs de rebond de confiance.Host trusted-jump ForwardAgent yes Host untrusted-server ForwardAgent no - Exigez une confirmation pour les clés sensibles :
ssh-add -c ~/.ssh/keynamedemande une confirmation avant que l'agent n'utilise cette clé. Cela aide lorsqu'un agent transféré est exposé à un hôte que vous administrez mais en lequel vous n'avez pas entièrement confiance. - Préférez
ProxyJumplorsque le transfert n'est pas nécessaire : Si votre objectif est uniquement d'atteindre un hôte privé via un bastion,ssh -J user@bastion user@targetévite souvent de transférer l'agent au bastion.
Gérer le cycle de vie de l'agent
Il est de bonne pratique de gérer le cycle de vie de votre agent, surtout lorsqu'il est fait manuellement. Lorsque vous fermez votre session terminal, l'agent peut continuer à s'exécuter en arrière-plan, consommant des ressources et laissant potentiellement le socket actif.
Supprimer des clés
Pour supprimer une clé spécifique de la mémoire de l'agent :
ssh-add -d ~/.ssh/my_project_key
Pour supprimer toutes les clés de l'agent :
ssh-add -D
Arrêter l'agent
Pour terminer le processus de l'agent et effacer toutes les clés chargées de la mémoire :
ssh-agent -k
Cela affiche les commandes shell pour désactiver les variables d'environnement associées et tuer le processus de l'agent. Si vous avez démarré l'agent avec eval "$(ssh-agent -s)", exécutez eval "$(ssh-agent -k)" pour appliquer ce nettoyage à votre shell actuel.
Point clé à retenir
Utilisez ssh-agent pour la gestion quotidienne des clés, et réservez le transfert d'agent aux hôtes de rebond de confiance où vous en avez vraiment besoin. Pour un accès bastion simple, essayez d'abord ProxyJump ; pour les agents transférés, gardez les sessions courtes et supprimez les clés dont vous n'avez plus besoin avec ssh-add -d ou ssh-add -D.