Ao meu lado isto acontece devido a algo que considero um bug ssh
de clientes mais recentes (OpenSSH_7.9p1
e superiores), quando tenta aprender uma chave de servidor ecdsa
mais segura onde já se conhece uma chave do tipo rsa
mais antiga. Depois apresenta esta mensagem enganadora!
Não sei uma boa solução para isto, a única solução que encontrei foi remover todas as “boas mas velhas chaves rsa
” de forma a que o cliente possa reaprender as “novas chaves ecdsa
mais seguras”. Assim:
O primeiro passo é remover todas as boas e velhas chaves RSA ( Aviso! Isto perde a protecção contra MitM ):
O segundo passo então é reaprender todas as chaves do host, o que deve ser feito manualmente ligando-se novamente a cada IP usando ssh
.
Aqui está o que eu observo:
$ sftp test@136.243.197.100
Connected to test@136.243.197.100
sftp>
$ sftp test@valentin.hilbig.de
Connected to test@valentin.hilbig.de.
sftp>
Agora tente ligar-se a um pseudónimo recentemente introduzido deste mesmo já conhecido bom servidor:
$ sftp test@gcopy.net
Warning: the ECDSA host key for 'gcopy.net' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:44
Are you sure you want to continue connecting (yes/no)?
Por favor dê uma olhada no endereço IP. É o mesmo IP que o anterior! Então parece que a (boa) chave do (conhecido) IP de repente se está a ofender (não está, pois o cliente ssh
mistura duas chaves incompatíveis, veja abaixo).
Agora tentamos corrigi-lo:
$ ssh-keygen -R 136.243.197.100
# Host 136.243.197.100 found: line 45
/home/test/.ssh/known_hosts updated.
Original contents retained as /home/test/.ssh/known_hosts.old
Vamos tentar novamente:
$ sftp test@gcopy.net
Warning: Permanently added the ECDSA host key for IP address '136.243.197.100' to the list of known hosts.
Connected to test@gcopy.net.
$ sftp test@valentin.hilbig.de
Warning: the RSA host key for 'valentin.hilbig.de' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:10
Are you sure you want to continue connecting (yes/no)?
WTF? O que aconteceu aqui? A nova chave nova aprendida com o servidor falhou novamente? E o problema até mudou de lado?!?
Não, não é a chave, nem o servidor. Está tudo correcto!
É o cliente ssh
que não verifica a chave correcta! A entrada 45
em known_hosts
agora tem uma chave do tipo ecdsa-sha2-nistp256
enquanto a chave, que foi puxada do servidor pelo cliente, é do tipo rsa-sha2-512
(e por isso não pode corresponder à outra chave!).
$ sftp -v test@valentin.hilbig.de
mostra:
debug1: kex: host key algorithm: rsa-sha2-512
$ sftp -v test@gcopy.net
mostra:
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
Aparentemente o cliente ssh
tem um bug algures! Não consegue lidar com uma chave de anfitrião existente em mais do que uma variante! Ou cai na armadilha de pedir uma variante desactualizada de uma chave.
Como reparar?
Não faço a menor ideia. Isto provavelmente só pode ser reparado a montante.
Mas existe uma solução manual mas desajeitada:
Tem de remover manualmente todos os vestígios da chave antiga do tipo rsa
. A chave em questão é mostrada na saída, mas não está directamente marcada como o problema:
Warning: the RSA host key for 'valentin.hilbig.de' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:10
verificação:
awk 'NR==45 { print $2 }' /home/test/.ssh/known_hosts
awk 'NR==10 { print $2 }' /home/test/.ssh/known_hosts
dá
ecdsa-sha2-nistp256
ssh-rsa
Então aqui a chave de acolhimento matching é a chave ofensiva e a chave ofensiva é a chave correcta que deve ser mantida! Portanto, vamos remover a errada (correspondência):
ssh-keygen -R valentin.hilbig.de
# Host valentin.hilbig.de found: line 10
/home/test/.ssh/known_hosts updated.
Original contents retained as /home/test/.ssh/known_hosts.old
Agora verifique novamente:
$ sftp test@valentin.hilbig.de
The authenticity of host 'valentin.hilbig.de (136.243.197.100)' can't be established.
ECDSA key fingerprint is SHA256:tf7lwe10C2p1lK2UG9p//m/4sUBCpX+i9k5Ub63c6Os.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'valentin.hilbig.de' (ECDSA) to the list of known hosts.
Connected to test@valentin.hilbig.de.
sftp>
$ sftp test@gcopy.net
Connected to test@gcopy.net.
sftp>
sftp test@136.243.197.100
Connected to test@136.243.197.100.
sftp>
YAY! O problema finalmente desapareceu. Mas com várias 100 entradas em .ssh/known_hosts
, esta “solução” torna-se realmente um grande PITA (e um Pesadelo de Segurança Pronto a Errar na Elm Street. YMMV.)