ssh-paralelo com chave SSH protegida por senha

8

Gostaria de usar minha chave SSH protegida por senha ao executar tarefas com parallel-ssh(e ferramentas relacionadas). No entanto, não consigo fazer isso funcionar.

Toda a documentação a respeito parallel-sshmostra que devo poder usar --askpassou -Afazer isso:

-A
--askpass
      Prompt  for  a  password  and pass it to ssh.  The password may be 
      used for either to unlock a key or for password authentication.  The 
      password is transferred in a fairly secure manner (e.g., it will not 
      show up in argument lists).  However, be aware that a root user on 
      your system could potentially intercept the password.

No entanto, quando digito a senha da minha chave, ela não funciona:

$ parallel-ssh --hosts=machines --user=my_user --askpass \
    --timeout=0 --inline -v 'sudo apt-get update'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: 
[1] 09:59:36 [FAILURE] amritiii Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[2] 09:59:37 [FAILURE] gbdev Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[3] 09:59:37 [FAILURE] code Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[4] 09:59:37 [FAILURE] apollo Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[5] 09:59:37 [FAILURE] odin Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[6] 09:59:37 [FAILURE] hathor Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[7] 09:59:37 [FAILURE] ldap Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[8] 09:59:37 [FAILURE] thor Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).
[9] 09:59:37 [FAILURE] bioserver Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa': 
Permission denied (publickey,password).

Confirmei que minha chave e senha SSH funcionam em cada uma das máquinas, por isso não faço ideia de como fazer isso funcionar.

Nathan S. Watson-Haigh
fonte
Estou assumindo que ssh-paralelo é o mesmo que pssh?
slm
Sim, parallel-sshe psshsão realmente os mesmos.
Nathan S. Watson-Haigh

Respostas:

5

Supondo que parallel-sshe psshsejam equivalentes, então sim, o que você está tentando fazer deve funcionar muito bem com o uso da chave na frase secreta -A.

Exemplo

Aqui está um exemplo em que eu me conecto a 2 sistemas diferentes host1e host2. Eu uso a -lopção psshpara fornecer um usuário padrão de root. No entanto, host2eu substituo isso no -Hcomutador especificando o nome do host como user1@host2.

$ pssh -A -i -H "host1 user1@host2" -l root 'echo "hi"'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: 
[1] 21:38:00 [SUCCESS] user1@host2
hi
Stderr: 
This is a private site.  Unauthorized connections are prohibited.  
All activity may be logged.  Disconnect immediately if you object to 
this policy or are not an authorized user.

X11 forwarding request failed on channel 1
Killed by signal 1.
[2] 21:38:00 [SUCCESS] host1
hi
Stderr: 
This is a private site.  Unauthorized connections are prohibited.  
All activity may be logged.  Disconnect immediately if you object to 
this policy or are not an authorized user.

ControlSocket /home/user1/.ssh/[email protected]:22 already exists, disabling multiplexing
X11 forwarding request failed on channel 0
Killed by signal 1.

Quando o procedimento acima funcionar, você notará a saída do comando que estou executando echo "hi",.

Seu problema

O problema que você está enfrentando com uma senha no seu par de chaves SSH é devido a um bug. Este é o bug intitulado: Edição 80: Não passa a senha? . O quarto comentário a esse problema mostra um patch:

excerto

# 4 robine ... @ gmail.com

Eu mudei a linha para

  if not ( prompt.strip().lower().endswith('password:') or 
        'enter passphrase for key' in prompt.strip().lower()):

E parece que funciona

Referências

slm
fonte
Obrigado pela sua entrada slm. parallel-sshe psshsão de fato os mesmos. Não estava perguntando se era possível - a documentação deixa claro que é possível. Estou tendo problemas para realmente fazê-lo funcionar como está documentado.
Nathan S. Watson-Haigh
1
@ NathanS.Watson-Haigh - veja a atualização. É um bug, eu atualizei o patch.
slm
Este é realmente o problema que está me afetando. No entanto, como os autores de parallel-sshainda não sabem qual a melhor forma de detectar a pergunta do prompt de senha e, assim, responder com a senha / frase inserida, eu continuarei com meu método de chaveiro. Eu não gostaria que minha frase secreta fosse inadvertidamente revelada para o prompt de pergunta errada.
Nathan S. Watson-Haigh
1
Aceitarei isso como a resposta, pois você conseguiu descobrir que esse era um bug conhecido na maneira como parallel-sshpassa a senha SSH. No entanto, para aqueles que se depararem com essa questão no futuro, esse bug pode ter sido corrigido ou você pode optar por não editar o askpass_client.pyarquivo. Em ambos os casos, você pode contornar isso usando a keychainresposta ( unix.stackexchange.com/a/128998/57414 ) ou a resposta ssh-agent ( unix.stackexchange.com/a/129022/57414 )
Nathan S. Watson- Haigh
5

Eu consegui fazer isso funcionar instalando, em keychainvez de corrigir manualmente o bug, causando meus problemas.

Instalar e executar manualmente o chaveiro

# install keychain package
$ sudo apt-get install keychain

# add my key to the keychain, entering passphrase when asked
$ keychain ~/.ssh/id_rsa

# source the file generated by the above command
$ . ~/.keychain/$(uname -n)-sh

Executar comando sem entrada de senha / senha

Agora, desta vez, não preciso da minha senha ao chamar, parallel-sshpois o chaveiro cuida da autenticação:

$ parallel-ssh --hosts=machines --user=my_user --timeout=0 'sudo apt-get update'
[1] 14:52:15 [SUCCESS] amritiii 
[2] 14:52:17 [SUCCESS] odin
[3] 14:52:25 [SUCCESS] gmod
[4] 14:53:11 [SUCCESS] bioserver
[5] 14:53:14 [SUCCESS] thor
[6] 14:53:14 [SUCCESS] apollo
[7] 14:53:16 [SUCCESS] gbdev
[8] 14:53:17 [SUCCESS] code
[9] 14:53:18 [SUCCESS] hathor
[10] 14:53:34 [SUCCESS] ldap

Executar chaveiro no login

Em vez de precisar executar manualmente e adicionar sua chave ao chaveiro, basta adicionar o seguinte ao final do seu ~/.bash_profile:

$ keychain --clear $HOME/.ssh/id_rsa
$ . $HOME/.keychain/$(uname -n)-sh

Isso garante que, no seu primeiro login, após uma reinicialização, você seja solicitado a senha da sua chave. Sua chave permanecerá no chaveiro até a próxima reinicialização ou você limpará o chaveiro manualmente.

Empregos Cron usando o chaveiro

Com o texto acima inserido em seu ~/.bash_profilearquivo, você pode aproveitar o fato de que sua chave está agora armazenada no chaveiro, agregando o mesmo arquivo antes que seu cronjob seja executado. Por exemplo, eu tenho um script de backup que é executado às 21:00 todas as noites e copia coisas para um computador remoto via SSH. Esta é uma entrada no meu crontab ( crontab -e):

 0 21 * * * . $HOME/.keychain/$(uname -n)-sh; $HOME/backup_script.sh
Nathan S. Watson-Haigh
fonte
1

Use o ssh-agent para se autenticar automaticamente (com um nome de shell como argumento para definir as variáveis ​​de ambiente do agente nesse novo shell). Adicione a chave com ssh-add e digite sua senha apenas uma vez.

$ ssh-agent bash
$ ssh-add
Enter passphrase for /xxxx/.ssh/identity: 
$ 
$ pssh ...
Emmanuel
fonte