Remova a chave de known_hosts


129

Eu construí várias máquinas virtuais durante as últimas semanas. O problema é que isso .ssh/known_hostsme dá o homem no meio do aviso. Isso acontece porque outra impressão digital está associada ao IP da máquina virtual.

No .ssh/known_hostsarquivo, no entanto, não encontro o registro relacionado ao IP, apenas duas seqüências bizarras e do tipo chave e "ssh-rsa".

Alguém tem alguma idéia sobre como remover a chave antiga known_hosts?


7
As "seqüências de caracteres bizarras e do tipo chave" a que você se refere são os hosts / endereços IP com hash. Esse é um recurso de segurança que ajuda a impedir que um invasor saiba a quais sistemas você tem acesso. Se você vir isso, seu ssh_config foi HashKnownHosts yesconfigurado.
Deebster

1
Se você achar que o conteúdo do arquivo é muito confuso, provavelmente a quebra de linha está ativada. Desative-o. Todas as linhas começam com um nome de host ou um endereço IP.
Daniel B

Respostas:


90
sed -i '6d' ~/.ssh/known_hosts

Modificará o arquivo ~ / .ssh / known_hosts: 6, removendo a 6ª linha.

Na minha opinião, usar ssh-keygen -Ré uma solução melhor para um usuário avançado do openssh, enquanto o administrador regular do Linux faria melhor em manter suas habilidades sed novas usando o método acima.


18
Não acho que seja um bom conselho editar um arquivo de configuração manualmente, se você tiver um aplicativo oficial para isso. Assumir riscos não faz de você um profissional, encontrar a opção mais rápida e segura. É como dizer às pessoas para ir em frente e editar /etc/sudoerssem visudo. Se você quiser aprimorar suas sedhabilidades, vá em frente e faça isso sem bagunçar o sistema.
kraxor

2
"se você tem um pedido oficial para isso" => ambos ssh-keygen -Re sed -i {line}dé bastante "oficial", e ambos funcionarão no futuro próximo. O Util ssh-keygen permite a remoção por número de linha, ambos são perfeitamente aceitáveis ​​(porque, geralmente, os números de linha são mais fáceis de lidar e menos propensos a erros do que lidar com os nomes de host dos data centers modernos).
22616 Michael

2
A) A exclusão especificamente da 6ª linha, é tudo muito "não procure mãos". Nenhuma explicação sobre o que é significativo na sexta linha do arquivo ?! B) Também man ssh-keygenmenciona ssh-keygen -R hostname que você acabou de dizer ssh-keygen -Rsem nome de host especificado e não explicou o que quer dizer com isso.
Barlop

124

A solução mais simples é:

rm -f .ssh/known_hosts

O ssh recriará o arquivo novamente, mas você perderá a verificação de chaves para outros hosts!

Ou você pode usar:

ssh-keygen -R "hostname"

Ou a mensagem ssh "man-in-the-middle" deve indicar qual linha do arquivo known_hosts tem a impressão digital ofensiva. Edite o arquivo, pule para essa linha e exclua-o.


55
ssh-keygen -R hostnamevai funcionar também.
grawity

6
Se removermos esse arquivo, outras chaves também serão removidas.
ShgnInc

16
A remoção do arquivo é um mau conselho, é como dizer a alguém para comprar um PC novo porque o antigo está com um mouse quebrado. Editar manualmente um arquivo que pode ser editado por um aplicativo oficial também é uma má idéia. A ssh-keygenopção foi adicionada por causa de um comentário, mas sem explicação. Não acho que essa resposta mereça muitos votos positivos.
kraxor

12
-1 por causa das primeiras linhas "excluir todo o arquivo known_hosts". Essa é uma coisa terrível, terrível, terrível a ser proposta e deve ser editada.
Olivier Dulac

4
Esta solução é um exagero. Basta remover a linha incorreta. É isso aí.
Blake Frederick

81

Existe um switch ssh-keygen ( -R) para isso.

man ssh-keygen lê:

-R nome de anfitrião

Remove todas as chaves pertencentes a hostnameum known_hostsarquivo. Esta opção é útil para excluir hosts com hash (veja a -Hopção acima).


8
Este é o método mais fácil e seguro.
frango

Nota: Isso mudará as permissões do arquivo known_hosts para 0600. Se você tiver um arquivo shared_hosts compartilhado por qualquer motivo, isso poderá desativar o compartilhamento dele.
Jiri Klouda

e o correto. Além disso, eu precisava fazer isso [localhost]:port, usando os colchetes, porque eu usei uma porta personalizada, eu acho = /. Como outros já disseram, eu também usaria a abordagem de verificação de chave sem SSH para o desenvolvimento do meu sistema de teste / transitório.
Pysis

Isso remove todas as ocorrências para que seja o melhor caminho. Você pode adicionar uma nova chave com:ssh-keyscan -H my.ssh.server.example.com >> ~/.ssh/known_hosts;
Nux

18

O aviso informará a linha exata no arquivo hosts conhecido.

Aqui está um exemplo:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for foo-bar.net has changed,
and the key for the corresponding IP address 127.0.0.1
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/user/.ssh/known_hosts:6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Veja a /home/user/.ssh/known_hosts:6parte? Especifica o arquivo e o número da linha.


10

Você precisa executar o seguinte comando para se livrar desse problema. Abra o terminal e digite o seguinte comando:

Para todos os exemplos abaixo, substitua o valor após -R

ssh-keygen -R server-name
ssh-keygen -R server.ip.addre.ss
ssh-keygen -R 202.54.1.5
ssh-keygen -R server1.example.com

Este método já foi sugerido nas respostas anteriores. Você poderia expandir o que é diferente em sua resposta?
Burgi 31/05

@Burgi - esta resposta fornece mais detalhes sobre a sintaxe do ssh-keygen -Rque qualquer outra resposta até o momento. Mostra por exemplo exatamente o que você pode escrever depois -R. Portanto, essa resposta vale a pena, mesmo que não seja uma resposta totalmente nova.
Yitz

@Yitz Meu comentário foi feito como parte da revisão. Na época (18 meses atrás), pensei que a pergunta precisava de uma ajudinha para torná-la ainda melhor.
Burgi

8

Você também pode instruir o ssh para não verificar o arquivo known_hosts usando os sinalizadores UserKnownHostsFile e StrictHostKeyChecking.

Por exemplo:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com

Para facilitar o uso, você pode também usar o seguinte:

alias boldssh='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

Agora você pode usar negrito sempre que tiver certeza de que confia no certificado do servidor.


8
Que ideia horrível. Desabilitar permanentemente uma camada de segurança só porque você está com preguiça de manter ~/.ssh/known_hosts-se atualizado? Por que não seguir em frente e usar telnet? "sempre que você tiver certeza" - se você tiver certeza, não terá idéia do que é um ataque MITM e provavelmente deverá gastar algum tempo lendo alguma boa literatura.
kraxor

2
Com base na pergunta do OP, acho que essa é uma resposta válida. Às vezes, você tem um sistema de teste no qual está criando / destruindo muitas VMs. (Estou fazendo isso agora, enquanto preparo o exame RHCE.) Talvez não haja implicações de segurança. Embora seja ótimo notar as implicações de segurança, não acho que isso deva ser rotulado de "idéia horrível".
Rick Chatham


3

Todas as respostas são boas, mas para o verdadeiro SSH pro, faltam informações sobre como remover a assinatura ssh com o número da porta.

  • Comando de remoção de assinatura de host SSH simples:

    ssh-keygen -R example.com
    
  • Remoção de chave ssh complexa, por exemplo, você se conecta ao ssh na porta 222 não padrão:

    ssh example.com -p 222
    

e você recebe um aviso e, para removê-lo, precisa usar o número da porta de dois pontos entre colchetes:

    ssh-keygen -R [example.com]:222

Espero que isso ajude para usuários de configuração não padrão.


Exatamente o que eu estava procurando. Obrigado!
aexl 3/10

1

Aqui está um método usando o editor Ex:

ex +6d -scwq ~/.ssh/known_hosts

onde 6 é o número da sua linha mencionado na mensagem de aviso. Como este:

Chave incorreta para IP em /home/user/.ssh/known_hosts:6 <== NÚMERO DE LINHA


Em geral, é aconselhável usarex para editar os arquivos de maneira não interativa , em vez de sed, o que é mais um itorador S tream ED e seu -iparâmetro, que é uma extensão não padrão do FreeBSD.


0

A entrada para o nome do host ou ip deve estar na primeira coluna. O aviso também deve listar um número de linha onde está a chave incorreta.


0

Você também pode remover uma única linha de hosts conhecidos com, por exemplo, rmknownhost 111 (111 é a linha a ser removida):

#! /usr/bin/env ruby
line = ARGV[0] || raise("gimme line to remove")
hosts = File.expand_path("~/.ssh/known_hosts")
content = File.readlines(hosts)
removed = content.delete_at line.to_i - 1
puts "Removed:\n#{removed}"
File.open(hosts, 'w'){|f| f.write content * ""}

Salve isso como rmknownhostem uma pasta do seu PATH.


Qual é o benefício disso em fazê-lo em qualquer editor de texto? Existe alguma razão para não fazer dessa maneira, como como os sudoers precisam ser editados com o visudo?
Andy Lester

Que distros vêm com isso? O Ubuntu parece não ter.
Flickerfly 19/07/2013

A vantagem é que ele é automatizado e rápida / é um binário separado você adicionar a si mesmo
Grosser

2
Você poderia ter postado seu script aqui em vez de vincular sua própria entrada de blog criada no dia em que publicou esta resposta. Isso se qualifica como spam IMHO. Sem mencionar que você pode criar um alias simples para obter o mesmo resultado, sem a necessidade de um script ruby ​​de 7 linhas.
kraxor

1
ou apenas adicione isso ao seu ~ / .bashrc: sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }e chame-o com sshdel [line number]. sem rubi, sem binário, sem preocupações.
rubynorails 24/09

0

É um arquivo de texto. Você pode editar facilmente com vi (m) e simplesmente excluir a linha em questão (dd) e salvar o arquivo (wq). Mas se houver um comando específico para remover um host, esse provavelmente será o método mais seguro.


Não vejo como a edição do arquivo diretamente no VIM é "insegura". Baseia-se no seu nível de conforto com o VIM. Especialmente com esse arquivo, o maior risco que você tem é excluir muitas chaves; nesse caso, você será solicitado novamente.
Rick Chatham

A "segurança" a que me referi envolve 1) esquecer / não saber remover informações dependentes em outros arquivos (se houver) e 2) excluir acidentalmente mais ou menos do que o necessário, quebrando assim o arquivo.
Ryan Griggs
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.