“Adicionar chave de host correta emhosconhecidos” / várias chaves de host ssh por nome de host?

147

Tentando ssh em um computador que eu controle, estou recebendo a mensagem familiar:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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
[...].
Please contact your system administrator.
Add correct host key in /home/sward/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/sward/.ssh/known_hosts:86
RSA host key for [...] has changed and you have requested strict checking.
Host key verification failed.

Eu realmente mudei a chave. E li algumas dezenas de postagens dizendo que a maneira de resolver esse problema é excluindo a chave antiga do known_hostsarquivo.

Mas o que eu gostaria é que o ssh aceite a chave antiga e a nova. O idioma na mensagem de erro (" Add correct host key") sugere que deve haver uma maneira de adicionar a chave do host correta sem remover a antiga.

Não consegui descobrir como adicionar a nova chave do host sem remover a antiga.

Isso é possível ou a mensagem de erro é extremamente enganosa?

Samuel Edwin Ward
fonte
9
Essa é a chave do host que está gerando o erro. Um host deve ter uma e apenas uma chave. Isso não tem nada a ver com chaves de cliente ou usuário. Você tem um endereço IP que flutua entre hosts distintos ou algo assim?
David Schwartz
4
No meu caso, eu sei que vou alternar bastante entre as duas teclas no futuro próximo, enquanto mexo em algumas coisas. Parece que isso também seria útil na situação de um IP com vários hosts que você sugere. Principalmente, só quero saber se isso é possível para minha própria educação, além de qualquer aplicação prática específica.
Samuel Edwin Ward

Respostas:

148
  1. obtenha a chave rsa do seu servidor, onde server_ipestá o endereço IP do servidor, como 192.168.2.1:

    $ ssh-keyscan -t rsa server_ip
    

    Resposta da amostra:

    # server_ip SSH-2.0-OpenSSH_4.3
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
    
  2. e no cliente, copie toda a linha de resposta server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...e adicione esta chave na parte inferior do seu ~/.ssh/known_hostsarquivo:

    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqx9m529...(the offending key, and/or the very bottom of the `known_hosts` file)
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG... (line you're adding, copied and pasted from above)
    
quanta
fonte
12
Isso funcionou! No entanto, estou usando "HashKnownHosts", portanto a entrada parecia um pouco fora do lugar. Felizmente, o ssh_config (5) me indicou o ssh-keygen (1), que explicou que eu posso usar o "ssh-keygen -H" para fazer o hash das entradas unificadas. Obrigado!
Samuel Edwin Ward
2
Este "obras", mas você não está verificando a chave, então você está vulnerável a ataques MITM ...
JasperWallace
3
@JasperWallace, enquanto primeiro passo é feito através de uma conexão segura (por exemplo, usando localhost) que deve ser bastante seguro, eu acho
ony
3
Existe alguma maneira de reunir todos os tipos de chave do servidor? Às vezes você não sabe se eles são RSA, DSA, ECDSA, RSA1 ... etc. #
Sopalajo de Arrierez
3
@SopalajodeArrierez a mesma página de manual também diz que você pode separar tipos com vírgulas, por isso ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip- mas a única razão para encontrar rsa1e dsachaves é identificar os servidores que precisam ser atualizados / reconfigurado
kbolino
94

Remova a entrada de known_hosts usando:

ssh-keygen -R *ip_address_or_hostname*

Isso removerá o IP ou nome do host problemático do arquivo known_hosts e tentará se conectar novamente.

Nas páginas do manual:

-R hostname
Remove todas as chaves pertencentes ao nome do host de um arquivo known_hosts. Esta opção é útil para excluir hosts com hash (consulte a opção -H acima).

Luis Abarca
fonte
11
"como adicionar a nova chave do host sem remover a antiga."
Samuel Edwin Ward
4
Essa é a melhor solução !
Thomas Decaux
8
Como isso tem 19 votos? Ele não vem perto de responder a pergunta ..
Molomby
2
Sua pergunta surge em segundo lugar quando eu pesquiso "git ssh update key do host automaticamente". Esta resposta é o que eu estava procurando. Abrir uma nova pergunta exatamente com o que eu quero pode fechar como duplicata.
Jason Goemaat
Hostname funciona muito
damluar
18

Uma maneira muito simples é:

cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak

Em seguida, edite known_hosts para limpar a chave original e, em seguida, ssh no host usando:

ssh name@computer

Ele adicionará a nova chave automaticamente; depois compare os dois arquivos. Um programa como o meld é uma boa maneira de comparar os dois arquivos. Em seguida, mescle os arquivos para que o know_hosts contenha as duas chaves

Minha 'razão' para manter duas chaves é que o sistema de destino é de inicialização múltipla, mesmo que eu ouse dizer que há uma maneira de sincronizar as chaves nas instalações, parece mais simples permitir várias chaves.

EDIT 2015/06

Devo acrescentar, revisitando-o agora, que percebo uma maneira ainda mais simples [desde que a entrada seja identificável, normalmente a partir do nome do host / endereço IP, além da mensagem de erro referente à sua localização específica];

  1. Edite known_hosts para adicionar # no início da entrada 'antiga' em known_hosts temporariamente
  2. Conecte [ssh ao host], aceite a solicitação para adicionar a nova chave 'automaticamente'
  3. Em seguida, edite o unknown_hosts para remover o #

Existe ainda a opção HostKeyAlias ​​como em

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer

depois, depois que o cliente ssh adicionar a nova chave ao alias, você poderá editar o nome_do_host conhecido para substituir o nome do host / endereço IP 'real' pelo alias ou conectar-se à encarnação desse host com a opção alias

Marca
fonte
Esse 'meld'? meldmerge.org
Samuel Edwin Ward
que é a fusão :) apt-get / yum install nome é simplesmente fundir
Mark
Eu fiz uma variante da sua sugestão que funcionou bem - em vez de cp, mv, ssh e cat ~ / .ssh / known_hosts.bak ~ / .ssh / known_hosts> tmp; mv tmp ~ / .ssh / known_hosts
Peter N Lewis
6

Eu tenho o mesmo problema com um raspberry pi que inicializo com vários sistemas diferentes (sistema dev para compilar binários de braço, projeto, xbmc etc.) e encontrei o mesmo problema. Eles usam DHCP em uma rede local e meu roteador sempre reutilizou o mesmo IP, pois o endereço MAC era o mesmo. Eu o resolvi usando diferentes nomes de domínio no meu arquivo hosts:

10.10.10.110 pi-dev
10.10.10.110 pi-xbmc
10.10.10.110 pi-etc

O arquivo known_hosts salva impressões digitais pelo nome do host, portanto, mesmo sendo o mesmo endereço IP, cada nome de host exclusivo recebe uma entrada diferente.

Eu cansei de adicionar os nomes aos arquivos hosts toda vez que eu usava um novo sistema, então criei uma maneira ainda mais preguiçosa usando zeros à esquerda nos endereços IP, como:

$ ssh [email protected]
$ ssh [email protected]
$ ssh [email protected]

Cada variação do endereço IP (não verificado) obtém sua própria entrada em known_hosts.

Mike
fonte
11
O pessoal do OpenSSH ficou esperto comigo, essa brecha não funciona mais em versões mais recentes.
Mike
Você pode usar CheckHostIP noem ~/.ssh/configser capaz de continuar a usar a brecha. Você pode até definir seus aliases lá para não precisar mexer /etc/hostse definir CheckHostIP noapenas esses três nomes de host.
GnP 04/12/2017
3

Se o seu cliente e servidor tiver o OpenSSH 6.8 ou mais recente, você poderá usar a UpdateHostKeys yesopção no seu ssh_configou ~/.ssh/config. Por exemplo:

Host *
    UpdateHostKeys yes

Isso faz com que o SSH armazene todas as chaves do host que o servidor precisa e known_hosts, quando um servidor altera ou remove uma chave do host, a chave também é alterada ou removida no seu known_hosts.

Mikaela
fonte
Esta é de longe a resposta mais útil! Embora não ofereça explicitamente uma maneira de resolver a pergunta original se uma chave do host já tiver sido alterada, todas as outras respostas são inseguras, pois não verificam a nova chave do host. Esta opção permite fazer rollover seguro para novas chaves do host.
Jaap Eldering
1

Não vejo por que você deseja trabalhar com duas chaves, mas certamente você pode adicionar mais de uma chave válida ao ~/.ssh/known_hostsarquivo, mas precisará fazê-lo manualmente.

Outra solução pode ser usar a StrictHostKeyChecking=noopção para este host específico:

ssh -o StrictHostKeyChecking=no user@host

que você pode colocar em um alias no seu ~/.profileou algo semelhante.

alias hc=ssh -o StrictHostKeyChecking=no user@host
Sven
fonte
StrictHostKeyChecking não parece ajudar neste caso; aparentemente, apenas especifica o comportamento quando o host não está no arquivo known_hosts. Mencionado aqui: gossamer-threads.com/lists/openssh/dev/45349#45349
Samuel Edwin Ward
Funciona aqui. Você receberá o aviso, mas o login continua.
Sven
Isso é estranho. Você está usando autenticação por senha? Você está usando o OpenSSH?
Samuel Edwin Ward
1

Se você ssh apenas em uma rede local, então ...

Uma solução simples é limpar o arquivo-chave antigo e substituí-lo por um em branco. Isso permitirá que você autorize novamente todas as suas conexões com novas chaves. Se você possui chaves ssh armazenadas em sites fora da rede local, é necessário garantir que sua conexão inicial seja segura, como na primeira vez em que se conectou a esse servidor.

por exemplo

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

Em seguida, pressione espaço, faça backspace cntl + xe 'y' para salvar o novo buffer (arquivo). É uma prática ruim, mas tudo bem, desde que você não esteja fazendo buscas regularmente fora da rede local (por exemplo, um servidor uni ou de trabalho)

Em uma rede local segura, isso é seguro, porque você simplesmente não pode colocar um homem no meio do ataque.

É sempre melhor usar o código que você entende!

Aaron
fonte
4
Limpar o known_hostsarquivo inteiro toda vez irá anular a maior parte da segurança fornecida pelo ssh.
kasperd
Na verdade, eu argumentaria que em uma rede interna segura, é mais seguro entender seu código e contornar a segurança do que copiar código sem pensar. Em uma rede externa, a situação seria diferente.
Aaron
-1

Tantas respostas, mas tantas que renunciam à proteção desativando totalmente a verificação estrita do host ou destruindo informações não relacionadas ao host ou apenas forçando o usuário a aceitar interativamente as chaves, possivelmente em um momento posterior, quando é inesperado.

Aqui está uma técnica simples para permitir que você deixe a verificação estrita do host, mas atualize a chave de maneira controlada, quando você espera que ela mude:

  • Remova a chave antiga e atualize em um comando

    ssh-keygen -R server.example.com && \
        ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.
    
  • Repita com os endereços IP ou outros nomes de host, se você os usar.

A vantagem dessa abordagem é que ele reescreve o servidor exatamente uma vez. A maioria das versões do ssh-keygen parece não retornar um erro se o servidor que você tenta excluir não existir no arquivo hosts conhecido; se isso for um problema para você, use os dois comandos em sequência.

Essa abordagem também verifica a conectividade e emite uma boa mensagem para os logs no comando ssh (que efetua login, atualiza a chave do host e gera a chave do host SSH atualizada e sai imediatamente.

Se sua versão do ssh-keygen retornar um código de saída diferente de zero, e você preferir lidar com isso sem erros, independentemente da conexão anterior ou anterior, basta usar os dois comandos em sequência, ignorando quaisquer erros no comando ssh-keygen.

Se você usar essa técnica, nunca precisará alterar seu comando ssh ou desativar a verificação de host, exceto durante o comando ssh. Você pode ter certeza de que as sessões ssh futuras funcionarão sem conflito ou precisando aceitar explicitamente uma nova chave, desde que o comando ssh acima tenha sido executado sem erros.

markgo2k
fonte
-3

Eu tive o mesmo problema.

Tudo o que fiz foi sudo nano /home/user/.ssh/ host_allowe apaguei a chave.

Quando voltei ao servidor, adicionei uma nova chave.

david
fonte
2
Mais algumas informações sobre por que isso acontece seriam úteis para a resposta.
Drew Khoury
-4

Use o comando sed para remover a linha incorreta

OUTPUT: as show in above example
Offending key in /home/user/.ssh/known_hosts:86

Remova a linha 86 conforme mencionado em hosts conhecidos.

CODE: 
sed -i '86d' /home/user/.ssh/known_hosts

Da próxima vez que acessar usando ssh, o sistema adicionará automaticamente uma nova chave.

versões mais recentes do ssh

usar:

ssh-keygen -R <hostname|ip address>

Ele removerá a entrada do nome do host e fará o backup do antigo .known_hostcomoknown_hosts.old

Viikram Simha
fonte
4
"Mas o que eu gostaria é que o ssh aceite a chave antiga e a nova chave." Sua resposta não faz isso.
Samuel Edwin Ward