Lo hice y lo entendí

El blog de Vicente Navarro
29 jun

Evitando problemas con la “host key” en sesiones no interactivas de OpenSSH

Cuando usamos el comando ssh de OpenSSH (típicamente desde sistemas UNIX o desde Cygwin) para conectarnos a una máquina remota por primera vez, normalmente (con la configuración por defecto más usual) recibimos un mensaje como el siguiente para advertirnos de que es la primera vez que nos conectamos a dicha máquina y que si aceptamos la clave del host remoto:

$ ssh usuario.dominio@sistema
The authenticity of host 'sistema (10.22.31.45)' can't be established.
RSA key fingerprint is 7d:2f:1e:69:21:e9:06:f3:d9:fd:36:0a:9e:6c:47:10.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'sistema.dominio,10.22.31.45' (RSA) to the list of known hosts.
[usuario@sistema ~]$

Actualización 5/7/2010: Como en el ejemplo anterior, en todos los ejemplos que siguen veremos que el comando ssh no nos pregunta la contraseña porque hemos configurado Autentificación trasparente por clave pública/privada con OpenSSH.

Dicha clave se almacena en el fichero $HOME/.ssh/know_hosts:

$ tail -1 known_hosts
sistema.dominio,10.22.31.45 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAng/LUBaJa0qATdMMkmB3ufytR/BauKbCyz+Dvg0NMPUE2EF6zy5o3zSVMRlrgUmKakA3DoUez5oOaaSlR4d5ZZjOfsBmnn5dp7M0QtY681HYny1QQFUpRxNbARP3X8+2jlnWjOEBOmk+N8pRJCURUwkjSMs81ThAiZoIv8sVYYbNzKDpL8RaDTqEN0Xn+1dHJdeLrt+Hsl6GzX8f+SoWwkNVmt8Nc8T7vzrG93Xku6XXdOh5SKeTDXv+0shJUziPQApEwR0gcc+7L0hBEAw4GU1ctGnC22aVDkyqTKlbORq2YoufDErq+wv8lwgZKYd5AbOuvuwX7w9c8P+P+jKw==

Actualización 5/7/2010: Que aparezca el nombre de los hosts en claro en el fichero known_hosts es un problema de seguridad, ya que permite a un atacante que haya conseguido acceder a nuestro sistema conocer fácilmente otras máquinas que pueden ser objeto de ataque. Para evitar el problema, desde OpenSSH 4.0, es posible ofuscar el nombre de la máquina en el known_hosts con un hash. Sólo es necesario usar la opción “HashKnownHosts yes” en /etc/ssh_config o en $HOME/.ssh/config y ejecutar “ssh-keygen -H” para ofuscar el nombre de los hosts en nuestro known_hosts actual: Hashing the OpenSSH known_hosts File. Algunas distribuciones de Linux ya están implementando esto por defecto.

Si la máquina remota es víctima de algún tipo de ataque, si se ha reinstalado, si se ha sustituido por otra máquina con la misma IP o si, por cualquier motivo, la máquina remota no manda la clave de host que corresponde con la que tenemos almacenada, la próxima vez que intentemos conectarnos a ella, obtendremos un error como el siguiente:

$ ssh usuario@sistema.dominio
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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 the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
77:8b:3f:5c:95:18:30:2b:83:fe:21:73:d2:16:85:64.
Please contact your system administrator.
Add correct host key in /home/usuario/.ssh/known_hosts to get rid of this message.
Offending key in /home/usuario/.ssh/known_hosts:2
RSA host key for sistema.dominio has changed and you have requested strict checking.
Host key verification failed.

Y no podremos volver a conectarnos a menos que eliminemos la entrada vieja del known_hosts y volvamos a intentarlo. En dicho caso, volverá a pedirnos que aceptemos la nueva clave remota del host remoto, como al principio.

Si tenemos algún proceso no interactivo que se base en SSH, el que nos pregunte si aceptamos la clave del host remoto es un problema importante. En dichos casos, podemos evitar que nos lo pregunte y hacer que el ssh local la acepte siempre automáticamente poniendo el siguiente parámetro en el /etc/ssh_config (para todos los usuarios) o en el $HOME/.ssh/config (sólo para el usuario actual):

StrictHostKeyChecking no

Tras ponerlo comprobaremos que, efectivamente, la clave del host remoto se añade automáticamente al known_hosts la primera vez que accedemos a un nodo sin preguntar:

$ ssh usuario@sistema.dominio
Warning: Permanently added 'sistema.dominio,10.22.31.45' (RSA) to the list of known hosts.
[usuario@sistema ~]$

Pero esto puede no ser suficiente. Hay veces en las que la clave del host remoto siempre o muy a menudo cambia. Por ejemplo, puede ocurrir cuando hacemos un “ssh localhost” tras crear algún tipo de túnel que cada vez acabe en una máquina diferente (Creando túneles TCP/IP (port forwarding) con SSH: Los 8 escenarios posibles usando OpenSSH) o cuando trabajamos con multitud de máquinas físicas o virtuales (con éstas pasa especialmente a menudo) en las que reutilizamos frecuentemente la IP de unas máquinas en otras, etc.

Que la clave del host cambie frecuentemente es una simple molestia en sesiones interactivas (que nos obliga a buscar y a eliminar la entrada correspondiente del known_hosts), pero un auténtico problema cuando queremos usar ssh de forma no interactiva. En dichos casos, podemos solucionarlo usando el “StrictHostKeyChecking no” como antes, pero además, añadiendo ahora “UserKnownHostsFile /dev/null” en el $HOME/.ssh/config (no parece conveniente usarlo en el /etc/ssh_config y que aplique a todos los usuarios) para indicarle al comando ssh que en lugar de usar $HOME/.ssh/known_hosts para almacenar las claves de hosts, queremos usar /dev/null:

StrictHostKeyChecking no
UserKnownHostsFile /dev/null

Así conseguimos que, como las claves en realidad no se guardan, siempre que nos conectemos a una máquina se acepte automáticamente su clave de host, haya cambiado o no haya cambiado:

$ ssh usuario@sistema.dominio
Warning: Permanently added 'sistema.dominio,10.22.31.45' (RSA) to the list of known hosts.
[usuario@sistema ~]$ exit

$ ssh usuario@sistema.dominio
Warning: Permanently added 'sistema.dominio,10.22.31.45' (RSA) to the list of known hosts.
[usuario@sistema ~]$

Sobra decir que estas opciones suponen la eliminación de una medida de seguridad base del sistema SSH, con lo que se está más expuesto a posibles ataques.

:wq

Entradas relacionadas

9 Comentarios a “Evitando problemas con la “host key” en sesiones no interactivas de OpenSSH”

  • _Pi_ dice:

    Muy util… No se me habia ocurrido poner lo de “UserKnownHostsFile /dev/null”…

  • nemo dice:

    en realidad es útil el tip pero creo que también es un riesgo, por algo se usan los fingerprint, para evitar el spoofing, yo usaría con cuidado este tip

  • inedit00 dice:

    Super Coco ha vuelto a publicar!! A ver si te animas y vas publicando alguna entrada de vez en cuando, que es un blog muy muy bueno y con muy buen material, pero hay que mantenerse ;)

    Sobre el post, bueno, coincido con memo. Estoy de acuerdo en que puede servir en casos muy particulares pero no conviene obviar los sistemas de seguridad que provee SSH. Es bueno saberlo, y ponerlo puede ser muy útil siempre que se sepa lo que se está haciendo….

    Saludos!

  • gau dice:

    Por fin!!! Super Coco vuelve!!!!

    Me resistía a quitarte de mis feeds!!! :D

  • RuBiCK dice:

    Que alegría verte de vuelta ;)

    Me parece una solución muy buena e ingeniosa. Que cada cual evalúe sus riesgos :)

  • Grohl dice:

    Genial verte de vuelta. Pensé escribir para preguntar porque me parecía mucho tiempo pero bueno, me alegro de que vuelvas a publicar.
    Es uno de los blogs más interesantes y útiles que conozco

  • Gracias por vuestros comentarios, pero nunca me he ido, siempre he estado aquí ;-)

    Pero eso sí, ya avisé de que pondría las “piedras grandes” primero: Segundo aniversario del blog. Así que por favor, no os borréis del feed, que más pronto o más tarde, algo nuevo caerá… :P

  • Iván dice:

    Genial que hayas vuelto, ha pasado mucho desde la última vez. Tus artículos, tan buenos como siempre. A mi sí me pasa esto algunas veces, te conectas a un equipo con ip dinámica y cuando te vuelves a conectar, esa ip la tiene otro y hay que estar borrando la línea de marras en el archivo. Me apunto el tip.

    Saludos, Iván.

    P.D: Espero que te vaya bien en tu nueva etapa que te mantiene tan ocupado y “alejado” del blog.

  • Finidine dice:

    Es una gran noticia que el blog de “Super Coco” siga vivo. Yo tampoco lo he sacado de mis feeds. Gracias por los posts, sabemos que mantener un blog es una tarea ardua y no siempre compensatoria.

    Un saludo,

Tema LHYLE09, creado por Vicente Navarro