Eliminar clave de conocido_hosts


129

Construí varias máquinas virtuales durante las últimas semanas. El problema es que .ssh/known_hostsme da la advertencia del hombre en el medio . Esto sucede porque otra huella digital está asociada con la IP de la máquina virtual.

En el .ssh/known_hostsarchivo, sin embargo, no encuentro el registro relacionado con la IP, solo dos cadenas extrañas similares a teclas y "ssh-rsa".

¿Alguien tiene alguna idea sobre cómo quitar la clave anterior known_hosts?


77
Las "cadenas extrañas y similares a las claves" a las que hace referencia son las direcciones IP / hosts hash. Esta es una característica de seguridad que ayuda a evitar que un intruso sepa a qué sistemas tiene acceso. Si ve esto, su ssh_config se ha HashKnownHosts yesconfigurado.
Deebster

1
Si cree que el contenido del archivo es demasiado confuso, probablemente tenga activado el ajuste de línea. Desactívelo. Todas las líneas comienzan con un nombre de host o una dirección IP.
Daniel B

Respuestas:


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

Modificará el archivo ~ / .ssh / known_hosts: 6, eliminando la sexta línea.

En mi opinión, el uso ssh-keygen -Res una mejor solución para un usuario avanzado de openssh, mientras que su administrador habitual de Linux haría mejor para mantener sus habilidades de sed frescas utilizando el método anterior.


18
No creo que sea un buen consejo editar un archivo de configuración manualmente si tiene una aplicación oficial para eso. Tomar riesgos no lo convierte en un profesional, encontrar la opción más rápida y segura lo hace. Es como decirle a la gente que siga adelante y edite /etc/sudoerssin él visudo. Si quieres agudizar tus sedhabilidades, adelante y hazlo sin estropear tu sistema.
kraxor

2
"si tiene una aplicación oficial para eso" => ambos ssh-keygen -Ry sed -i {line}dson bastante "oficiales", y ambos funcionarán en el futuro previsible. Util ssh-keygen permite la eliminación por número de línea, ambos son perfectamente aceptables (porque los números de línea son a menudo más fáciles de manejar y menos propensos a errores que los nombres de host de centros de datos modernos).
Michael

2
A) La eliminación de específicamente la sexta línea, es todo muy "no busques manos". ¿No hay ninguna explicación en cuanto a lo que es significativo sobre la sexta línea del archivo? B) También man ssh-keygenmenciona ssh-keygen -R hostname que acaba de decir ssh-keygen -Rsin nombre de host especificado, y no ha explicado lo que quiere decir con eso.
barlop

124

La solución más simple es:

rm -f .ssh/known_hosts

¡ssh volverá a crear el archivo, pero pierde la comprobación de claves para otros hosts!

O puedes usar:

ssh-keygen -R "hostname"

O el mensaje ssh "man-in-the-middle" debería indicar qué línea del archivo known_hosts tiene la huella digital ofensiva. Edite el archivo, salte a esa línea y elimínelo.


55
ssh-keygen -R hostnamefuncionará también
Grawity

66
Si eliminamos ese archivo, también se eliminarán otras claves.
shgnInc

16
Eliminar el archivo es un mal consejo, es como decirle a alguien que compre una PC nueva porque la anterior tiene un mouse roto. También es una mala idea editar manualmente un archivo que puede ser editado por una aplicación oficial. La ssh-keygenopción se agregó debido a un comentario, pero sin explicación. No creo que esta respuesta merezca tantos votos positivos.
kraxor

12
-1 debido a todas las primeras líneas de "eliminar todo el archivo conocido_hosts". Esto es algo terrible, terrible, terrible de proponer, y debe ser editado.
Olivier Dulac

44
Esta solución es exagerada. Simplemente elimine la línea ofensiva. Eso es.
Blake Frederick

81

Hay un interruptor ssh-keygen ( -R) para esto.

man ssh-keygen lee:

-R nombre de host

Elimina todas las claves que pertenecen a hostnameun known_hostsarchivo. Esta opción es útil para eliminar hosts hash (consulte la -Hopción anterior).


8
Este es el método más fácil y seguro.
pollo

Nota: Esto cambiará los permisos del archivo known_hosts a 0600. Si tiene un archivo shared_hosts compartido por alguna razón, esto podría deshabilitar el uso compartido del mismo.
Jiri Klouda

y el correcto Además, tuve que hacerlo [localhost]:port, usando los corchetes porque usé un puerto personalizado, supongo = /. Como otros han dicho, también usaría el enfoque de comprobación de claves sin SSH para el desarrollo de mi sistema transitorio / de prueba.
Pysis

Esto elimina todas las ocurrencias, por lo que es la mejor manera. Puede agregar una nueva clave con:ssh-keyscan -H my.ssh.server.example.com >> ~/.ssh/known_hosts;
Nux

18

La advertencia le indicará la línea exacta en el archivo de hosts conocidos.

Aquí hay un ejemplo:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       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!

¿Ves la /home/user/.ssh/known_hosts:6parte? Especifica el archivo y el número de línea.


10

Debe ejecutar el siguiente comando para deshacerse de este problema. Abra la terminal y escriba el siguiente comando:

Para todos los ejemplos a continuación, simplemente reemplace el valor después de -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 ya se ha sugerido en las respuestas anteriores. ¿Podría ampliar lo que es diferente en su respuesta?
Burgi

@Burgi: esta respuesta proporciona más detalles sobre la sintaxis de ssh-keygen -Rcualquiera de las otras respuestas hasta ahora. Muestra con el ejemplo exactamente lo que puedes escribir después -R. Por lo tanto, esta respuesta vale la pena, a pesar de que no es una respuesta totalmente nueva.
Yitz

@Yitz Mi comentario se hizo como parte de la revisión. En ese momento (hace 18 meses) pensé que la pregunta necesitaba un poco de ayuda para hacerlo aún mejor.
Burgi

8

También puede indicar a ssh que no compruebe el archivo known_hosts utilizando los indicadores UserKnownHostsFile y StrictHostKeyChecking.

Por ejemplo:

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

Para facilitar su uso, puede usar este alias:

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

Ahora puede boldssh siempre que esté seguro de confiar en el certificado del servidor.


8
Que idea tan horrible. ¿Deshabilitar permanentemente una capa de seguridad solo porque eres demasiado vago para mantener tu ~/.ssh/known_hostsactualización? ¿Por qué no simplemente seguir adelante y usar telnet? "cuando esté seguro": si alguna vez está seguro, entonces no tiene idea de qué es un ataque MITM y probablemente debería pasar algún tiempo leyendo buena literatura.
kraxor

2
Basado en la pregunta del OP, creo que esta es una respuesta válida. A veces tienes un sistema de prueba en el que estás creando / destruyendo muchas máquinas virtuales. (Estoy haciendo esto ahora mismo mientras me preparo para el examen RHCE). Puede que no haya implicaciones de seguridad. Si bien es importante tener en cuenta las implicaciones de seguridad, no creo que esto deba calificarse como una "idea horrible".
Rick Chatham el


3

Todas las respuestas son buenas, pero para SSH pro real nos falta información sobre cómo eliminar la firma ssh con el número de puerto.

  • Comando simple de eliminación de firma de host SSH:

    ssh-keygen -R example.com
    
  • Eliminación de clave ssh compleja, por ejemplo, se conecta a ssh en el puerto no estándar 222:

    ssh example.com -p 222
    

y recibe una advertencia, y para eliminar esto, debe usar el número de puerto de dos puntos entre corchetes:

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

Espero que esto ayude a los usuarios de configuración no estándar.


Exactamente lo que he estado buscando. ¡Gracias!
aexl

1

Aquí hay un método que usa el editor Ex:

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

donde sexto es su número de línea mencionado en el mensaje de advertencia. Como este:

Clave ofensiva para IP en /home/user/.ssh/known_hosts:6 <== NÚMERO DE LÍNEA


En general, se recomienda utilizarex para editar los archivos de manera no interactiva , en lugar de sed, que es más un S tream ED itor y su -iparámetro que es una extensión de FreeBSD no estándar.


0

La entrada para el nombre de host o ip debe estar en la primera columna. La advertencia también debe incluir un número de línea donde se encuentra la clave infractora.


0

También puede eliminar una sola línea de hosts conocidos con, por ejemplo, rmknownhost 111 (111 es la línea a eliminar):

#! /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 * ""}

Guarde esto como rmknownhosten una carpeta de su PATH.


¿Cuál es el beneficio de esto sobre hacerlo en cualquier editor de texto dado? ¿Hay alguna razón para no hacerlo de esa manera, como la forma en que los sudoers deben editarse con visudo?
Andy Lester

¿Qué distribuciones vienen con esto? Ubuntu no parece tenerlo.
flickerfly

El beneficio es que es automatizado y rápido / es un binario separado que usted mismo agrega
más bruto

2
Podría haber publicado su script aquí en lugar de vincular su propia entrada de blog que creó el día en que publicó esta respuesta. Esto califica como spam en mi humilde opinión. Sin mencionar que podría crear un alias simple para lograr el mismo resultado, sin necesidad de un script ruby ​​de 7 líneas de largo.
kraxor

1
o simplemente agregue esto a su ~ / .bashrc: sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }y llámelo con sshdel [line number]. sin rubí, sin binario, sin preocupaciones.
Rubynorails

0

Es un archivo de texto. Puede editar fácilmente con vi (m) y simplemente eliminar la línea en cuestión (dd) y guardar el archivo (wq). Pero si hay un comando específico para eliminar un host, ese es probablemente el método más seguro.


No veo cómo editar el archivo directamente en VIM es "inseguro". Se basa en su nivel de comodidad con VIM. Especialmente con este archivo, el mayor riesgo que tiene es eliminar demasiadas claves, en cuyo caso simplemente se le solicitará nuevamente.
Rick Chatham el

La "seguridad" a la que me refería implica 1) olvidar / no saber eliminar información dependiente en otros archivos (si corresponde) y 2) Eliminar accidentalmente más o menos de lo necesario, rompiendo así el archivo.
Ryan Griggs
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.