ssh: aceita chaves automaticamente

218

Eu escrevi este pequeno script utilitário:

for h in $SERVER_LIST; do ssh $h "uptime"; done

Quando um novo servidor é adicionado $SERVER_LIST, o script é parado com:

The authenticity of host 'blah.blah.blah (10.10.10.10)' can't be established.
RSA key fingerprint is a4:d9:a4:d9:a4:d9a4:d9:a4:d9a4:d9a4:d9a4:d9a4:d9a4:d9.
Are you sure you want to continue connecting (yes/no)?

Eu tentei yes:

for h in $SERVER_LIST; do yes | ssh $h "uptime"; done

sem sorte.

Existe uma maneira de parametrizar sshpara aceitar automaticamente qualquer nova chave?

Adam Matan
fonte
6
A resposta de Lekensteyn é excelente e correta, mas eu só queria observar que, como o ssh espera "sim" e yesgera "y", você pode ter tido mais sorte com isso for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(observe o extra sim, que diz sim o que dizer em vez de "y ").
precisa saber é o seguinte

Respostas:

240

Use a opção StrictHostKeyChecking, por exemplo:

ssh -oStrictHostKeyChecking=no $h uptime

Esta opção também pode ser adicionada ao ~ / .ssh / config, por exemplo:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

Observe que quando as chaves do host forem alteradas, você receberá um aviso, mesmo com esta opção:

$ ssh -oStrictHostKeyChecking=no somehost uptime
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
31:6f:2a:d5:76:c3:1e:74:f7:73:2f:96:16:12:e0:d8.
Please contact your system administrator.
Add correct host key in /home/peter/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/peter/.ssh/known_hosts:24
  remove with: ssh-keygen -f "/home/peter/.ssh/known_hosts" -R 10.0.0.1
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
ash: uptime: not found

Se seus hosts não forem reinstalados com frequência, você poderá torná-lo menos seguro (mas mais conveniente para as chaves de host que mudam frequentemente) com a -oUserKnownHostsFile=/dev/nullopção Isso descarta todas as chaves de host recebidas, para nunca gerar o aviso.


Com 18,04, há uma nova possibilidade: StrictHostKeyChecking=accept-new. De man 5 ssh_config:

If this flag is set to accept-new then ssh will automatically
add new host keys to the user known hosts files, but will not
permit connections to hosts with changed host keys.  If this flag
is set to no or off”, ssh will automatically add new host keys
to the user known hosts files and allow connections to hosts with
changed hostkeys to proceed, subject to some restrictions.
Lekensteyn
fonte
10
Essa não é a melhor solução, pois ignora as ferramentas de segurança integradas. ssh-keyscané preferível, se estiver disponível no seu sistema.
Stefan Lasiewski
2
@StefanLasiewski Permite ataques de ataque intermediário se você estiver em redes não confiáveis. Para aceitar novas chaves para hosts fixos, a ssh-keyscanabordagem é mais sensata. Para máquinas virtuais locais e outros hosts em redes confiáveis ​​com endereços IP dinâmicos / reutilizados, a abordagem descrita é boa o suficiente.
Lekensteyn
8
Apenas para esclarecer a diferença entre as duas soluções: A ssh-keyscansolução só é propensa a um ataque man-in-the-middle no momento em que ssh-keyscanestá sendo executada. A -oStrictHostKeyChecking=nosolução é propensa a um ataque do tipo intermediário toda vez que sshé executada.
Erik Sjölund
121

Você pode usar o seguinte comando para adicionar a impressão digital de um servidor aos seus known_hosts

ssh-keyscan -H <ip-address> >> ~/.ssh/known_hosts
ssh-keyscan -H <hostname> >> ~/.ssh/known_hosts

NOTA: Substitua <endereço IP> e <nome do host> pelos nomes IP e DNS do servidor que você deseja adicionar.

O único problema com isso é que você terminará com alguns servidores em seus_conhecidos_hosts duas vezes. Não é realmente um grande negócio, apenas mencionando. Para garantir que não haja duplicatas, você pode remover todos os servidores primeiro, executando o seguinte primeiro:

ssh-keygen -R <ip-address>
ssh-keygen -R <hostname>

Então você pode executar:

for h in $SERVER_LIST; do
    ip=$(dig +search +short $h)
    ssh-keygen -R $h
    ssh-keygen -R $ip
    ssh-keyscan -H $ip >> ~/.ssh/known_hosts
    ssh-keyscan -H $h >> ~/.ssh/known_hosts
done

Uma coisa a ter em mente ao remover apenas para adicionar novamente, você está essencialmente removendo a segurança de verificar a impressão digital. Portanto, você definitivamente não gostaria de executar esse script antes de cada execução do seu script de utilitário.

mhost
fonte
1
executando-o através da classificação | uniq e, em seguida, olhando para o anfitrião duplicado usando awk depois faria o script capaz de detectar anfitriões mudaram e avisar os usuários só sobre aqueles, uma vez que mesmo host com chaves diferentes pode significar problemas
Lennart Rolland
2
Você pode adicionar uma anotação que -Hhashes nomes e endereços de host.
David Cullen
25

Estou um pouco atrasado com essa resposta, mas a maneira mais sensata seria fazer um scan ssh-keys na nova máquina antes de você executar a coleta de tempo de atividade.

ssh-keyscan  <newhost> >> ~/.ssh/known_hosts

Desativar a verificação de sanidade por conveniência parece um plano ruim, mesmo que você pense que está totalmente no controle do ambiente.

consertar
fonte
executar o comando acima e não realmente verificar as chaves do hospedeiro contra impressões digitais que você adquiridos fora da banda é vulnerável em exatamente da mesma forma comoStrictHostKeyChecking no
code_monk
3
@code_monk: não, não é. Abri uma oportunidade única de falha (aceitar uma chave de um host errado para ser adicionada a hosts conhecidos). StrictHostKeyChecking no permitirá a aceitação de repetição para outras máquinas.
tink
0

Para adicionar uma lista de servidores automaticamente, podemos fazer abaixo:

Adicionar IP de servidores na lista de servidores de arquivos

Os IPs devem ser adicionados no formato abaixo.

Saída de cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

Altere os IPs acima, substituindo o seu.

O comando abaixo adicionará todos os servidores da lista.

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
Waqas Khan
fonte