qual é o propósito do ssh-agent?

70

Eu li a definição oficial:

O ssh-agent é um programa para armazenar chaves privadas usadas para autenticação de chave pública (RSA, DSA, ECDSA). A idéia é que o ssh-agent seja iniciado no início de uma sessão X ou de sessão de logon e todas as outras janelas ou programas sejam iniciados como clientes do programa ssh-agent. Através do uso de variáveis ​​de ambiente, o agente pode ser localizado e usado automaticamente para autenticação ao efetuar login em outras máquinas usando o ssh (1).

"..um programa para armazenar chaves privadas .." - IMHO - chaves ssh são geradas pelo usuário com o comando ssh-keygen e armazenadas de forma simples e direta em ~ / .ssh - por que preciso de um daemon para armazenar essas chaves? Como exatamente eles os mantêm de qualquer maneira - eles não são armazenados apenas no .ssh?

"são iniciados como clientes do programa ssh-agent" - não entendi. Onde alguém precisaria disso? Eu costumo usar ssh assim:

 ssh -i ~/.ssh/private_key_name username@hostname

O que exatamente significa manual com "clientes" - quais clientes? Você não apenas executa o comando ssh do terminal para conectar-se - quais outros clientes existem e por que eles não podem simplesmente usar um caminho para esse arquivo privado ssh, assim como o comando ssh?

agent_smith
fonte

Respostas:

76

O agente SSH lida com a assinatura de dados de autenticação para você. Ao se autenticar em um servidor, é necessário assinar alguns dados usando sua chave privada, para provar que você é.

Como medida de segurança, a maioria das pessoas protege sensivelmente suas chaves privadas com uma senha, portanto, qualquer tentativa de autenticação exigiria a inserção dessa senha. Isso pode ser indesejável; portanto, o ssh-agent armazena em cache a chave para você e você só precisa digitar a senha uma vez, quando o agente desejar descriptografá-la (e muitas vezes nem isso, pois o ssh-agent pode ser integrado ao pam, que muitas distros fazem).

O agente SSH nunca entrega essas chaves aos programas clientes, mas apenas apresenta um soquete sobre o qual os clientes podem enviar dados e sobre os quais responde com dados assinados. Um benefício colateral disso é que você pode usar sua chave privada mesmo em programas nos quais não confia totalmente.

Outro benefício do agente SSH é que ele pode ser encaminhado por SSH. Portanto, quando você ssh para hospedar A, enquanto encaminha seu agente, você pode ssh de A para outro host B sem precisar da sua chave presente (nem mesmo na forma criptografada) no host A.

Dennis Kaarsemaker
fonte
10
Sinto que esta é a resposta mais completa, mas ainda falta um ponto. O uso de um agente de chave também permite o uso de várias chaves facilmente. Em vez de precisar especificar o caminho para a chave, ao usar um agente de chave, o ssh tentará todas as chaves nele.
22413 Patrick
3
@Patrick, que também pode ser sua desvantagem - tente muitas chaves inválidas em um servidor e ele fechará a conexão antes de você chegar à chave válida. Claro, isso é o que ~/.ssh/config's IdentityFileopção é boa para, com ou sem o agente
Tobias KIENZLER
@Patrick que parece igualmente possível sem um agente
Andrey Fedorov
@AndreyFedorov Sim, você pode ter várias chaves sem um agente, mas também pode especificar em ~/.ssh/configqual chave usar para qual host remoto, para que ele saiba exatamente qual precisa.
223 Patrick Patrick
3
então, pode-se supor que isso ssh-agentnão é necessário se uma chave privada não estiver protegida por uma senha.
Pkaramol 17/10/19
16

O benefício ssh-agenté que você só precisa digitar sua senha uma vez. Se sua chave RSA privada não estiver criptografada com uma senha, o ssh-agent não será necessário. O sshcomando seria um exemplo de um cliente.

jordanm
fonte
7

Se você estiver rotineiramente sshem uma variedade de máquinas diferentes, cada uma com sua própria chave e senha, a execução ssh-agentpermitirá digitar a senha para cada chave uma vez 1 no início da sessão e você poderá se autenticar em cada máquina quantas vezes como quiser, sem precisar digitar novamente sua senha.

Um benefício adicional é que, conforme a manpágina, o agente nunca envia uma chave privada pelo canal de solicitação; portanto, se você estiver pulando entre caixas diferentes, suas chaves privadas serão protegidas.

1 Você pode definir o lifetempo em que as chaves são mantidas no agente.

jasonwryan
fonte
6

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/.bashrcou $HOME/.profile(para shells bash), para que as variáveis ​​de ambiente ssh-agentdefinidas 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:

                     ss de aplicativos de inicialização

TL; DR

Resumindo, ssh-agentexiste 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).

slm
fonte
1

"são iniciados como clientes no programa ssh-agent" refere-se à idéia de que o ssh-agent é iniciado durante a inicialização da sessão de login (local) para que todos os programas obtenham as variáveis ​​de ambiente $SSH_AGENT_PIDe $SSH_AUTH_SOCKque sejam necessárias para conectar o agente.

Outra vantagem de remover a manipulação de chave privada do ssh é que o ssh-agent pode ser substituído pelo gpg-agent. Assim, você pode usar chaves OpenPGP (com capacidade de autenticação) para SSH. Essa é uma boa solução para chaves OpenPGP em um cartão inteligente.

Hauke ​​Laging
fonte