Comprendiendo el proceso de cifrado y conexión de SSH

Introducción

SSH, o shell seguro, es un protocolo seguro y la forma más común de administrar servidores remotos de forma segura. Al usar una serie de tecnologías de cifrado, SSH proporciona un mecanismo para establecer una conexión criptográfica segura entre dos partes, autentificando cada lado al otro, y pasando comandos y resultados en ambos sentidos.

En otras guías, hemos discutido cómo configurar el acceso basado en claves SSHla guía definitiva para asegurar SSH y algunos consejos y trucos de SSH .

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 ser útil para comprender las distintas capas de cifrado y los diferentes pasos necesarios para establecer una conexión y autenticar a ambas partes.

Cifrado simétrico, Cifrado asimétrico y Hashes

Para asegurar la transmisión de información, SSH emplea varios tipos diferentes de técnicas de manipulación de datos en varios puntos de la transacción. Estas incluyen formas de cifrado simétrico, cifrado asimétrico y hash.

Cifrado simétrico

La relación de los componentes que cifran y descifran los 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 a la parte opuesta y también para descifrar los mensajes recibidos del otro participante.

Esto significa que cualquier persona que tenga la clave puede cifrar y descifrar los mensajes a cualquier otra persona que tenga la clave.

Este tipo de esquema de cifrado a menudo se denomina cifrado “secreto compartido” o cifrado de “clave secreta”. Por lo general, solo se utiliza una única clave para todas las operaciones, o un par de claves donde la relación es fácil de descubrir y es trivial derivar la clave opuesta.

SSH usa las claves simétricas para cifrar toda la conexión. Contrariamente a lo que algunos usuarios asumen, 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.

Claves

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 a través de un proceso conocido como algoritmo de intercambio de claves.

Este intercambio hace que el servidor y el cliente lleguen a la misma clave de forma independiente al compartir ciertos datos públicos y manipularlos con ciertos datos secretos. Este proceso se explica con mayor detalle más adelante.

La clave de cifrado simétrica creada por 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 establecido esto, el resto de los datos se deben cifrar con este secreto compartido. Esto se hace antes de autenticar un cliente.

SSH se puede configurar para utilizar una variedad de diferentes sistemas de cifrado simétrico, incluidos AES, Blowfish, 3DES, CAST128 y Arcfour. El servidor y el cliente pueden decidir sobre una lista de sus cifrados admitidos, 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 , el cliente y el servidor están predeterminadas con esto: aes128-ctraes192-ctraes256-ctrarcfour256arcfour128aes128-gcm@openssh.comaes256-gcm@openssh.comchacha20-poly1305@openssh.comaes128-cbcblowfish-cbccast128-cbcaes192-cbcaes256-cbcarcfour.

Esto significa que si dos máquinas Ubuntu se conectan entre sí (sin anular los cifrados predeterminados a través de las opciones de configuración), siempre usarán el cifrado aes128-ctr para cifrar tu conexión.

Cifrado asimétrico

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

La clave pública se puede compartir libremente con cualquier parte. Se asocia con su clave emparejada, pero la clave privada no puede derivarse 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 cifre mensajes que solo pueden ser descifrados por la clave privada.

Esta es una habilidad de un solo sentido, lo que significa que la clave pública no tiene la capacidad de descifrar los mensajes que escribe, ni puede descifrar nada de lo que la clave privada puede enviar.

La clave privada debe mantenerse totalmente secreta y nunca debe compartirse con la otra parte. Este es un requisito clave para que funcione el paradigma de clave pública.

La clave privada es el único componente capaz de descifrar mensajes cifrados mediante la clave pública asociada. En virtud de este hecho, cualquier entidad capaz de descifrar estos mensajes ha demostrado que tienen el control de la clave privada.

Uso

SSH utiliza encriptación asimétrica en algunos lugares diferentes. Durante el proceso de intercambio de claves inicial utilizado para configurar el cifrado simétrico (utilizado para cifrar la sesión), se utiliza el cifrado asimétrico.

En esta etapa, ambas partes producen pares de claves temporales e intercambian la clave pública para producir el secreto compartido que se utilizará para el cifrado simétrico.

El uso más bien discutido del cifrado asimétrico con SSH proviene de la autenticación basada en clave SSH. Los pares de claves SSH se pueden usar para autenticar un cliente en un servidor.

El cliente crea un par de claves y luego carga la clave pública a cualquier servidor remoto al que desee acceder. Esto se coloca en un archivo llamado authorized_keys dentro del directorio ~/.ssh en el directorio de inicio de la cuenta de usuario en el servidor remoto.

Una vez establecido el cifrado simétrico para asegurar las comunicaciones entre el servidor y el cliente, el cliente debe autenticarse para permitir el acceso. El servidor puede usar la clave pública en este archivo para cifrar un mensaje de desafío al cliente.

Si el cliente puede probar que pudo descifrar este mensaje, ha demostrado que posee la clave privada asociada. El servidor puede configurar el entorno para el cliente.

Hash

Otra forma de manipulación de datos que SSH aprovecha es el hash criptográfico. Las funciones hash criptográficas son métodos para crear una “firma” sucinta o un resumen de un conjunto de información.

Sus principales atributos distintivos son que nunca deben invertirse, son virtualmente imposibles de influenciar de manera predecible y son prácticamente únicas.

Usar la misma función de hash y el mensaje debería producir el mismo hash; La modificación de cualquier parte de los datos debe producir un hash completamente diferente.

Un usuario no debe ser capaz de producir el mensaje original de un hash dado, pero debe ser capaz de decir si un mensaje dado produjo un hash dado.

Dadas estas propiedades, los hashes se utilizan principalmente para propósitos 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 recibido esté intacto y sin modificar.

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

Cada mensaje que se envía después de que se negocie el cifrado debe contener un MAC para que la otra parte pueda verificar la integridad del paquete. El MAC se calcula a partir del secreto compartido simétrico, el número de secuencia del paquete del mensaje y el contenido del mensaje real.

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

¿Cómo funciona SSH?

Probablemente ya tengas un conocimiento básico de cómo funciona SSH. El protocolo SSH emplea un modelo cliente-servidor para autenticar a dos partes y cifrar los datos entre ellos.

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 inicial de TCP 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 autenticar.

Una sesión de SSH se establece en dos etapas separadas. El primero es acordar y establecer el 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 era el host deseado.

En este punto, ambas partes negocian una clave de sesión usando una versión de algo llamado el 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 la sesión completa. Los pares de claves públicas y privadas utilizadas para esta parte del procedimiento son completamente independientes 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 semilla.
  2. Ambas partes acuerdan un generador de cifrado (típicamente AES), que se utilizará para manipular los valores de una manera predefinida.
  3. Independientemente, a cada parte se le ocurre otro número primo que se mantiene en secreto de la otra parte. Este número se utiliza como la clave privada para esta interacción (diferente a 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 cada parte lo calcula de forma independiente, utilizando claves privadas y públicas opuestas, resultará en la misma clave secreta compartida.
  7. El secreto compartido se utiliza para cifrar todas las comunicaciones que siguen.

El cifrado secreto compartido que se utiliza para el resto de la conexión se denomina protocolo de paquete binario. El proceso anterior permite que cada parte participe 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 puede usarse para descifrarlo en el otro lado.

El propósito de esto es envolver toda la comunicación adicional en un túnel cifrado 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.

Autentificando el acceso del usuario al servidor

La siguiente etapa consiste en autenticar al usuario y decidir el acceso. Hay algunos métodos diferentes que se pueden usar para la autenticación, según lo que acepte el servidor.

La más sencilla es probablemente la autenticación de contraseña, en la que el servidor simplemente solicita al cliente la contraseña de la cuenta con la que está intentando iniciar sesión.

La contraseña se envía a través del cifrado negociado, por lo que es segura de terceros.

Aunque la contraseña se cifrará, este método generalmente no se recomienda debido a las limitaciones en la complejidad de la contraseña.

Los scripts automatizados 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 tienen diferentes funciones.

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, ya que, aunque puede cifrarse para la clave privada, no existe un 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 sección anterior. El procedimiento ocurre así:

Procedimiento

  1. El cliente comienza enviando un ID para el par de claves con el que desea autenticarse en el servidor.
  2. El servidor verifica el archivo authorized_keys de la cuenta en la que el cliente está intentando iniciar sesión para obtener el ID de la clave.
  3. Si se encuentra una clave pública con un ID coincidente en el archivo, el servidor genera un número aleatorio y usa 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 usando esa clave, revelando el número original.
  6. El cliente combina el número descifrado con la clave de sesión compartida que se usa 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 una respuesta al mensaje del número cifrado.
  8. El servidor utiliza la misma clave de sesión compartida y el número original que envió al cliente para calcular el valor de MD5 por su cuenta.

Compara su propio cálculo con el que el cliente devolvió. Si estos dos valores coinciden, se demuestra que el cliente estaba en posesión de la clave privada y que el cliente está autenticado.

Como puedes ver, la asimetría de las claves permite al servidor cifrar los mensajes al cliente utilizando la clave pública. Luego, el cliente puede probar que tiene la clave privada descifrando el mensaje correctamente.

Los dos tipos de cifrado que se usan (claves compartidas simétricas y claves público-privadas asimétricas) son capaces de aprovechar sus fortalezas específicas en este modelo.

Conclusión

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