Como adicionar host conhecido SSH em um script bash?

13

Estou criando um script bash para provisionar um novo servidor no qual eu possa implantar um aplicativo Web. Uma coisa que eu sempre tenho que fazer é usar o GitHub como um host conhecido ssh [email protected]. Como posso automatizar esse processo em um script bash e fazê-lo de maneira idempotente?

Andrew
fonte

Respostas:

17

O caminho mais simples a seguir seria fazer algo assim.

ssh-keyscan remote_server >>~/.ssh/known_hosts

Se essa caixa for nova, também será necessário criar o ~/.sshdiretório antes de executar o ssh-keyscan .

Lembre-se de que o ssh-keyscan pode receber um número arbitrário de nomes de host. Ele receberá todas as chaves possíveis.

Zoredache
fonte
1
PS - Para provisionamento, você deve usar algo como fantoche em vez de um script bash. Para fantoches, isso pode ser facilmente manipulado com o recurso sshkey . Veja também esta pergunta para um método para gerenciar os known_hosts en-masse serverfault.com/a/416782/984
Zoredache
2
Isso com certeza me pareceu bom, mas depois de passar algumas horas cada em bonecos e concorrentes, corri de volta para bash scripts e sanidade. Se essas ferramentas são intuitivas, aparentemente não tenho intuição. YMMV.
precisa
Use bash. Eu sempre me deparo com problemas em diferentes versões de coisas como fantoche ou ansible. Sempre voltamos ao bash ... 3 empresas funcionando agora dessa forma e o bash são sempre confiáveis ​​para nós.
Ligemer 21/09/16
4

Você está tentando automatizar a aceitação da nova chave? Nesse caso, você pode usar -oStrictHostKeyChecking = no.
Fazer isso é uma péssima idéia, pois agora você está completamente aberto a ataques do tipo man-in-the-middle.

Uma opção melhor seria apenas gerenciar um arquivo known_hosts e reutilizá-lo quando você provisionar novos servidores. Cole-o no github e escreva um script simples para fazer o download desse arquivo antes de sshing no github.

A verificação rigorosa da chave do host é uma coisa boa.

yoonix
fonte
Você pode elaborar sobre o "gerenciar arquivo unknown_hosts"? Eu acho que é isso que eu quero fazer, mas quando eu vi o arquivo, seu conteúdo parecia algum tipo de hash / chave e não parecia algo que deveria ser gerenciado manualmente.
Andrew
2
Provisione um novo servidor, manualmente ssh no github como você faria. Aceite a chave do host quando solicitado. Sair. Copie ~ / .ssh / known_hosts desse servidor recém-provisionado em outro lugar (github, servidor web, não importa, contanto que você possa obtê-lo). Da próxima vez que você provisionar um servidor, copie esse arquivo novamente antes de sshing para o github. Você não precisa editar o arquivo.
Yoonix
Isso é melhor do que minha resposta (mais segura). Uma melhoria adicional na resposta do yoonix é analisar o 'ssh-keyscan github.com' e armazenar a chave retornada em ~ / .ssh / known_hosts, para que não seja estática em um arquivo em algum lugar que você precise atualizar.
Sirex
Isso funcionaria também, mas eu não consideraria melhor. Você está potencialmente se preparando para um ataque man-in-the-middle se estiver sempre pegando uma nova chave de host.
Yoonix
1
Para esclarecer meu último comentário (tarde demais para editar): Agarrar uma nova chave de host sempre que você provisiona um host não é funcionalmente diferente de definir StrictHostKeyChecking = no. Com qualquer um deles, você confia cegamente em qualquer chave enviada sempre que provisionar. Se você acha que um ataque MITM é improvável, leia estes dois artigos. O Github seria um grande alvo.
Yoonix
1

Não sei se entendi a pergunta, mas acho que você deseja ignorar o prompt known_host ou evitá-lo completamente. Nesse caso:

ssh -o StrictHostKeyChecking = no

ou outras sugestões em: http://www.joedog.org/2012/07/ssh-disable-known_hosts-prompt/

Sirex
fonte
Eu quero uma maneira não interativa de aceitar a chave do host do GitHub (já que isso acontecerá em um script bash).
Andrew
então isso funcionará - mas não aceitará a chave, ignorará por completo. A resposta de Yoonix é melhor
Sirex