O artigo da Wikipedia provavelmente tem a melhor descrição:
A verificação para o servidor é baseada na autenticação de desafio-resposta. O ssh se conecta ao servidor com um nome de usuário e a solicitação de uma chave. O daemon ssh recebe a solicitação e envia de volta um desafio com base na chave pública armazenada no arquivo de autenticação. O ssh usa a chave privada para construir uma resposta de chave e a envia para o sshd em espera na outra extremidade da conexão. Ele não envia a chave privada em si. O daemon ssh valida a resposta da chave e, se válido, concede acesso ao sistema. O ssh-agent simplifica isso criando um soquete que escuta conexões SSH. O usuário simplesmente inicia o ssh-agent, informando como encontrar suas chaves (se elas não estiverem no local padrão), digita a senha para cada chave a ser usada, uma única vez,
Novamente, literalmente, no artigo da Wikipedia:
... ssh-agent cria um soquete e depois verifica as conexões do ssh. Todo mundo que é capaz de se conectar a esse soquete também tem acesso ao ssh-agent. As permissões são definidas como em um sistema Linux ou Unix comum. Quando o agente é iniciado, ele cria um novo diretório em / tmp com permissões restritivas. O soquete está localizado na pasta
Normalmente, ele é inserido nos arquivos rc de um sistema ou do usuário, como $HOME/.bashrc
ou $HOME/.profile
(para shells bash), para que as variáveis de ambiente ssh-agent
definidas sejam incorporadas completamente ao 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 filhos 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, é basicamente isso que está acontecendo ssh-agent
.
Por exemplo, no GNOME, ssh-agent
é realmente iniciado por usuário como um aplicativo de inicialização:
TL; DR
Resumindo, ssh-agent
existe para que, quando suas chaves ssh forem necessárias, você só precise desbloqueá-las uma vez com a senha (supondo que elas tenham uma) e, a partir de então, elas estejam disponíveis na forma descriptografada na memória (RAM).