Questão ssh: aceita automaticamente as chaves


Eu escrevi este script pequeno utilitário:

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

Quando um novo servidor é adicionado ao $SERVER_LIST, o script é interrompido 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 ssh aceitar automaticamente qualquer nova chave?


171
2018-04-18 09:11


origem


A resposta de Lekensteyn é excelente e correta, mas eu só queria notar que já que o ssh está esperando "sim" e yes saídas "y", você pode ter tido melhor sorte com for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done (note o extra sim, que diz sim o que dizer em vez de "y"). - chazomaticus


Respostas:


Use a opção StrictHostKeyChecking, por exemplo:

ssh -oStrictHostKeyChecking=no $h uptime

Esta opção também pode ser adicionada a ~ / .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 essa 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 freqüência, você poderá torná-lo menos seguro (mas mais conveniente para as chaves do host que mudam com frequência) com o -oUserKnownHostsFile=/dev/null opção. Isso descarta todas as chaves de host recebidas para que nunca gerem o aviso.


Com o 18.04, há uma nova possibilidade: StrictHostKeyChecking=accept-new. A partir 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.

185
2018-04-18 09:29



Esta 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
@StefanLasiewski Permite ataques homem no meio se você estiver em redes não confiáveis. Para aceitar novas chaves para hosts fixos, o ssh-keyscan a abordagem é 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
Apenas para esclarecer a diferença entre as duas soluções: ssh-keyscan solução é apenas propensa a um ataque man-in-the-middle da vez ssh-keyscan está sendo executado. o -oStrictHostKeyChecking=no solução é propensa a um ataque man-in-the-middle toda vez sshestá sendo executado. - Erik Sjölund


Você pode usar o seguinte comando para adicionar a impressão digital de um servidor ao seu arquivo known_hosts

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

NOTA: Substitua <ip-address> e <hostname> pelo nome de IP e dns do servidor que você deseja adicionar.

O único problema com isso é que você terminará com alguns servidores em seu known_hosts duas vezes. Não é realmente um grande negócio, apenas mencionar. 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ê poderia correr:

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. Então você definitivamente não gostaria de executar este script antes de cada execução do seu script de utilitário.


96
2017-10-17 00:24



executando através do tipo | O uniq e depois procurar por um host duplicado usando o awk depois tornaria o script capaz de detectar hosts alterados e avisar os usuários apenas sobre eles, já que o mesmo host com chaves diferentes poderia significar problemas - Lennart Rolland
Você pode querer adicionar uma nota que -H hashes nomes de host e endereços. - David Cullen


Estou um pouco atrasado com essa resposta, mas a maneira mais sensata seria fazer um ssh-keyscan na nova máquina antes de 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 se você acha que está totalmente no controle do ambiente.


23
2017-11-24 19:47



Isso é realmente o que eu estava procurando. Obrigado. - user156516
executar o comando acima e, na verdade, não verificar as chaves do host contra impressões digitais que você adquiriu fora da banda é vulnerável da mesma maneira como StrictHostKeyChecking no - code_monk
@code_monk: não, não é. Eu abro um one-off oportunidade de falha (aceitar uma chave de um host errado para ser adicionada aos hosts conhecidos). StrictHostKeyChecking não permitirá repetir aceita para outras máquinas. - tink


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

Adicionar servidores IP 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

Mude acima dos IPs, substituindo o seu.

Abaixo, o comando adicionará todos os servidores da lista.

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

0
2018-02-16 07:46