← retour aux snippets

ssh-agent: session éphémère avec lifetime

Démarrer un ssh-agent temporaire, charger une clé avec durée de vie et le fermer proprement.


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 ForwardAgent sauf nécessité explicite: il expose votre agent à l’hôte distant. Préférez ProxyJump sans -A.
  • IdentitiesOnly yes garantit 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 forme ssh-agent bash -lc, la fermeture est automatique.