SSH y man-in-the-middle

4

Supongamos el siguiente escenario y corríjame si me equivoco en alguna parte:

Hay un cliente y hay un servidor SSH al que el cliente se conecta. También hay un "hombre en el medio" (MIM) que puede interceptar el tráfico entrante y saliente del cliente.

Ahora suponga que el cliente se conecta al servidor SSH por primera vez y que la información de la clave pública del servidor aún no está en el archivo conocido_hosts. El servidor envía su clave pública al cliente, el cliente comprueba el archivo conocido_hosts, no encuentra allí la clave pública del servidor y, por lo tanto, el servidor ahora debe demostrar su identidad al cliente. La identidad se ha comprobado con éxito (mediante el uso de la clave privada del servidor), pero supongamos que el cliente no almacena la clave pública del servidor en el host conocido después de eso (no es obligatorio almacenarlo en el host conocido, hasta donde sé).

La próxima vez que el cliente se conecte al servidor SSH, el intermediario (MIM) intercepta la solicitud de conexión del cliente y envía su propia clave pública al cliente, en nombre del servidor SSH real. El cliente recibe la clave pública de MIM, inspecciona el archivo conocido y no encuentra la clave pública recibida en ese archivo, por lo que el "servidor" (MIM) debe probar su identidad nuevamente. Debido a que la clave pública de MIM está asociada con la clave privada correspondiente, MIM prueba con éxito su identidad al cliente.

¿Es posible comprometer la seguridad de esa manera? Corrígeme si me equivoco en alguna parte, por favor.

Alguien me dijo que el certificado de dominio del servidor es capaz de resolver el problema, así que, además, me gustaría entender el propósito de los certificados de host. He leído que el certificado se coloca en el archivo conocido_hosts como la clave pública habitual. Pero, ¿para qué usar un certificado si podemos usar la misma clave pública en todos los servidores en el dominio, y simplemente poner esa clave pública en el archivo conocido_host del cliente? Aparentemente, si aún no hay una clave pública en known_hosts, el ataque que he descrito anteriormente todavía es posible, y no importa si el servidor usa el certificado o no.

    
pregunta mangusta 07.01.2018 - 09:24
fuente

1 respuesta

3

Parece que asumes que la identidad del servidor está probada por el servidor, lo que demuestra que posee la clave pública presentada. Pero esto no prueba la identidad del servidor desde la perspectiva del cliente.

Una parte importante de la validación de la identidad de los servidores es que el cliente verifica la clave pública de los servidores con la esperada. Es por eso que la huella digital se presenta al cliente para su validación en la primera conexión o si se ha cambiado la clave. Esto significa que el cliente debe conocer la huella dactilar o la clave pública, es decir, antes de la validación de la clave. Lo que usted describe es, en cambio, confiar ciegamente en cualquier clave presentada al usuario en la esperanza pero no en la certeza de que es la correcta ( TOFU - confíe en el primer uso ).

  

Alguien me dijo que el certificado de dominio del servidor puede resolver el problema

Los certificados en SSH tienen una función similar a los certificados en TLS (y, por lo tanto, HTTPS ). Tienen una clave pública en el interior y están emitidos y firmados por una autoridad de certificación en la que el cliente confía. En caso de autenticación basada en certificados, el servidor presenta el certificado que incluye la clave pública y la firma del emisor. La firma de los emisores se puede usar para validar que el certificado fue emitido por la autoridad de confianza local y, por lo tanto, que la clave pública en el certificado es realmente la clave de los servidores esperados. Después de eso, la clave pública se usa como en la autenticación basada en clave normal, es decir, el servidor debe demostrar que posee la clave privada para la clave pública.

Con los certificados, el cliente no necesita conocer todas las claves del servidor por adelantado. En cambio, es suficiente confiar en una autoridad específica que emite y firma los certificados correctos que incluyen las claves públicas de los servidores. Esto lo hace más escalable si está tratando con muchos sistemas diferentes, todos administrados por unas pocas entidades.

Para saber cómo usar los certificados en SSH, consulte por ejemplo Cómo crear una CA de SSH para validar hosts y clientes con Ubuntu .

    
respondido por el Steffen Ullrich 07.01.2018 - 09:42
fuente

Lea otras preguntas en las etiquetas