usando o ssh-agent

2

Eu tenho meu desktop no escritório. Quando X for iniciado, ssh-agent será iniciado automaticamente. Eu tenho que adicionar meu SSH key uma vez, no começo, e então eu posso usar ssh sem precisar digitar minha senha toda vez.

No entanto, quando me conecto à minha área de trabalho por meio de SSH (ou seja, de casa), o ssh-agent não está acessível e preciso fornecer minha chave todas as vezes. Além disso, mesmo se eu iniciar uma nova instância de ssh-agent , ainda não consigo me conectar a ela.

Existe uma maneira de usar ssh-agent em um sistema remoto (ao qual estou conectado via ssh ?

    
por user1968963 21.04.2014 / 15:33

2 respostas

1

Você pode usar o encaminhamento de agentes: inclua ForwardAgent yes na configuração do lado do cliente ( ~/.ssh/config ) ou use a opção de linha de comando -A . (Esse recurso pode ser desabilitado no lado do servidor ( AllowAgentForwarding in sshd_config ), mas isso é útil somente para contas restritas que não podem executar comandos shell arbitrários.) Dessa forma, todas as chaves de sua máquina local estão disponíveis no sessão remota. Observe que ativar o encaminhamento do agente no lado do cliente tem implicações de segurança: ele fornece ao administrador do computador remoto acesso às chaves (por exemplo, se você estiver em A e tiver uma chave para B e uma chave para C e ativar o encaminhamento de agente) em sua conexão com B, então isso permite que B acesse suas chaves e, portanto, faça o login em C).

Se você quiser disponibilizar o agente de sua sessão X na máquina do escritório nas sessões SSH de casa, será necessário definir a variável de ambiente SSH_AUTH_SOCK para apontar para o mesmo arquivo da sessão X. É fácil de fazer manualmente:

export SSH_AUTH_SOCK=/tmp/ssh-XXXXXXXXXXXX/agent.12345

em que XXXXXXXXXXXX é uma cadeia aleatória e 12345 é o PID do processo do agente. Você pode automatizar isso facilmente se houver um único agente em execução ( find /tmp -maxdepth 1 -user $USER -name 'ssh-*' ), mas detectar qual agente você deseja se houver diversos é mais complicado.

Você pode extrair o valor de SSH_AUTH_SOCK de um processo em execução. Por exemplo, no Linux, se o seu gerenciador de janelas for o Metacity (o gerenciador de janelas padrão do Gnome):

env=$(grep -z '^SSH_AUTH_SOCK=' /proc/$(pidof -s metacity)/environ')
if [ -n "$env" ]; then export "$env"; fi

Como alternativa, você pode configurar sua máquina de escritório para usar um único agente SSH. Se o agente for iniciado automaticamente quando você efetuar login, na maioria das distribuições, ele não será iniciado se já houver uma variável chamada SSH_AUTH_SOCK no ambiente. Portanto, adicione uma definição de SSH_AUTH_SOCK ao seu ~/.profile ou ~/.pam_environment e inicie manualmente ssh-agent , se ainda não tiver sido iniciado em .profile :

export SSH_AUTH_SOCK=~/.ssh/$HOSTNAME.agent
if [ -z "$(pgrep -U "$USER" ssh-agent)" ]; then
  ssh-agent >/dev/null
fi
    
por 22.04.2014 / 04:10
3

No seu shell remoto, basta executar:

ssh-agent bash

Dessa forma, você obtém uma nova instância do agente SSH e um novo shell bash com as variáveis de ambiente necessárias definidas. Quando você deixa o shell com exit ou logout , o agente SSH também sai.

Se você tiver as mesmas chaves disponíveis no dispositivo que está usando diretamente, você também pode usar ssh -A para tornar o agente local acessível ao shell remoto recém-iniciado . Isso tem algumas implicações de segurança, mas se você tiver a chave disponível nos dois dispositivos, não há diferença.

Quando você deseja se conectar a um agente existente, é necessário configurar as variáveis de ambiente relevantes exatamente como elas estão configuradas no seu shell gráfico. Pode ser conveniente usar um recurso de início automático de sua sessão GUI para armazenar as variáveis em algum lugar. Você pode obter as variáveis de ambiente usando env .

env | grep SSH

Para acessar o agente, você basicamente precisa apenas de SSH_AUTH_SOCK . O SSH_AGENT_PID é usado para enviar sinais ao agente e outras variáveis do SSH são usadas para ferramentas auxiliares.

Você também pode acessar o ambiente de outros processos via /proc/*/environ . Os itens são terminados em NUL não terminados em LF, no entanto. Eu acredito que o método de arquivo é preferível neste caso.

    
por 21.04.2014 / 17:17