(El título inicial del artículo "Algoritmo de Operación del Protocolo SSH" fue cambiado de acuerdo con las recomendaciones de Vindicar , Karroplan y otros miembros de la comunidad de habro)Mientras leía periódicamente artículos sobre SSH, noté que sus autores a veces no tienen idea de cómo funciona este protocolo. En la mayoría de los casos, se limitan a considerar el tema de la generación de claves y describir las opciones de los comandos principales. Incluso los administradores de sistemas experimentados a menudo no tienen sentido cuando discuten problemas de SSH, emitiendo opus con estilo: los datos transmitidos se cifran con la clave SSH pública del cliente y se descifran con la clave privada, o: el algoritmo RSA se utiliza para cifrar datos durante la transmisión.
Trataré de aportar algo de claridad al funcionamiento del protocolo SSH y, al mismo tiempo, considerar el papel del algoritmo RSA y las claves de autorización del usuario ...

El algoritmo de protocolo SSH se puede dividir en tres niveles, cada uno de los cuales se encuentra por encima del anterior: transporte (apertura de un canal seguro), autenticación, conexión. En aras de la integridad de la imagen, también agregaré un nivel de configuración de conexión de red, aunque oficialmente este nivel está por debajo de SSH.
1. Establecer una conexión TCP
No me detendré en el principio de la pila TCP / IP, ya que este tema está bien documentado en Runet. Si es necesario, puede encontrar información fácilmente.
En este punto, el cliente se conecta al servidor en el puerto TCP especificado en la opción Puerto (predeterminado: 22) en el archivo de configuración del servidor / etc / ssh / sshd_config.
2. Abrir un canal seguro
2.1 Intercambio de identidadUna vez establecida la conexión TCP, el cliente y el servidor (en adelante, las partes) intercambian versiones del protocolo SSH y otros datos de respaldo necesarios para determinar la compatibilidad del protocolo y seleccionar algoritmos de operación.
2.2 Elección de algoritmos: intercambio de claves, cifrado, compresión, etc.SSH utiliza muchos algoritmos, algunos de ellos se utilizan para el cifrado, el segundo para el intercambio de claves, el tercero para la compresión de los datos transmitidos, etc. En este paso, las partes se envían entre sí listas de algoritmos compatibles, los algoritmos en la parte superior de cada lista tienen la máxima prioridad. Luego, los algoritmos en las listas obtenidas se comparan con los algoritmos disponibles en el sistema, y se selecciona el primero que coincide en cada lista.
La lista de algoritmos de intercambio de claves del lado del cliente disponibles (utilizados para obtener una clave de sesión) se puede ver con el comando:
ssh -Q kex
Lista de algoritmos simétricos disponibles en el sistema (utilizados para el cifrado de canales):
ssh -Q cipher
La lista de tipos de clave para autorización en el cliente:
ssh -Q key-cert
Actualizado por el comentario onix74 :Todos los comandos utilizados en la publicación son relevantes para OpenSSH versión 7.6 de Ubuntu 18.04 LTS.
2.3 Obtención de una clave de cifrado de sesiónEl proceso de obtención de una clave de sesión puede diferir según la versión del algoritmo, pero en términos generales se reduce a lo siguiente:
Una clave de sesión se crea exclusivamente para la vida del canal y se destruye cuando se cierra la conexión.
3. Autenticación del cliente
Y solo ahora, cuando el cliente y el servidor han establecido un canal para la transmisión de datos encriptados, pueden autenticarse con una contraseña o claves.
En términos generales, la autenticación de clave se realiza de la siguiente manera:
- El cliente envía al servidor un nombre de usuario (nombre de usuario) y su clave pública.
- El servidor busca en el archivo /home/username/.ssh/authorized_keys la clave pública enviada por el cliente. Si se encuentra la clave pública, el servidor genera un número aleatorio y lo cifra con la clave pública del cliente, después de lo cual el resultado se envía al cliente.
- El cliente descifra el mensaje con su clave privada y envía el resultado al servidor.
- El servidor verifica que el resultado coincida con el número que cifró originalmente con la clave pública del cliente, y si coincide, considera que la autenticación fue exitosa.
4. Nivel de conexión
Después de llevar a cabo todos los procedimientos anteriores, el usuario tiene la oportunidad de enviar comandos al servidor o copiar archivos.
En este nivel, se proporciona: multiplicación de canales (la capacidad de operar múltiples canales en un servidor combinándolos en un canal), túneles, etc.
De la teoría a la práctica.
Bueno, creo que los lectores tienen una pregunta completamente lógica: ¿por qué necesita conocer todos estos detalles del protocolo SSH? Si para el trabajo diario hay suficiente conocimiento de los comandos de creación de claves (ssh-keygen), abrir una sesión de terminal (ssh), transferencia de archivos ( scp)?
Como respuesta, podemos recordar el tema de cambiar el puerto SSH estándar a otro, que constantemente se convierte en la causa del holivar en Habr ...
En mi propia práctica, no recuerdo un solo servidor mirando la red externa que no sería aprovechada diariamente en el puerto 22. En una situación en la que SSH funciona para usted en un puerto estándar (y no está protegido por nada), incluso si la autenticación mediante claves y sin adivinar las contraseñas da miedo, entonces, debido a solicitudes constantemente mentirosas de clientes deshonestos, el servidor todavía se ve obligado a hacer un gran trabajo inútil: establecer una conexión TCP, seleccionar algoritmos, generar una clave de sesión, enviar solicitudes de autenticación, escribir un archivo de registro.
En una situación en la que no hay nada en el puerto 22, o el puerto está protegido mediante iptables (o complementos como fail2ban), el atacante caerá en la etapa de establecer una conexión TCP.
El más interesante descrito parece una tabla *
Configuracion | Hacking Chance | Pérdidas por inundación ** |
---|
22 puerto autorización de contraseña, sin protección | alto | alto |
22 puerto autorización clave, sin protección | promedio *** | alto |
22 puerto autorización clave, protección basada en la restricción de intentos fallidos de autorización | bajo | medio **** |
Puerto no estándar, autorización de contraseña, sin protección | alto | bajo |
Puerto no estándar, autorización clave, sin protección | promedio *** | bajo |
Puerto no estándar, autorización clave, protección basada en la restricción de intentos fallidos de autorización | bajo | bajo |
* - los valores de los parámetros (alto, medio, bajo) son de naturaleza relativa y solo sirven para comparar indicadores.
**: esto significa el consumo de recursos del servidor (procesador, disco, canal de red, etc.) para procesar una avalancha de solicitudes que generalmente van al puerto 22.
***: piratear si se utilizan claves RSA para la autorización es muy difícil, pero un número ilimitado de intentos de autorización lo hace posible.
****: el número de intentos de autorización es limitado, pero el servidor todavía tiene que procesarlos desde una gran cantidad de intrusos.
Materiales adicionales