Connexion SSH sans mot de passe
Le vendredi 13 mars 2015 par Benjamin BoudoirPour faire une connexion ssh sans mot de passe, la plupart des gens vous diront de simplement ne pas entrer de mot de passe. C'est une solution qui marche, mais qui est stupide dans 95% des cas (les 5% restants étant : ça sert pour des robots bien cachés et très sécurisés).
Nous allons donc voir comment ne pas avoir à taper sa passphrase SSH a chaque fois tout en empêchant n'importe qui d'utiliser sa clef.
SSH Agent
On utilise donc un agent ssh, normalement fourni avec le client :
me@localhost$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-h3OlnVkc7Ouz/agent.8523; export SSH_AUTH_SOCK;
SSH_AGENT_PID=8524; export SSH_AGENT_PID;
echo Agent pid 8524;
Puis on export les variables. Pour faire plus simple :
me@localhost$ eval `ssh-agent`
Agent pid 8533
Notez aussi que Debian démarre un agent SSH avec une session graphique. Vous n'aurez donc normalement pas besoin d'en lancer un.
L'ajout de clefs
On peut ensuite ajouter autant de clef que l'on veut dans son agent :
me@localhost$ ssh-add ~/.ssh/id_rsa_intra
Enter passphrase for /home/me/.ssh/id_rsa_intra:
Identity added: /home/me/.ssh/id_rsa (/home/me/.ssh/id_rsa_intra)
me@localhost$ ssh-add ~/.ssh/id_rsa_prod
Enter passphrase for /home/me/.ssh/id_rsa_prod:
Identity added: /home/me/.ssh/id_rsa (/home/me/.ssh/id_rsa_prod)
Récupérer son agent
Maintenant, vous avez ouvert une nouvelle connexion et vous avez perdu la connexion a votre agent, qui est toujours lancé. Que faire ? Simple, comme vous avez pu le voir lors que vous avez lancé votre ssh-agent, il y a deux variables a remplir, il faut simplement récupérer ces valeurs. Les infos sont disponibles dans /tmp/ssh-*/*.
Le chemin vers le fichier est votre $SSH_AUTH_SOCK tandis que le numéro à la fin du fichier est le $SSH_AGENT_PID.
Pour ma part, j'utilise une fonction dans mon .bashrc qui me permet de récupérer automatiquement mon agent :
ssh-agent-restore()
{
QUIET="$1"
QTY="$(ls -1 /tmp/ssh-*/* 2>/dev/null | wc -l)"
if [ z"$QTY" = z"1" ]
then
export SSH_AUTH_SOCK="$(printf "%s" /tmp/ssh-*/*)"
export SSH_AGENT_PID="${SSH_AUTH_SOCK##/*/*.}"
elif [ z"$QTY" = z"0" -a -z "$QUIET" ]
then
printf "No ssh-agent found.\n" 1>&2
elif [ -z "$QUIET" ]
then
select AUTH_SOCK in /tmp/ssh-*/*
do
export SSH_AUTH_SOCK="$AUTH_SOCK"
export SSH_AGENT_PID="${SSH_AUTH_SOCK##/*/*.}"
return
done
fi
}
Il récupère automatiquement le seul agent disponible ou me présente la liste des agents disponibles sur mon système et me laisse choisir.
Bien entendu, il est impossible de récupérer les agents des autres utilisateurs. D'ailleurs, seul root peut voir les différents agents disponibles (les autres utilisateurs ne verront que les leurs) mais ne peut pas utiliser l'agent pour autant.