¿Cómo se autentica Secure Shell?

Hay un excelente artículo que nos cuenta cómo ssh implementa la autenticación usando algo de Diffie Helman

¿Cómo funciona SSH?

Probablemente ya tenga una comprensión básica de cómo funciona SSH. El protocolo SSH emplea un modelo cliente-servidor para autenticar a dos partes y cifrar los datos entre ellas.

El componente del servidor escucha las conexiones en un puerto designado. Es responsable de negociar la conexión segura, autenticar a la parte que se conecta y generar el entorno correcto si se aceptan las credenciales.

El cliente es responsable de comenzar el protocolo de enlace TCP inicial con el servidor, negociar la conexión segura, verificar que la identidad del servidor coincida con la información registrada anteriormente y proporcionar credenciales para autenticarse.

Una sesión SSH se establece en dos etapas separadas. El primero es acordar y establecer cifrado para proteger la comunicación futura. La segunda etapa es autenticar al usuario y descubrir si se debe otorgar acceso al servidor.

Negociación de cifrado para la sesión

Cuando un cliente realiza una conexión TCP, el servidor responde con las versiones de protocolo que admite. Si el cliente puede coincidir con una de las versiones de protocolo aceptables, la conexión continúa. El servidor también proporciona su clave de host pública, que el cliente puede usar para verificar si este fue el host previsto.

En este punto, ambas partes negocian una clave de sesión utilizando una versión de algo llamado algoritmo Diffie-Hellman. Este algoritmo (y sus variantes) hacen posible que cada parte combine sus propios datos privados con datos públicos del otro sistema para llegar a una clave de sesión secreta idéntica.

La clave de sesión se utilizará para cifrar toda la sesión. Los pares de claves pública y privada utilizados para esta parte del procedimiento están completamente separados de las claves SSH utilizadas para autenticar un cliente en el servidor.

La base de este procedimiento para el clásico Diffie-Hellman es:

  1. Ambas partes acuerdan un número primo grande, que servirá como valor inicial.
  2. Ambas partes acuerdan un generador de cifrado (generalmente AES), que se utilizará para manipular los valores de una manera predefinida.
  3. Independientemente, cada parte obtiene otro número primo que se mantiene en secreto de la otra parte. Este número se utiliza como clave privada para esta interacción (diferente de la clave SSH privada utilizada para la autenticación).
  4. La clave privada generada, el generador de cifrado y el número primo compartido se utilizan para generar una clave pública que se deriva de la clave privada, pero que se puede compartir con la otra parte.
  5. Ambos participantes intercambian sus claves públicas generadas.
  6. La entidad receptora utiliza su propia clave privada, la clave pública de la otra parte y el número primo compartido original para calcular una clave secreta compartida. Aunque esto es calculado independientemente por cada parte, usando claves privadas y públicas opuestas, dará como resultado la misma clave secreta compartida.
  7. El secreto compartido se usa para cifrar toda la comunicación que sigue.

El cifrado secreto compartido que se utiliza para el resto de la conexión se denomina protocolo de paquete binario. El proceso anterior permite a cada parte participar igualmente en la generación del secreto compartido, lo que no permite que un extremo controle el secreto. También cumple la tarea de generar un secreto compartido idéntico sin tener que enviar esa información a través de canales inseguros.

El secreto generado es una clave simétrica, lo que significa que la misma clave utilizada para cifrar un mensaje se puede utilizar para descifrarlo en el otro lado. El propósito de esto es envolver toda la comunicación adicional en un túnel encriptado que no pueda ser descifrado por personas externas.

Una vez que se establece el cifrado de la sesión, comienza la etapa de autenticación del usuario.

Autenticar el acceso del usuario al servidor

La siguiente etapa consiste en autenticar al usuario y decidir el acceso. Existen algunos métodos diferentes que se pueden usar para la autenticación, en función de lo que acepta el servidor.

La más simple es probablemente la autenticación de contraseña, en la que el servidor simplemente le solicita al cliente la contraseña de la cuenta con la que intenta iniciar sesión. La contraseña se envía a través del cifrado negociado, por lo que es segura frente a terceros.

Aunque la contraseña estará encriptada, este método generalmente no se recomienda debido a las limitaciones en la complejidad de la contraseña. Las secuencias de comandos automatizadas pueden romper contraseñas de longitudes normales muy fácilmente en comparación con otros métodos de autenticación.

La alternativa más popular y recomendada es el uso de pares de claves SSH. Los pares de claves SSH son claves asimétricas, lo que significa que las dos claves asociadas cumplen funciones diferentes.

La clave pública se usa para cifrar datos que solo se pueden descifrar con la clave privada. La clave pública se puede compartir libremente porque, aunque puede cifrar la clave privada, no existe ningún método para derivar la clave privada de la clave pública.

La autenticación mediante pares de claves SSH comienza después de que se haya establecido el cifrado simétrico como se describe en la última sección. El procedimiento ocurre así:

  1. El cliente comienza enviando una ID para el par de claves con el que desea autenticarse al servidor.
  2. La comprobación del servidor es el archivo authorized_keys de la cuenta en la que el cliente está intentando iniciar sesión para obtener la ID de la clave.
  3. Si se encuentra una clave pública con ID coincidente en el archivo, el servidor genera un número aleatorio y utiliza la clave pública para cifrar el número.
  4. El servidor envía al cliente este mensaje cifrado.
  5. Si el cliente realmente tiene la clave privada asociada, podrá descifrar el mensaje utilizando esa clave, revelando el número original.
  6. El cliente combina el número descifrado con la clave de sesión compartida que se utiliza para cifrar la comunicación y calcula el hash MD5 de este valor.
  7. Luego, el cliente envía este hash MD5 al servidor como respuesta al mensaje de número cifrado.
  8. El servidor usa la misma clave de sesión compartida y el número original que envió al cliente para calcular el valor MD5 por sí mismo. Compara su propio cálculo con el que envió el cliente. Si estos dos valores coinciden, demuestra que el cliente estaba en posesión de la clave privada y que el cliente está autenticado.

Como puede ver, la asimetría de las claves permite al servidor cifrar mensajes al cliente utilizando la clave pública. El cliente puede demostrar que posee la clave privada descifrando el mensaje correctamente. Los dos tipos de cifrado que se utilizan (secreto compartido simétrico y claves público-privadas asimétricas) pueden aprovechar sus fortalezas específicas en este modelo.

Conclusión

Aprender sobre los pasos de negociación de conexión y las capas de cifrado en el trabajo en SSH puede ayudarlo a comprender mejor lo que sucede cuando inicia sesión en un servidor remoto. Con suerte, ahora tiene una mejor idea de la relación entre varios componentes y algoritmos, y comprende cómo encajan todas estas piezas.

Google, hermano … aunque no es eso.