Como obter a senha da chave SSH uma vez e somente quando necessário?

14

(Eu li muitas das perguntas neste site que parecem relacionadas e acredito que esta é uma questão genuinamente nova.)

Eu tenho muitas chaves em muitos servidores e todos eles são protegidos com senhas.

Eu gosto de inserir senhas tanto quanto eu gosto de inserir senhas - é um dreno real de produtividade.

    Os comandos
  • ssh-agent + ssh-add podem ser usados em um shell de login para significar que você só precisa inserir sua senha uma vez no login

  • keychain pode ser usado para manter um ssh-agent ativo além do logout, então, por exemplo, você pode tê-lo para que você tenha que digitar a senha uma vez no boot, ou você pode ter mantenha-o vivo por uma hora ou mais.

O problema que tenho é que ambas as soluções normalmente são iniciadas em um login de shell (por exemplo, .zshrc ) confiam em eu inserir minha senha quando efetuo login, mesmo que eu não precise dela desbloqueada. (Eu não estou feliz com chaveiro manter um agente vivo indefinidamente.)

O que eu gostaria é que seja solicitada uma frase secreta (para um agente) somente quando necessário .

Para que eu possa fazer login no servidor A, fazer algumas coisas, então ssh para o servidor B e nesse ponto será solicitado a senha. Faça algumas coisas no servidor B, saia. De volta ao A, faça mais algumas coisas, ssh para B novamente e não precise da minha senha (ela é mantida por um agente).

Noto que isso é possível em computadores gráficos como o Gnome - você recebe um pop-up pedindo a frase secreta para desbloquear sua chave privada assim que você tentar fazer o ssh. Então é isso que eu estou procurando depois de um console.

    
por artfulrobot 20.01.2015 / 16:53

3 respostas

6

Zsh possui um preexec hook que executa uma função antes que um comando digitado na linha de comando seja executado. Aqui está um gancho que procura por ssh em sua linha de comando e, se encontrado, verifica a existência de um agente ssh. Se isso não for encontrado, ele executa o keychain.

Desta forma, o keychain é executado apenas antes dos comandos ssh, e somente se necessário.

Coloque isso no seu ~/.zshrc :

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval 'keychain --eval id_dsa --timeout 60'
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

O que acontece aqui é sempre que um comando é digitado, check_ssh é chamado antes do comando ser executado.

A primeira linha da função verifica o comando expandido para ssh usando um regex Zsh. ssh deve ter limites de palavras \b em ambos os lados. Se isso não for encontrado, a função retornará.

A próxima linha verifica se há um processo do agente SSH na variável de ambiente, e se esse processo existe na tabela de processos ainda e, em seguida, que pelo menos uma chave foi adicionada ao agente. Se tudo isso estiver correto, então o agente ssh está configurado e não precisamos fazer nada, então ele retorna.

Finalmente, começamos o chaveiro, com o agente a ser mantido vivo por uma hora.

Ele ainda deixa o problema sobre o material ssh incorporado, como git ou rsync ou scp , pois isso não acionará a função (você pode adicioná-los à regex).

    
por 21.01.2015 / 17:17
11

Não adicione nada a nenhum dos scripts de inicialização do seu shell, isso é hackery desnecessário.

Em vez disso, adicione

AddKeysToAgent yes

para o seu .ssh / config

Assim, o ssh-add é executado automaticamente na primeira vez que você faz o ssh em outra caixa. Você só precisa inserir novamente sua chave quando ela expirar do agente ssh ou após a reinicialização.

    
por 30.10.2016 / 21:47
2

Para o zsh, escrevi um conjunto de utilitários e wrappers para fazer mais ou menos o que você deseja: link

Na verdade, isso faz ainda mais, porque o ssh-agent será compartilhado por todas as sessões de login (desktop ou via SSH, e o GNU Screen também é suportado se você iniciar shells de login, por exemplo com shell -zsh no ~/.screenrc file), e ele será encerrado somente após o término da última sessão.

Nota: eu uso apenas uma frase-senha para todas as minhas chaves. Não tenho certeza do comportamento de senhas diferentes; pode precisar de algumas mudanças.

    
por 20.01.2015 / 18:40

Tags