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?

Senthil A Kumar
fuente
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 .

cori
fuente
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)
Grzegorz Luczywo
fuente
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

Jim Fred
fuente
19

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

Ricardo
fuente
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 [email protected] "uptime"
Cory Ringdahl
fuente
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.

Carlos MGT
fuente
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
Sfisioza
fuente
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"
Chintamani Manjare
fuente
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.

ARCA
fuente
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 .

Robert Chen
fuente
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

mk ..
fuente
0

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

chmod -R 700 ~/.ssh
Robert A
fuente
¿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ó.

Lavair
fuente
-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 ......

Rakesh Kumar Garg
fuente
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