Las claves de host son utilizadas por SSH como mecanismo de autenticación y seguridad. Típicamente se utilizan los algoritmos RSA, DSA o ECDSA para generar un par de claves pública/privada. Las claves de host se diferencian de las claves de autenticación en el hecho de que son utilizadas durante la conexión para establecer la autenticidad del host (cliente y servidor), no así del usuario, y evitar ataques de tipo MiM (man-in-the-middle).

Típicamente es necesario regenerar las claves de host al clonar un servidor virtual, ya que cada host debe tener su par de claves únicas. Este artículo explica cómo generar un nuevo par de claves de host en un sistema de la familia Unix.

Cada host (computadora en una red) debe tener su clave de host única. Compartir las claves de host no es recomendado, y puede resultar en una configuración vulnerable a ataques man-in-the-middle. Compartir una clave de host sólo puede ser aceptable en clusters por cuestiones prácticas.

OpenSSH usualmente almacena las claves de host dentro del directorio /etc/ssh en archivos que comienzan con ssh_host_. Las claves de host normalmente se generan automáticamente al instalar OpenSSH (o cuando se ejecutan utilitarios como dpkg-reconfigure).

Las claves de hosts remotos se almacenan en el directorio ~/.ssh/known_hosts de cada usuario. Adicionalmente, OpenSSH verifica el contenido del archivo /etc/ssh/ssh_known_hosts. Si la clave de un host al que se intenta conectar ha cambiado, SSH arroja una advertencia y termina inmediatamente la conexión para prevenir spoofing y ataques MiM, los cuales pueden ser utilizados luego para desactivar el cifrado.

Regenerar las claves de host de SSH

La herramienta ssh-keygen permite generar un par de claves de host.

Para comenzar, es necesario eliminar las claves actuales:

root@gitlab:/etc# rm /etc/ssh/ssh_host_*

Para generar un nuevo par de claves, simplemente ejecutar ssh-keyge -A:

root@gitlab:/etc# ssh-keygen -A
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519 

Luego reiniciar el servidor SSH:

root@gitlab:/etc# service ssh restart
[ ok ] Restarting OpenBSD Secure Shell server: sshd.

Esto hace que se comiencen a utilizar las nuevas claves de host.

Cerrar la conexión con el host remoto:

root@gitlab:/etc# exit
logout
Connection to gitlab.linuxito.com closed.

Ahora, al intentar conectarse nuevamente, se observa la advertencia de seguridad de SSH indicando que la clave de host ha cambiado:

emi@hal9000:~ % unssh gitlab
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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 a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:zCLORhYEN6YRo6xByMgWf2BmlswYTJPAfW5sZFU9Ryk.
Please contact your system administrator.
Add correct host key in /home/emi/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/emi/.ssh/known_hosts:106
ECDSA host key for [gitlab.linuxito.com]:2222 has changed and you have requested strict checking.
Host key verification failed.

Esto permite reconocer que el host al que intentamos conectarnos no es el que anteriormente conocía SSH. Lo cual podría significar que otro host se está haciendo pasar por el servidor en cuestión.

En este caso es el mismo host, sólo que hemos cambiado su clave de host. Para corregir este inconveniente, es necesario "olvidar" al host en cuestión desde cada uno de los clientes. A tal fin, editar el archivo ~/.ssh/known_hosts:

emi@hal9000:~ % nano ~/.ssh/known_hosts 

Y eliminar la línea que corresponde con el servidor. Notar que en la advertencia, OpenSSH indica claramente en qué línea del archivo ~/.ssh/known_hosts se encuentra la clave conocida (en este ejemplo es la línea 106).

Luego intentar conectarse nuevamente:

emi@hal9000:~ % unssh gitlab
The authenticity of host '[gitlab.linuxito.com]:2222 ([192.168.145.173]:2222)' can't be established.
ECDSA key fingerprint is SHA256:zCLORhYEN6YRo6xByMgWf2BmlswYTJPAfW5sZFU9Ryk.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)?

Esta vez la advertencia indica que es un host desconocido. A conectarse, respondiendo "yes", se agregará automáticamente a la lista de hosts conocidos.

Referencias


Tal vez pueda interesarte


Compartí este artículo