L'articolo di Wikipedia ha probabilmente la migliore descrizione:
La verifica al server si basa sull'autenticazione challenge-response. ssh si collega al server con un nome utente e la richiesta di una chiave. Il demone ssh riceve la richiesta e invia una richiesta basata sulla chiave pubblica memorizzata nel file di autenticazione. ssh utilizza la chiave privata per costruire una risposta chiave e la invia a sshd in attesa sull'altra estremità della connessione. Non invia la chiave privata stessa. Il demone ssh convalida la risposta chiave e, se valido, concede l'accesso al sistema. ssh-agent semplifica questo creando un socket che ascolta le connessioni SSH. L'utente avvia semplicemente ssh-agent, dicendogli come trovare le proprie chiavi (se non si trovano nella posizione predefinita), inserisce la passphrase per ogni chiave da usare, una volta sola,
Ancora una volta letteralmente dall'articolo di Wikipedia:
... ssh-agent crea un socket e quindi controlla le connessioni da ssh. Chiunque sia in grado di connettersi a questo socket ha anche accesso all'agente ssh. Le autorizzazioni sono impostate come in un normale sistema Linux o Unix. All'avvio dell'agente, crea una nuova directory in / tmp con autorizzazioni restrittive. Il socket si trova nella cartella.
In genere viene inserito in un file di sistema o dell'utente rc come $HOME/.bashrc
o $HOME/.profile
(per shell bash) in modo che le variabili di ambiente ssh-agent
impostate vengano incorporate completamente nel proprio ambiente.
Sul mio sistema Fedora 14 si avvia abbastanza presto come parte del sottosistema X11. In questo file /etc/X11/xinit/xinitrc-common
,:
# Prefix launch of session with ssh-agent if available and not already running.
SSH_AGENT=
if [ -z "$SSH_AGENT_PID" ] && [ -x /usr/bin/ssh-agent ]; then
if [ "x$TMPDIR" != "x" ]; then
SSH_AGENT="/usr/bin/ssh-agent /bin/env TMPDIR=$TMPDIR"
else
SSH_AGENT="/usr/bin/ssh-agent"
fi
fi
La variabile $SSH_AGENT
viene quindi utilizzata in altri script di avvio X11 come qui /etc/X11/xinit/Xclients
:
exec -l $SHELL -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"
Incorporandolo qui, le seguenti variabili d'ambiente vengono impostate come parte di una shell genitore, quindi anche tutti i figli biforcati dovrebbero averle, ad esempio:
SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;
C'è un po 'più di complessità in questo, ma in poche parole questo è fondamentalmente quello che sta succedendo ssh-agent
.
Ad esempio in GNOME, ssh-agent
viene effettivamente avviato per utente come applicazione di avvio:
TL; DR
In conclusione, ssh-agent
esiste in modo tale che quando sono necessarie le chiavi ssh è necessario sbloccarle una sola volta con la loro passphrase (supponendo che ne abbiano una), e da quel momento in poi sono disponibili nella loro forma decifrata in memoria (RAM).