artigo da Wikipédia provavelmente tem a melhor descrição:
The verification to the server is based on challenge-response
authentication. ssh connects to the server with a user name and the
request for a key. The ssh daemon gets the request and sends back a
challenge based on the public key stored in the authentication file.
ssh uses the private key to construct a key response, and sends it to
the waiting sshd on the other end of the connection. It does not send
the private key itself. The ssh daemon validates the key response, and
if valid, grants access to the system. ssh-agent simplifies this by
creating a socket that listens for SSH connections. The user simply
starts ssh-agent, telling it how to find their keys (if they are not
in the default location), enters the passphrase for each key to be
used, on a one-time basis, and then ssh-agent handles the rest every
time the user connects to a remote server.
Novamente textualmente do artigo da Wikipédia:
... ssh-agent creates a socket and then checks the connections from ssh.
Everyone who is able to connect to this socket also has access to the
ssh-agent. The permissions are set as in a usual Linux or Unix system.
When the agent starts, it creates a new directory in /tmp with
restrictive permissions. The socket is located in the folder.
Normalmente, ele é colocado em um sistema ou em arquivos rc do usuário, como $HOME/.bashrc
ou $HOME/.profile
(para shells bash), para que as variáveis de ambiente ssh-agent
set sejam incorporadas completamente em seu ambiente.
No meu sistema Fedora 14, ele é iniciado muito cedo como parte do subsistema X11. Neste arquivo, /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
A variável $SSH_AGENT
é então usada em outros scripts de inicialização do X11, como aqui, /etc/X11/xinit/Xclients
:
exec -l $SHELL -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"
Ao incorporá-lo aqui, as seguintes variáveis de ambiente estão sendo definidas como parte de um shell pai, portanto, todos os garfos bifurcados também devem tê-los, por exemplo:
SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;
Há um pouco mais de complexidade nisso, mas em poucas palavras, isso é basicamente o que está acontecendo com ssh-agent
.
Por exemplo, no GNOME, ssh-agent
é realmente lançado por usuário como um aplicativo de inicialização:
TL; DR
Linha de fundo, ssh-agent
existe para que, quando as chaves ssh forem necessárias, você só precise desbloqueá-las uma vez com a frase secreta (supondo que elas tenham uma), e a partir de então elas estarão disponíveis em sua forma descriptografada (RAM).