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_hosts
arquivo.
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?
Respostas:
obtenha a chave rsa do seu servidor, onde
server_ip
está o endereço IP do servidor, como192.168.2.1
:Resposta da amostra:
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_hosts
arquivo:fonte
ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip
- mas a única razão para encontrarrsa1
edsa
chaves é identificar os servidores que precisam ser atualizados / reconfiguradoRemova a entrada de known_hosts usando:
Isso removerá o IP ou nome do host problemático do arquivo known_hosts e tentará se conectar novamente.
Nas páginas do manual:
fonte
Uma maneira muito simples é:
Em seguida, edite known_hosts para limpar a chave original e, em seguida, ssh no host usando:
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];
Existe ainda a opção HostKeyAlias como em
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
fonte
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:
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:
Cada variação do endereço IP (não verificado) obtém sua própria entrada em known_hosts.
fonte
CheckHostIP no
em~/.ssh/config
ser capaz de continuar a usar a brecha. Você pode até definir seus aliases lá para não precisar mexer/etc/hosts
e definirCheckHostIP no
apenas esses três nomes de host.Se o seu cliente e servidor tiver o OpenSSH 6.8 ou mais recente, você poderá usar a
UpdateHostKeys yes
opção no seussh_config
ou~/.ssh/config
. Por exemplo: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 seuknown_hosts
.fonte
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_hosts
arquivo, mas precisará fazê-lo manualmente.Outra solução pode ser usar a
StrictHostKeyChecking=no
opção para este host específico:que você pode colocar em um alias no seu
~/.profile
ou algo semelhante.fonte
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
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!
fonte
known_hosts
arquivo inteiro toda vez irá anular a maior parte da segurança fornecida pelo ssh.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
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.
fonte
Eu tive o mesmo problema.
Tudo o que fiz foi
sudo nano /home/user/.ssh/ host_allow
e apaguei a chave.Quando voltei ao servidor, adicionei uma nova chave.
fonte
Use o comando sed para remover a linha incorreta
Remova a linha 86 conforme mencionado em hosts conhecidos.
Da próxima vez que acessar usando ssh, o sistema adicionará automaticamente uma nova chave.
versões mais recentes do ssh
usar:
Ele removerá a entrada do nome do host e fará o backup do antigo
.known_host
comoknown_hosts.old
fonte