objectif
Utiliser un ssh-agent uniquement le temps nécessaire: charger une clé avec durée de vie (lifetime), exécuter vos commandes, puis tuer l’agent pour limiter l’exposition.
code minimal
# agent éphémère pour une seule commande (clé valable 1h)
ssh-agent bash -lc '
ssh-add -t 1h ~/.ssh/id_ed25519
git ls-remote git@git.data.pm:org/repo.git | head -n1
'
utilisation
# 1) session interactive courte avec cleanup automatique (trap EXIT)
eval "$(ssh-agent -s)"
trap 'ssh-agent -k >/dev/null' EXIT
ssh-add -t 30m ~/.ssh/id_ed25519
ssh -o BatchMode=yes deploy@data.pm 'true'
# 2) agent éphémère pour un déploiement (pas d'état persistant)
ssh-agent bash -lc '
set -Eeuo pipefail
ssh-add -t 20m ~/.ssh/id_ed25519
ssh -o StrictHostKeyChecking=yes deploy@api.data.pm "sudo systemctl reload data-pm-api.service"
'
# 3) vérifier/retirer les clés dans l’agent
ssh-add -l # lister les identités chargées
ssh-add -D # retirer toutes les clés
ssh-add -d ~/.ssh/id_ed25519 # retirer une clé précise
# 4) verrouiller l’agent temporairement (mot de passe demandé à chaque déverrouillage)
ssh-add -x
# ... plus tard ...
ssh-add -X
# 5) n'utilisez PAS le forward d'agent par défaut (risques). Si nécessaire, activer ponctuellement:
ssh -A bastion.data.pm ssh api.data.pm 'hostname' # usage explicite et ponctuel
# sinon, désactivez globalement:
# dans ~/.ssh/config:
# Host *
# ForwardAgent no
variante(s) utile(s)
# charger la clé en mémoire depuis un fichier protégé puis l'oublier après la commande
ssh-agent bash -lc '
umask 077
ssh-add -t 15m ~/.ssh/id_ed25519
git -C repo fetch --all
'
# utiliser une clé dédiée au projet data.pm avec options strictes (~/.ssh/config)
cat >> ~/.ssh/config <<'SSHCONF'
Host git.data.pm
HostName git.data.pm
User git
IdentitiesOnly yes
IdentityFile ~/.ssh/id_ed25519_data_pm
ForwardAgent no
ServerAliveInterval 60
ServerAliveCountMax 3
SSHCONF
# puis:
ssh-agent bash -lc 'ssh-add -t 45m ~/.ssh/id_ed25519_data_pm && git clone git@git.data.pm:org/repo.git'
# agent pour une chaîne ProxyJump sans forward (auth locale via agent, pas d'agent sur la cible)
ssh-agent bash -lc '
ssh-add -t 30m ~/.ssh/id_ed25519
ssh -J bastion.data.pm deploy@api.data.pm "hostname"
'
# limiter les tentatives de clé côté client (évite les hangs si plusieurs clés dans l’agent)
ssh -o IdentitiesOnly=yes -o IdentityAgent="$SSH_AUTH_SOCK" deploy@data.pm 'true'
# CI: agent jetable pour un job (clé injectée par variable)
ssh-agent bash -lc '
umask 077
printf "%s\n" "$SSH_PRIVATE_KEY" > id.tmp && chmod 600 id.tmp
ssh-add -t 20m id.tmp
git clone git@git.data.pm:org/repo.git
rm -f id.tmp
'
notes
- préférez
ssh-agent … bash -lc '...'pour un agent jetable: il vit le temps de la commande, puis disparaît. ssh-add -t <durée>fixe la durée de vie d’une clé en mémoire (ex: 10m, 1h). Au-delà, l’agent oublie automatiquement la clé.- évitez
ForwardAgentsauf nécessité explicite: il expose votre agent à l’hôte distant. PréférezProxyJumpsans-A. IdentitiesOnly yesgarantit que seule la clé choisie est proposée (utile si plusieurs clés sont chargées).- nettoyez toujours l’agent (
ssh-agent -k) si vous l’avez démarré dans la session courante; avec la formessh-agent bash -lc, la fermeture est automatique.