Evite adicionar separadamente chaves ssh (com senha) às sessões de shell

5

Nota: Adicionar algumas linhas ao .<name of shell>rc não resolverá o problema aqui, uma vez que essa chave ssh em particular possui uma senha e isso não eliminaria a necessidade de continuar digitando-a.

Então, eu realmente não entendo como ssh-agent funciona sob o capô. Eu só uso ssh-agent e ssh-add ~/.ssh/id_rsa toda vez que eu preciso adicionar uma chave para acessar algum recurso remoto. Uma vez que adicionei a chave uma vez, não preciso adicioná-la novamente para a mesma "sessão de shell" ("sessão de shell" provavelmente não é o jargão apropriado).

Infelizmente, estou criando novas sessões de shell o tempo todo. Estou executando o zsh sob o tmux no OS X e tenho uma chave ssh chamada de creativo id_rsa . Essa chave ssh tem uma senha associada a ela.

Toda vez que eu inicio um novo shell eu tenho que fazer o seguinte

$ eval 'ssh-agent'
$ ssh-add ~/.ssh/id_rsa
<type password>

que é realmente irritante.

Eu observei na saída de ssh-agent que a variável de ambiente SSH_AGENT_PID é diferente a cada vez. Meu palpite é que essa variável de ambiente e o SSH_AUTH_SOCK são a razão pela qual as chaves não precisam ser adicionadas novamente em uma única sessão do shell. Quando eu chamar o programa ssh , ele usará essas variáveis de ambiente para se comunicar com o ssh-agent e a autenticação será bem-sucedida.

Gostaria de saber se há uma maneira de compartilhar ssh-agent s entre as sessões. Talvez a abordagem correta seja adicionar minhas chaves SSH antes de iniciar tmux e configurar tmux para preservar as variáveis de ambiente SSH_AUTH_SOCK e SSH_AGENT_PID . Eu realmente não tenho certeza. Qual é a maneira padrão de resolver este problema?

    
por Gregory Nisbet 29.07.2016 / 20:25

5 respostas

5

A maneira como o ssh-agent deve funcionar é que você tem um agente por sessão. O agente começa e termina com a sessão.

Uma sessão é iniciada quando você efetua login, não quando você abre um terminal ou quando inicia um shell. Executar sistematicamente ssh-agent como parte do script de inicialização do seu shell está definitivamente errado.

Eu não sou um usuário do OSX, então pode estar faltando alguma coisa, mas, no meu entendimento, em versões não antigas do OSX (desde 10.5), o SSH é integrado com o keychain do OSX. Portanto, você não deve executar ssh-agent . A variável SSH_AUTH_SOCK deve apontar para um soquete launchd (o launchd fornece um serviço ssh-agent). Veja Como usar o Mac OS X Keychain com chaves SSH? e

Se você quiser ficar com ssh-agent por algum motivo e quiser ter um único agente para todas as sessões (o que também faz sentido), você pode usar um caminho fixo para o soquete SSH. (Eu fiz isso no Windows.) Em seu .profile , defina SSH_AUTH_SOCK para um caminho fixo e inicie ssh-agent se ainda não estiver em execução.

export SSH_AUTH_SOCK=~/.ssh/auth_sock
if ! fuser "$SSH_AUTH_SOCK" >/dev/null 2>/dev/null; then
  # Nothing has the socket open, it means the agent isn't running
  ssh-agent -a "$SSH_AUTH_SOCK" -s >~/.ssh/agent-info
fi

Observe que meu código não tenta matar o agente. Se você quiser matar o agente quando fizer logout, adicione uma instrução kill aos seus scripts de logout. Claro, se você matar todos os processos em execução como usuário, isso inclui o agente.

    
por 30.07.2016 / 02:11
2

Aqui está um pequeno trecho dos meus scripts de login para lidar com o que você quer:

SSHAF=$HOME/.ssh_agent_env
[ -f $SSHAF ] && . $SSHAF

# if ssh-agent not really running?
if [ -n "$SSH_AGENT_PID" ] && ! kill -0 $SSH_AGENT_PID >/dev/null
then ssh-agent >$SSHAF 
     . $SSHAF
     ssh-add # add list of more keys here if needed
fi

Explicado: Estou salvando as variáveis de configuração do ambiente do ssh-agent em um arquivo de ponto em $ HOME (.ssh_agent_env) Eu busco esse arquivo se ele existir (linha 2) para obter o id do processo (possivelmente) executando o ssh-agent. (Variável SSH_AGENT_PID) Se essa variável SSH_AGENT_PID estiver configurada, eu verifico se o agente está sendo executado com um kill -0 em seu PID (kill -0 define o código de retorno para 0 (true) se o processo estiver em execução, 1 (false) caso contrário. Se o agente não estiver em execução, inicie-o e salve a saída no arquivo .ssh_agent_env, forneça esse arquivo para adicionar os valores à minha sessão de shell e execute o ssh-add para armazenar em cache minhas chaves.

Na primeira vez no sistema, não existe nenhum arquivo para que o agente seja iniciado. A qualquer momento após a existência do arquivo, verificamos se o agente está em execução. Se não fizermos uma startup.

Observação: esta é a implementação em execução da solução 2 da primeira resposta acima.

    
por 29.07.2016 / 22:11
1

A variável primária é a variável SSH_AUTH_SOCK ; o SSH_AGENT_PID é usado apenas com ssh-agent -k para eliminar o agente em execução.

Portanto, a abordagem padrão é executar ssh-agent , depois ssh-add de suas chaves e, em seguida, executar tmux .

Agora, a parte divertida disso é que você pode reconectar ao daemon tmux e a sessão do agente ssh ainda estará lá e em execução. Assim, você pode fazer coisas como desconectar, efetuar logout, fazer login novamente, reconectar-se ao tmux em execução e não precisar digitar novamente sua senha de chave.

(Isso é bom em uma máquina de usuário único; não é tão bom em uma máquina compartilhada porque o usuário root pode abusar de suas chaves!)

    
por 29.07.2016 / 20:49
1

O ideal é que você inicie ssh-agent apenas uma vez e execute ssh-add apenas uma vez, e os shells subsequentes herdarão o agente.

Se você estiver efetuando login por meio de uma GUI e seu gerenciador de janelas usar .xsession ou .xinitrc , você poderá adicionar o seguinte ao arquivo:

if [ -z "$SSH_AUTH_SOCK" ]; then
  eval $(ssh-agent)
  ssh-add
fi

Isso significa que o agente será herdado para qualquer processo ( xterm ou outro emulador de terminal) gerado pelo gerenciador de janelas.

Se você trabalha sem o X11, fique feliz um pouco porque você é incrível e adicione essas linhas ao script de inicialização .bash_profile ou .profile .

O eval pegará a saída de ssh-agent e a avaliará no shell atual, configurando SSH_AUTH_SOCK e SSH_AGENT_PID para quaisquer valores. Então ssh-add será executado, praticamente como você está fazendo manualmente. O agente será então herdado pela sessão tmux que você provavelmente iniciará logo após o login (a menos que você tenha definido tmux como seu shell de login real, o que é possível).

Em um mundo perfeito, você só tem um agente SSH em execução e não terá que fornecer senhas novamente ... até efetuar o logout e login novamente ou efetuar login em outro console.

    
por 29.07.2016 / 21:43
1

Basicamente, o que ssh-agent faz é que ele inicia em segundo plano e imprime várias variáveis de ambiente que o utilitário ssh client usa para saber como alcançar o agente (principalmente o caminho do soquete em %código%). Se você iniciar o agente novamente, obterá várias cópias em execução, mas normalmente poderá alcançar apenas uma a partir de um único shell ... (verifique com algo como SSH_AUTH_SOCK para ver quantas estão sendo executadas.) Quando ps uax | grep agent é executado , entra em contato com o agente e pede para ele ler uma chave na memória. Depois disso, todos os clientes ssh-add que se conectarem à mesma instância de ssh poderão tirar proveito da chave salva.

Algumas opções para executar apenas um ssh-agent :

1) Inicie o ssh-agent antes de iniciar sua ssh-agent session (ou tmux para essa questão). As variáveis de ambiente definidas nesse ponto devem ser herdadas para todos os shells executados em screen ou tmux . (Eu não sei se screen precisa de configuração especial para não limpar variáveis de ambiente.)

Eu estive (com o tipo errado de) preguiçoso, então eu fiz isso manualmente toda vez antes de iniciar minha tmux sessão, mas seria fácil criar um script para iniciar o agente e depois o screen / screen session.

Se você considerar algo como um ambiente de área de trabalho gráfico, você deve iniciar o agente quando o DE for iniciado, se possível, para que as variáveis de ambiente estejam disponíveis para qualquer terminal que você iniciar.

2) Seu sistema já pode iniciar um tmux quando você efetuar login. Nesse caso, você deve poder apenas ssh-agent de chaves sem iniciar uma nova cópia do agente. Em particular, o OS X inicia um agente ao efetuar login e modificou as ferramentas SSH que solicitam a frase secreta da chave por meio da GUI e salva automaticamente as chaves usadas no comando ssh-add no agente. Você também pode usar ssh como de costume.

3) Se você quiser usar um único agente a partir de shells completamente separadas (e, portanto, não pode herdar as variáveis de ambiente), verifique se o agente está sendo executado a partir dos scripts de inicialização do shell e inicie-o. Salve o endereço do soquete do agente em um arquivo ou use um caminho fixo para o soquete.

Em qualquer caso, o problema é apontar as variáveis de ambiente para o mesmo ssh-add . Todas as chaves que você adicionar a uma instância do agente devem estar visíveis para todos os usuários do mesmo agente, independentemente de de qual shell você foissh-agent.

Como um aparte, ssh-add pode pegar um argumento para definir quanto tempo as chaves devem ser salvas: executar ssh-add dirá ao agente para esquecer a chave após uma hora. Isso pode ser útil para reduzir o tempo durante o qual as chaves não são criptografadas na memória.

    
por 29.07.2016 / 20:45