Evitando un man in the middle en SSH

El punto crítico en la seguridad de SSH es en el momento de la primera conexión de un cliente con el servidor. Después de que el servidor envía su clave pública al cliente, el cliente puede compararla con la que tiene en su base de datos de hosts conocidos (know_hosts) para ver si estamos hablando con el servidor auténtico.

El problema es que hacer cuando no tenemos referencias del host al que nos estamos conectando, lo que ocurre cuando es la primera vez que nos conectamos.

Hay un parámetro en la configuración del cliente SSH (StrictHostKeyChecking) que indica como actuar en estos casos. Si utilizamos mobaxterm (http://mobaxterm.mobatek.net/) el archivo de configuración lo tenemos en /etc/ssh_config.

A StrictHostKeyChecking podemos darle 3 valores: yes, ask, no. En mobaxterm el valor predeterminado es no que significa que cuando se detecta una conexión a un nuevo host nos fiamos de él y automáticamente almacenamos su clave pública en la lista de hosts cononcidos.

Si le asignamos el valor si entonces el sistema no autorizará ningún acceso a hosts desconocidos.

Mi recomendación es poner ask que instruye al cliente ssh a que nos pregunte cuando se encuentre un host desconocido. En esa pregunta nos muestra una huella de la clave pública, que es algo así como esto:

fd:1f:02:8c:12:ce:d2:c4:c9:13:f9:e7:ae:92:2a:df

Ante dicha pregunta la acción correcta sería comparar la huella con la del servidor (que nos deberían haber haber facilitado junto a nuestros credenciales de login y password) y sólo si es idéntica proseguir con la conexión.

Puesto que este montón de dígitos es incómodo para hacer la comparación, hay una representación alternativa «semi-gráfica» de la huella que podemos decir a nuestro cliente ssh que nos genere y que también nos pueden facilitar junto con nuestros credenciales.

Para configurar el cliente ssh para que nos muestre la huella semi-gráfica hay que ir al archivo ssh_config y añadir la siguiente línea:

VisualHostKey yes

Una vez lo hemos configurado, cuando nos conectemos por primera vez al servidor ocurrirá algo como esto:

ssh [email protected]
The authenticity of host 'redescorporativas.es (37.187.22.136)' can't be established.
RSA key fingerprint is fd:1f:02:8c:12:ce:d2:c4:c9:13:f9:e7:ae:92:2a:df.
+--[ RSA 2048]----+
|      ..         |
|     o.o         |
|      B.         |
|     = o.+.      |
|    . = So+      |
|     . .  .o     |
|       . .  o .  |
|  .  .o   .  o . |
|   oo.E...    .  |
+-----------------+
Are you sure you want to continue connecting (yes/no)?

Verificaremos el huella y si es la correcta, podemos contestar «yes».

Como dato adicional indiacr que al tener la opción VisualHostKey yes, cada vez que nos conectemos al servidor nos mostrará la huella.

Puesto que esta solución no deja de ser manual, hay propuestas para intentar automatizar esto y que sea más cómodo para el usuario. Una de ellas consiste validad la huella por DNS, escribiendo en un registro especial del servidor de nombres del dominio la huella de forma que el cliente pueda comprobarlo de forma automática con una consulta al servidor DNS del dominio. Evidentemente en este caso es necesario recurrir a DNSSEC para evitar la posibilidad de otro man in the middle entre el cliente y el servidor DNS.