ssh: no se puede establecer la autenticidad del host 'hostname'


153

Cuando hago un ssh a una máquina, en algún momento recibo esta advertencia de error y me pide que diga "sí" o "no". Esto causa algunos problemas cuando se ejecuta desde scripts que ssh automáticamente a otras máquinas.

Mensaje de advertencia:

The authenticity of host '<host>' can't be established.
ECDSA key fingerprint is    SHA256:TER0dEslggzS/BROmiE/s70WqcYy6bk52fs+MLTIptM.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'pc' (ECDSA) to the list of known hosts.

¿Hay alguna manera de decir automáticamente "sí" o ignorar esto?


27
Aconsejaría en contra de esto. Debe averiguar por qué está recibiendo estos errores, de lo contrario, se está abriendo a un hombre en el medio del ataque, que es de lo que estos errores están tratando de protegerlo.
Peter Bagnall el

3
Esto podría ser causado por un cambio en el servidor que usa esa clave ssh, o podría ser causado por alguien sentado entre usted y el servidor escuchando todo lo que envía / recibe.
derekdreery

¿Cuál podría ser la razón de este error?
AiU

No estoy de acuerdo con el punto de Peter. En una organización grande, tratar de hacer que alguien más solucione problemas como ese cuando solo intenta hacer su trabajo no es realista.
Sridhar Sarnobat

Muchas organizaciones grandes son exactamente lo contrario de lo que sugiere @SridharSarnobat. Usted tiene que asegurarse de que las personas adecuadas a resolver ese tipo de problemas, y tratar de trabajar alrededor de ellos sólo empeora las cosas.
James Moore

Respuestas:


135

Dependiendo de su cliente ssh, puede establecer la opción StrictHostKeyChecking en no en la línea de comando y / o enviar la clave a un archivo nulo conocido_hosts. También puede establecer estas opciones en su archivo de configuración, ya sea para todos los hosts o para un conjunto determinado de direcciones IP o nombres de host.

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

EDITAR

Como señala @IanDunn, existen riesgos de seguridad al hacer esto. Si el recurso al que se está conectando ha sido falsificado por un atacante, podrían volver a reproducir el desafío del servidor de destino, haciéndole creer que se está conectando al recurso remoto mientras de hecho se están conectando a ese recurso sus credenciales Debe considerar cuidadosamente si es un riesgo apropiado asumir antes de modificar su mecanismo de conexión para omitir HostKeyChecking.

Referencia .


40
Creo que es irresponsable recomendar esto sin advertir sobre las implicaciones de seguridad. superuser.com/a/421084/121091 es una mejor respuesta de la OMI.
Ian Dunn

55
@IanDunn Estaría de acuerdo con usted en una situación general de cliente SSH, pero dado que el OP indica claramente que está encontrando este problema mientras ejecuta scripts, la alternativa es romper el script cada vez que cambia la clave del host (y hay una serie de razones por las cuales ese podría ser el caso) que la respuesta a la que se refirió no se resuelve. Dicho esto, es una crítica válida, así que actualicé mi respuesta para señalar el riesgo.
cori

66
No puedo creer que tanta gente haya votado a favor de esta respuesta y que el interlocutor la acepte. Este enfoque omite las comprobaciones de seguridad y lo conecta al host remoto. Compruebe si el archivo known_hosts en la carpeta ~ / .ssh / tiene permiso de escritura. Si no, entonces use esta respuesta stackoverflow.com/a/35045005/2809294
ARK

Mientras sepa lo que está haciendo, esta es la mejor solución. Tengo un sitio web interno al que nos conectamos automáticamente que tiene MUCHAS direcciones IP actualizadas (efectivamente aleatorias). Agregué esto a ~ / .ssh / config y simplemente funciona. Eso sí, me SABER que este sitio es lo que creo que es y si no es así, los malos tienen ninguna ventaja, ya que sé lo que se están transfiriendo datos.
user1683793

75

Antigua pregunta que merece una mejor respuesta.

Puede evitar la solicitud interactiva sin deshabilitar StrictHostKeyChecking(lo cual es inseguro).

Incorpora la siguiente lógica en tu script:

if [ -z "$(ssh-keygen -F $IP)" ]; then
  ssh-keyscan -H $IP >> ~/.ssh/known_hosts
fi

Comprueba si la clave pública del servidor está en known_hosts. Si no, solicita una clave pública del servidor y la agrega known_hosts.

De esta manera, está expuesto al ataque Man-In-The-Middle solo una vez, que puede ser mitigado por:

  • asegurando que el script se conecta por primera vez a través de un canal seguro
  • inspeccionar registros o conocido_hosts para verificar las huellas digitales manualmente (se debe hacer solo una vez)

44
O simplemente administre el archivo known_hosts para todas las máquinas como parte de la configuración de su infraestructura.
Thilo

1
tenga en cuenta que ssh-keyscan no funciona con ProxyCommand: marc.info/?l=openssh-unix-dev&m=108446567718763&w=2
Richlv

1
No funcionará como se esperaba. `ssh-keygen -F $IP`debería ser "`ssh-keygen -F $IP`"(entre comillas), en otro caso no se interpretará como una cadena
avtomaton

O como un marcador de línea que utiliza el valor de retorno ssh-kegen:ssh-keygen -F $IP >/dev/null || ssh-keyscan -H $IP >> ~/.ssh/known_hosts
Gohu

38

Para deshabilitar (o controlar deshabilitar), agregue las siguientes líneas al comienzo de /etc/ssh/ssh_config...

Host 192.168.0.*
   StrictHostKeyChecking=no
   UserKnownHostsFile=/dev/null

Opciones:

  • La subred del host puede *permitir el acceso sin restricciones a todas las IP.
  • Edite /etc/ssh/ssh_configpara la configuración global o ~/.ssh/configpara la configuración específica del usuario.

Ver http://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-host-key-checking.html

Pregunta similar en superuser.com: consulte https://superuser.com/a/628801/55163


19

Asegúrate de que ~/.ssh/known_hostsse pueda escribir. Eso me lo arregló.


44
¿es seguro permitir que todos escriban en conocido_hosts?
akaRem

2
@akaRem definitivamente no. Por lo general, desea que solo se pueda escribir para el usuario propietario de esa .sshcarpeta.
2rs2ts

los permisos 0400son óptimos (corríjame a cualquiera), sin embargo, en mi caso, el problema era simplemente que la .sshcarpeta para mi usuario había cambiado su propiedad, por lo que invalidaba mis propios permisos 0400. sudocambiar la propiedad de nuevo a mí resolvió mi problema.
Charney Kaye

Este solucionó el problema para mí.
Sivaji

14

La mejor manera de hacerlo es usar 'BatchMode' además de 'StrictHostKeyChecking'. De esta manera, su script aceptará un nuevo nombre de host y lo escribirá en el archivo known_hosts, pero no requerirá intervención sí / no.

ssh -o BatchMode=yes -o StrictHostKeyChecking=no user@server.example.com "uptime"

10

Edite su archivo de configuración normalmente ubicado en '~ / .ssh / config', y al comienzo del archivo, agregue las líneas a continuación

Host *
    User                   your_login_user
    StrictHostKeyChecking  no
    IdentityFile          ~/my_path/id_rsa.pub

El usuario establecido en your_login_userdice que esta configuración pertenece a your_login_user
StrictHostKeyChecking establecido en no evitará el mensaje
IdentityFile es la ruta a la clave RSA

Esto funciona para mí y mis guiones, buena suerte para ti.


Gracias, realmente salvó el día. ¿Pero para qué sirve la última línea IdentityFile? Parece funcionar sin él también ..
supersan

7

Esta advertencia se emite debido a las características de seguridad, no deshabilite esta característica.

Solo se muestra una vez.

Si aún aparece después de la segunda conexión, el problema probablemente se deba a la escritura en el known_hostsarchivo. En este caso, también recibirá el siguiente mensaje:

Failed to add the host to the list of known hosts 

Puede solucionarlo cambiando el propietario de cambiar los permisos del archivo para que su usuario pueda escribirlos.

sudo chown -v $USER ~/.ssh/known_hosts

5

Con referencia a la respuesta de Cori, lo modifiqué y usé el siguiente comando, que está funcionando. Sin exit, el comando restante en realidad estaba iniciando sesión en la máquina remota, lo que no quería en el script

ssh -o StrictHostKeyChecking=no user@ip_of_remote_machine "exit"

5

Haz esto -> chmod +w ~/.ssh/known_hosts. Esto agrega permiso de escritura al archivo en ~/.ssh/known_hosts. Después de eso, el host remoto se agregará al known_hostsarchivo cuando se conecte a él la próxima vez.


4

Idealmente, debe crear una autoridad de certificación autogestionada. Comience generando un par de claves: ssh-keygen -f cert_signer

Luego firme la clave de host pública de cada servidor: ssh-keygen -s cert_signer -I cert_signer -h -n www.example.com -V +52w /etc/ssh/ssh_host_rsa_key.pub

Esto genera una clave de host pública firmada: /etc/ssh/ssh_host_rsa_key-cert.pub

En /etc/ssh/sshd_config, apunte el HostCertificatea este archivo: HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

Reinicie el servicio sshd: service sshd restart

Luego, en el cliente SSH, agregue lo siguiente a ~/.ssh/known_hosts: @cert-authority *.example.com ssh-rsa AAAAB3Nz...cYwy+1Y2u/

Lo anterior contiene:

  • @cert-authority
  • El dominio *.example.com
  • El contenido completo de la clave pública cert_signer.pub

La cert_signerclave pública confiará en cualquier servidor cuya clave de host pública esté firmada por la cert_signerclave privada.

Aunque esto requiere una configuración única en el lado del cliente, puede confiar en varios servidores, incluidos los que aún no se han aprovisionado (siempre que firme cada servidor, claro).

Para más detalles, vea esta página wiki .


2

Generalmente, este problema se produce cuando modifica las claves con mucha frecuencia. Según el servidor, puede llevar algún tiempo actualizar la nueva clave que ha generado y pegado en el servidor. Entonces, después de generar la clave y pegar en el servidor, espere de 3 a 4 horas y luego intente. El problema debe ser resuelto. Sucedió conmigo



0

Ejecute esto en el servidor host, es un problema de premonición

chmod -R 700 ~/.ssh

¿le está pidiendo a la gente que cambie los permisos de las claves públicas y claves públicas de 644 a 700? ¿Y clave privada de 600 a 700?
nurettin

0

Tuve el mismo error y quería llamar la atención sobre el hecho de que, como me sucedió a mí, podría tener privilegios incorrectos.
Ha configurado su .sshdirectorio como regular o como rootusuario y, por lo tanto, debe ser el usuario correcto. Cuando apareció este error, estaba rootpero lo configuré .sshcomo usuario normal. Salir lo rootarregló.


-3

Resuelvo el problema que da el siguiente error escrito:
Error:
no se puede establecer la autenticidad del host 'XXX.XXX.XXX'.
La huella digital de la clave RSA es 09: 6c: ef: cd: 55: c4: 4f: ss: 5a: 88: 46: 0a: a9: 27: 83: 89.

Solución:
1. instale cualquier herramienta openSSH.
2. ejecute el comando ssh
3. le preguntará si agrega este host como. acepta SI.
4. Este host se agregará en la lista de hosts conocidos.
5. Ahora puede conectarse con este host.

Esta solución está funcionando ahora ......


Esto no responde la pregunta. La pregunta original (muy antigua) se refería a la capacidad de confirmar automáticamente dichos avisos mediante un script.
MasterAM

Si funcionó para él, tal vez funcione para otros. No hay necesidad de downvote algo que es realmente útil
Mbotet

ejecutar "ssh" no funciona. Se muestra para el uso de opciones: ssh [..] [..] [..] [usuario @] nombre de host [comando]
P Satish Patro
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.