Comprender el proceso de conexión y cifrado SSH

Introducción

Índice
  1. Introducción
  • Comprensión del cifrado simétrico, el cifrado asimétrico y los hashes
    1. Cifrado simétrico
    2. Cifrado asimétrico
    3. Hash (hash)
  • Entendiendo cómo funciona SSH
  • Negociación del cifrado para la sesión
  • Autenticación del acceso del usuario al servidor
  • Conclusión
  • SSH , o secure shell, es un protocolo seguro y la forma más común de administrar servidores remotos de forma segura. Mediante el uso de una serie de tecnologías de cifrado, SSH proporciona un mecanismo para establecer una conexión criptográficamente segura entre dos partes, autenticar cada parte ante la otra y pasar comandos y resultados de ida y vuelta.

    En esta guía, examinaremos las técnicas de cifrado subyacentes que emplea SSH y los métodos que utiliza para establecer conexiones seguras. Esta información puede resultar útil para comprender las distintas capas de cifrado y los diferentes pasos necesarios para formar una conexión y autenticar a ambas partes.

    Comprensión del cifrado simétrico, el cifrado asimétrico y los hashes

    Para proteger la transmisión de información, SSH emplea distintos tipos de técnicas de manipulación de datos en distintos puntos de la transacción, entre las que se incluyen formas de cifrado simétrico, cifrado asimétrico y hash.

    Cifrado simétrico

    La relación de los componentes que cifran y descifran datos determina si un esquema de cifrado es simétrico o asimétrico.

    El cifrado simétrico es un tipo de cifrado en el que se puede utilizar una clave para cifrar mensajes enviados a la otra parte y también para descifrar los mensajes recibidos del otro participante. Esto significa que cualquiera que tenga la clave puede cifrar y descifrar mensajes enviados a cualquier otra persona que tenga la clave.

    Este tipo de esquema de cifrado se suele denominar cifrado de “secreto compartido” o cifrado de “clave secreta”. Normalmente, solo se utiliza una clave única para todas las operaciones o un par de claves en las que la relación es detectable y resulta trivial obtener la clave opuesta.

    Las claves simétricas se utilizan en SSH para cifrar toda la conexión. Al contrario de lo que algunos usuarios suponen, los pares de claves asimétricas públicas/privadas que se pueden crear solo se utilizan para la autenticación, no para cifrar la conexión. El cifrado simétrico permite proteger incluso la autenticación de contraseñas contra el espionaje.

    Tanto el cliente como el servidor contribuyen a establecer esta clave, y el secreto resultante nunca es conocido por terceros. La clave secreta se crea mediante un proceso conocido como algoritmo de intercambio de claves . Este intercambio hace que tanto el servidor como el cliente lleguen a la misma clave de forma independiente al compartir determinados datos públicos y manipularlos con determinados datos secretos. Este proceso se explica con mayor detalle más adelante.

    La clave de cifrado simétrica creada mediante este procedimiento se basa en la sesión y constituye el cifrado real de los datos enviados entre el servidor y el cliente. Una vez que esto se establece, el resto de los datos deben cifrarse con este secreto compartido. Esto se hace antes de autenticar a un cliente.

    SSH se puede configurar para utilizar una variedad de sistemas de cifrado simétricos diferentes, incluidos Advanced Encryption Standard (AES), Blowfish, 3DES, CAST128 y Arcfour. Tanto el servidor como el cliente pueden elegir una lista de sus sistemas de cifrado compatibles, ordenados por preferencia. La primera opción de la lista del cliente que esté disponible en el servidor se utiliza como algoritmo de cifrado en ambas direcciones.

    En Ubuntu 20.04, tanto el cliente como el servidor tienen valores predeterminados como los siguientes:

    • chacha20-poly1305@openssh.com
    • aes128-ctr
    • aes192-ctr
    • aes256-ctr
    • aes128-gcm@openssh.com
    • aes256-gcm@openssh.com

    Esto significa que si dos máquinas Ubuntu 20.04 se conectan entre sí (sin anular los cifrados predeterminados a través de las opciones de configuración), siempre utilizarán de forma predeterminada el chacha20-poly1305@openssh.comcifrado para cifrar su conexión.

    Cifrado asimétrico

    El cifrado asimétrico se diferencia del cifrado simétrico en que para enviar datos en una sola dirección se necesitan dos claves asociadas. Una de estas claves se denomina clave privada y la otra, clave pública.

    La clave pública se puede compartir libremente con cualquier parte. Está asociada a su clave emparejada, pero la clave privada no se puede derivar de la clave pública. La relación matemática entre la clave pública y la clave privada permite que la clave pública encripte mensajes que solo pueden descifrarse con la clave privada. Esta es una capacidad unidireccional, lo que significa que la clave pública no tiene la capacidad de descifrar los mensajes que escribe ni puede descifrar nada que la clave privada le envíe.

    La clave privada debe mantenerse completamente secreta y nunca debe compartirse con otra parte. Este es un requisito clave para que funcione el paradigma de la clave pública. La clave privada es el único componente capaz de descifrar mensajes que se cifraron utilizando la clave pública asociada. En virtud de este hecho, cualquier entidad capaz de descifrar estos mensajes ha demostrado que tiene el control de la clave privada.

    SSH utiliza el cifrado asimétrico en algunos lugares diferentes. Durante el proceso inicial de intercambio de claves utilizado para configurar el cifrado simétrico (utilizado para cifrar la sesión), se utiliza el cifrado asimétrico. En esta etapa, ambas partes generan pares de claves temporales e intercambian la clave pública para generar el secreto compartido que se utilizará para el cifrado simétrico.

    El uso más conocido del cifrado asimétrico con SSH proviene de la autenticación basada en claves SSH. Los pares de claves SSH se pueden utilizar para autenticar un cliente en un servidor. El cliente crea un par de claves y luego carga la clave pública en cualquier servidor remoto al que desee acceder. Esta se coloca en un archivo llamado authorized_keysdentro del ~/.sshdirectorio en el directorio de inicio de la cuenta de usuario en el servidor remoto.

    Una vez que se establece el cifrado simétrico para proteger las comunicaciones entre el servidor y el cliente, el cliente debe autenticarse para que se le permita el acceso. El servidor puede usar la clave pública de este archivo para cifrar un mensaje de desafío al cliente. Si el cliente puede demostrar que pudo descifrar este mensaje, habrá demostrado que posee la clave privada asociada. Luego, el servidor puede configurar el entorno para el cliente.

    Hash (hash)

    Otra forma de manipulación de datos que aprovecha SSH es el hash criptográfico. Las funciones hash criptográficas son métodos para crear una “firma” sucinta o resumen de un conjunto de información. Sus principales atributos distintivos son que nunca se pueden revertir, es prácticamente imposible influir en ellas de forma predecible y son prácticamente únicas.

    El uso de la misma función de hash y el mismo mensaje deberían generar el mismo hash; la modificación de cualquier parte de los datos debería generar un hash completamente diferente. Un usuario no debería poder generar el mensaje original a partir de un hash determinado, pero debería poder determinar si un mensaje determinado generó un hash determinado.

    Dadas estas propiedades, los hashes se utilizan principalmente con fines de integridad de datos y para verificar la autenticidad de la comunicación. El uso principal en SSH es con HMAC , o códigos de autenticación de mensajes basados ​​en hash. Estos se utilizan para garantizar que el texto del mensaje que se recibe esté intacto y sin modificaciones.

    Como parte de la negociación de cifrado simétrico descrita anteriormente, se selecciona un algoritmo de código de autenticación de mensajes (MAC) . El algoritmo se elige analizando la lista de opciones de MAC aceptables del cliente. Se utilizará la primera opción de esta lista que admita el servidor.

    Cada mensaje enviado después de que se haya negociado el cifrado debe contener una dirección MAC para que la otra parte pueda verificar la integridad del paquete. La dirección MAC se calcula a partir del secreto compartido simétrico, el número de secuencia del paquete del mensaje y el contenido real del mensaje.

    La propia MAC se envía fuera del área cifrada simétricamente como parte final del paquete. Los investigadores generalmente recomiendan este método de cifrar primero los datos y luego calcular la MAC.

    Entendiendo 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 dos partes y cifrar los datos entre ellas.

    El componente del servidor escucha en un puerto designado las conexiones. 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 iniciar el protocolo de control de transmisión (TCP) inicial con el servidor, negociar la conexión segura, verificar que la identidad del servidor coincida con la información registrada previamente y proporcionar credenciales para autenticarse.

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

    Negociación del cifrado para la sesión

    Cuando un cliente establece una conexión TCP, el servidor responde con las versiones de protocolo que admite. Si el cliente puede encontrar 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 comprobar si ese era el host deseado.

    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) permiten 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 que se utilizan para esta parte del procedimiento son completamente independientes de las claves SSH que se utilizan para autenticar un cliente en el servidor.

    Las bases de este procedimiento para el Diffie-Hellman clásico son:

    • Ambas partes acuerdan un número primo grande, que servirá como valor semilla.
    • Ambas partes acuerdan un generador de cifrado (normalmente AES), que se utilizará para manipular los valores de una forma predefinida.
    • De forma independiente, cada parte crea un número primo que se mantiene en secreto para la otra parte. Este número se utiliza como clave privada para esta interacción (diferente de la clave SSH privada que se utiliza para la autenticación).
    • 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.
    • Luego, ambos participantes intercambian sus claves públicas generadas.
    • 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 cada parte calcula esto de forma independiente, utilizando claves privadas y públicas opuestas, el resultado será la misma clave secreta compartida.
    • El secreto compartido se utiliza luego para cifrar toda la comunicación posterior.

    Este proceso permite que cada parte participe por igual en la generación del secreto compartido, lo que no permite que un extremo controle el secreto. También logra la tarea de generar un secreto compartido idéntico sin tener que enviar esa información a través de canales inseguros. El cifrado del secreto compartido que se utiliza para el resto de la conexión se denomina protocolo de paquetes binarios .

    El secreto generado es una clave simétrica, lo que significa que la misma clave utilizada para cifrar un mensaje puede utilizarse para descifrarlo en el otro lado. El objetivo de esto es envolver toda la comunicación posterior en un túnel cifrado que no pueda ser descifrado por terceros.

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

    Autenticación del acceso del usuario al servidor

    El siguiente paso consiste en autenticar al usuario y decidir si le concederá acceso. Existen algunos métodos que se pueden utilizar para la autenticación, según lo que acepte el servidor.

    El método general es la autenticación con contraseña , que consiste en que el servidor le solicite al cliente la contraseña de la cuenta con la que intenta iniciar sesión. La contraseña se envía a través de un cifrado negociado, por lo que es segura frente a terceros.

    Aunque la contraseña estará cifrada, este método no suele recomendarse debido a las limitaciones de complejidad de la contraseña. Los scripts automatizados pueden descifrar contraseñas de longitud normal con mucha facilidad 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 utiliza para cifrar datos que solo se pueden descifrar con la clave privada. La clave pública se puede compartir libremente, porque, aunque puede cifrar para 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 una vez que se ha establecido el cifrado simétrico, como se describe en la sección anterior. El procedimiento se lleva a cabo de la siguiente manera:

    • El cliente comienza enviando una ID para el par de claves con el que desea autenticarse al servidor.
    • El servidor verifica el authorized_keysarchivo de la cuenta en la que el cliente intenta iniciar sesión para obtener el ID de clave.
    • Si se encuentra una clave pública con un ID coincidente en el archivo, el servidor genera un número aleatorio y utiliza la clave pública para cifrar el número.
    • El servidor envía al cliente este mensaje cifrado.
    • Si el cliente realmente tiene la clave privada asociada, podrá descifrar el mensaje utilizando esa clave, revelando el número original.
    • 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. MD5 es un algoritmo de resumen de mensajes que utiliza la función hash para generar un valor hash de 128 bits.
    • Luego, el cliente envía este hash MD5 al servidor como respuesta al mensaje de número cifrado.
    • El servidor utiliza 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 el cliente le envió de vuelta. Si estos dos valores coinciden, demuestra que el cliente estaba en posesión de la clave privada y el cliente está autenticado.

    En resumen, la asimetría de las claves permite al servidor cifrar los mensajes que envía 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 (clave secreta compartida simétrica y claves públicas/privadas asimétricas) pueden aprovechar sus puntos fuertes específicos en este modelo.

    Conclusión

    Aprender sobre los pasos de negociación de conexión y las capas de cifrado que se utilizan en SSH puede ayudarlo a comprender mejor lo que sucede cuando inicia sesión en un servidor remoto. Ahora puede reconocer la relación entre los distintos componentes y algoritmos, y comprender cómo encajan todas estas piezas. Para obtener más información sobre SSH, consulte las siguientes guías:

    • Cómo configurar la autenticación basada en claves SSH en un servidor Linux
    • Cómo usar SSH para conectarse a un servidor remoto
    • Cómo configurar claves SSH para varios sistemas operativos
    • Conceptos básicos de SSH: cómo trabajar con servidores, clientes y claves SSH
    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion