Cuando se trata de computación remota, SSH es uno de los protocolos más populares y seguros. SSH es un protocolo de red criptográfico que establece una conexión segura con dispositivos remotos. Al conectarse a un dispositivo remoto, el usuario puede ejecutar comandos en la shell remota. SSH es más común entre administradores de redes y sistemas.
Esta guía estilo hoja de trucos muestra una descripción general de SSH, algunas formas comunes de conectarse con SSH y varias configuraciones de SSH.
Descripción general de SSH
SSH es el acrónimo de Secure Shell. Algunos también se refieren a SSH como Secure Socket Shell. SSH es la forma más común de acceder a un servidor remoto. Al conectarse a un sistema remoto mediante SSH, se conecta a una cuenta existente. Una vez conectado, tendrá acceso a una sesión de shell. Todos los comandos ejecutados se realizarán en la máquina remota y la salida se mostrará en su terminal local.
La conexión SSH sigue un modelo cliente-servidor. El sistema remoto debe estar ejecutando el demonio SSH para aceptar conexiones SSH remotas. El demonio SSH escucha en puertos específicos, autentica las solicitudes de conexión y genera el entorno adecuado cuando se cumplen las condiciones.
Para esta guía, hemos configurado dos servidores Ubuntu. El servidor primario se configurará para conectarse al servidor secundario. El servidor secundario se configurará para aceptar conexiones SSH desde el servidor primario. Estas direcciones IP de servidor se utilizarán a lo largo de la guía:
-
Primario: 31.171.250.121
-
Secundario: 31.171.250.130
Para empezar, puede echar un vistazo a nuestras guías detalladas sobre cómo usar SSH para conectarse a un servidor remoto en Ubuntu y cómo configurar su servidor Linux para usar la autenticación basada en claves SSH. ¡Ahora, empecemos!
Autenticación SSH
Existen dos tipos principales de autenticación SSH. El método tradicional consiste en utilizar una contraseña. Es menos seguro y no se recomienda en absoluto. El segundo método son las claves SSH. Las claves SSH ofrecen una seguridad muy sólida y son muy recomendadas.
Aunque la autenticación por contraseña es más sencilla de entender y configurar, es fácil de explotar. Por ejemplo, los bots automatizados pueden usar la fuerza bruta para entrar en un sistema. Las claves SSH son claves criptográficas. Cada clave tiene dos partes – una clave privada y una clave pública. La clave pública se puede compartir en cualquier lugar sin ninguna preocupación. Sin embargo, la clave privada debe permanecer protegida.
Para utilizar las claves SSH como método de autenticación, el sistema remoto debe tener instalada una copia de la clave pública. También se deben instalar copias de las claves privada y pública en el sistema local. Por defecto, las claves públicas se listan en el siguiente archivo. Cada usuario único tiene una copia única de este archivo:
|
1 |
~/.ssh/authorized_keys |
Así es como funciona el proceso de autenticación:
-
El sistema cliente envía una solicitud de conexión al sistema remoto. También envía qué clave SSH utilizar.
-
El sistema remoto comprueba si la clave pública está listada en authorized_keys.
-
Si la clave existe, se genera una cadena aleatoria y se cifra utilizando la clave pública. El mensaje cifrado solo se puede descifrar utilizando la clave privada.
-
Al recibir la cadena, el cliente la descifrará.
-
Combinando la cadena y el ID de sesión negociado previamente, se genera un hash MD5. El cliente envía el hash MD5 al sistema remoto.
-
El sistema remoto conoce la cadena aleatoria y el ID de sesión. Si el hash MD5 coincide, se permite la conexión.
Claves SSH
En esta guía, la clave SSH será el foco principal de la autenticación. Por lo tanto, esta sección se centrará en cómo trabajar con claves SSH.
-
Generar un par de claves SSH
Por defecto, un sistema Linux no tiene una clave SSH instalada. Sin embargo, el sistema puede contener claves SSH generadas o instaladas previamente. Suponiendo que no haya ninguna clave SSH previa, necesitamos generar un nuevo par de claves SSH pública y privada. SSH admite muchos algoritmos criptográficos para generar claves SSH, por ejemplo, RSA, DSA, ECDSA y EdDSA. RSA es el algoritmo predeterminado y preferido.
-
Generar un par de claves RSA normal
Para generar un par de claves SSH, ejecute el siguiente comando:
|
1 |
ssh-keygen |
El sistema le preguntará dónde almacenar el par de claves. Como se mencionó, será un par de claves RSA. Si no se introduce ningún valor, SSH lo guardará en la ubicación predeterminada /home/demo/.ssh/id_rsa.
El siguiente paso es introducir una frase de contraseña. Se recomienda utilizar una frase de contraseña. La longitud de la frase de contraseña es arbitraria. Añade una capa de seguridad. Sin embargo, SSH permite generar claves sin ninguna frase de contraseña. Simplemente presione Enter si desea claves sin frase de contraseña.
La salida final proporciona la siguiente información de la clave:
-
La ubicación de la clave privada ( /root/.ssh/id_rsa). Nunca debe compartirse.
-
La ubicación de la clave pública ( /root/.ssh/id_rsa.pub). Es seguro compartirla con cualquiera.
-
La huella digital de la clave.
-
Una imagen aleatoria de la clave. La idea es que, si hay una vulneración de las claves, probablemente pueda notarlo al observar cualquier cambio en la imagen de la clave.
-
Generar un par de claves RSA con diferentes bits
Por defecto, las claves SSH son de 2048 bits. Por seguridad, se considera que es suficiente. Sin embargo, podemos especificar manualmente el uso de un número diferente de bits. Cuanto mayor sea el valor de bits, más fuerte será la clave.
Ejecute el siguiente comando para generar un par de claves SSH de 4096 bits. La mayoría de los servidores admiten claves SSH de 4096 bits. Si la clave es demasiado grande, es posible que no se acepte por motivos de protección contra DDoS:
|
1 |
ssh-keygen -b 4096 |
Debido a que ya habíamos generado un par de claves, SSH preguntará si desea sobrescribir el anterior. El resto del proceso es el mismo que para generar un par de claves normal.
-
Cambiar la frase de contraseña de la clave privada
Podemos cambiar la frase de contraseña de la clave privada. El proceso requiere que conozca la frase de contraseña actual. Para cambiar la frase de contraseña, ejecute el siguiente comando:
|
1 |
ssh-keygen -p |

El comando le pedirá que introduzca la ubicación de la clave privada. Presione Enter si la clave está almacenada en la ubicación predeterminada. Introduzca la frase de contraseña actual. Si se acepta, podrá designar una nueva.
-
Mostrar la huella digital de una clave SSH
Cada par de claves SSH comparte una huella digital criptográfica. Esta huella digital se puede utilizar para identificar claves únicas. Puede ser útil en numerosas situaciones. Ejecute el siguiente comando para comprobar la huella digital de una clave SSH:
|
1 |
ssh-keygen -l |

Introduzca la ubicación de la clave. Presione Enter si la clave está almacenada en la ubicación predeterminada.
Copiar la clave pública
El par de claves SSH está listo para asegurar conexiones remotas. Para que el sistema remoto acepte la clave SSH para la autenticación, necesita tener una copia de la clave pública. Existen múltiples formas de realizar una copia de la clave pública en el servidor remoto.
-
Uso de ssh-copy-id
El ssh-copy-id viene como parte del paquete OpenSSH. Es la forma predeterminada de copiar la clave pública SSH. Es simple y fácil de usar. Ejecute el siguiente comando para transferir una copia de la clave pública:
|
1 |
ssh-copy-id <username>@<secondary_server_ip> |

Necesita la contraseña de la cuenta de usuario remoto para completar el proceso. Si tiene éxito, aparecerá un mensaje de éxito.
-
Uso de la conexión SSH
Si usar la utilidad ssh-copy-id no está disponible pero el servidor principal puede conectarse al servidor secundario usando SSH, entonces podemos usar un truco diferente para copiar la clave. Consiste en canalizar el contenido de la clave pública a través del comando SSH al lado remoto. Tenga en cuenta que si el directorio ~/.ssh no existe en el sistema remoto, es posible que no funcione:
|
1 |
cat ~/.ssh/id_rsa.pub | ssh <username>@<secondary_server_ip> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" |
-
Copiar manualmente
Si una conexión remota no es una opción, el único proceso que queda es agregar manualmente la clave pública al servidor remoto. Primero, obtenga el contenido de la clave pública:
|
1 |
cat ~/.ssh/id_rsa.pub |
En el servidor remoto, coloque la clave en la ubicación adecuada:
|
1 2 3 |
mkdir -pv ~/.ssh echo <public_key> >> ~/.ssh/authorized_claves |
Uso de SSH
Ahora que la clave pública está configurada, estamos listos para usar SSH para conectarnos de forma remota.
-
Conectarse a un sistema remoto
El primer paso es aprender a conectarse al sistema remoto usando SSH. Se asume que tanto el sistema local como el remoto permiten el tráfico SSH. Para conectarse al sistema remoto, escriba lo siguiente:
|
1 |
ssh <secondary_server_ip> |

Para conectarse a un usuario específico en el servidor remoto, use la siguiente estructura en su lugar:
|
1 |
ssh <username>@<secondary_server_ip> |

Si es la primera vez que se conecta al servidor, SSH puede mostrar una advertencia. Ingrese yes para continuar con la conexión. Si la cuenta remota está protegida por contraseña, tendrá que ingresar la contraseña. Si la clave SSH está protegida por una frase de contraseña, también tendrá que ingresar la frase de contraseña.
-
Conectarse a un puerto diferente
Por defecto, SSH se ejecuta en el puerto 22. El cliente SSH asumirá el valor del puerto por defecto al conectarse al sistema remoto. Sin embargo, si el sistema remoto escucha en un puerto diferente para el tráfico SSH, no funcionará. En tal situación, necesitamos declarar manualmente el número de puerto. Para declarar el puerto específico, use la opción -p :
|
1 |
ssh -p <port> <username>@<secondary_server_ip> |
Declarar manualmente el puerto todo el tiempo es contraproducente. Podemos cambiar el valor del puerto por defecto de forma permanente. Para hacerlo, abra el archivo de configuración de SSH. Si el archivo no existe, el siguiente comando lo creará:
|
1 |
nano ~/.ssh/config |
Luego, agregue las siguientes líneas:
|
1 2 3 4 5 |
Host <remote_alias> HostName <remote_hostname> Port <port_value> |
-
Ejecutar comandos en el servidor remoto
Ahora que la conexión está establecida, cualquier comando que ejecute en la terminal local se enviará al servidor remoto. Cualquier salida generada se enviará a la terminal local.
Si es un solo comando a ejecutar, podemos ejecutarlo sin realizar un inicio de sesión SSH completo. Simplemente podemos declarar el comando después de la instrucción de conexión SSH:
|
1 |
ssh <username>@<secondary_server_ip> <command_to_run> |
-
Agregar una clave a un agente SSH
Si la clave SSH tiene una frase de contraseña, cada vez que se conecte al sistema remoto tendrá que ingresar la frase de contraseña. Hacerlo repetidamente es contraproducente. Podemos dejar que un agente SSH se encargue de ello. Es una pequeña utilidad que almacena la clave privada después de haber ingresado la frase de contraseña. La clave privada estará disponible durante la sesión de la terminal. Para iniciar el agente SSH, ejecute el siguiente comando:
|
1 |
eval $(ssh-agent) |

El programa se está ejecutando en segundo plano. Todo lo que necesita es agregar su clave privada al agente. Ejecute el siguiente comando:
|
1 |
ssh-add |

Ingrese la frase de contraseña para completar la operación.
-
Reenvío de credenciales SSH
También podemos configurar SSH para conectarse de un servidor a otro sin contraseña. Puede ser bastante eficiente, especialmente cuando se trabaja con numerosos servidores remotos. Para lograrlo, necesitamos reenviar las credenciales SSH. El reenvío de credenciales SSH requiere que el servidor remoto esté configurado para aceptar una conexión desde la máquina o servidor local. Luego, todo lo que necesita es conectarse al primer servidor usando la opción -A . Reenvía sus credenciales a los servidores para la sesión actual:
|
1 |
ssh -A <username>@<secondary_server_ip> |
Configuraciones del servidor remoto
Esta sección contiene algunas de las configuraciones comunes del lado del servidor para ayudarle a mejorar las respuestas del servidor y la seguridad de la conexión.
-
Desactivar la autenticación por contraseña
Si las claves SSH están configuradas y la conexión SSH funciona como se espera, entonces es seguro deshabilitar la autenticación por contraseña. La siguiente configuración dejará de solicitar una contraseña cuando cualquier usuario se conecte a través de SSH. En el servidor remoto, abra el sshd_config archivo con root/sudo privilegios:
|
1 |
sudo nano /etc/ssh/sshd_config |
A continuación, busque la entrada PasswordAuthentication. Si la línea está comentada, descoméntela. Cambie el valor a no:
|
1 |
PasswordAuthentication no |

Guarde el archivo y cierre el editor. Para que los cambios surtan efecto, reinicie el servicio SSH:
|
1 |
sudo service ssh restart |
Si el sistema es CentOS/Fedora, use el siguiente comando en su lugar:
|
1 |
sudo service sshd restart |
-
Cambiar el puerto SSH
Como se mencionó anteriormente, SSH utiliza el puerto 22 para intercambiar tráfico SSH. Sin embargo, según algunos administradores de sistemas, es mejor asignar un puerto diferente para SSH. Puede ayudar contra los bots automatizados que inundan el puerto. Para cambiar el puerto en el que escucha SSH, abra el archivo sshd_config :
|
1 |
sudo nano /etc/ssh/sshd_config |
Busque la entrada Port. Si está comentada, descoméntela. Luego, cambie el valor a un valor diferente. El valor del puerto es un entero de 16 bits sin signo (0-65535):
|
1 |
Port 1024 |

Guarde el archivo y cierre el editor. Para implementar el cambio, reinicie el demonio SSH:
|
1 |
sudo service ssh restart |
En CentOS/Fedora, ejecute el siguiente comando en su lugar:
|
1 |
sudo service sshd restart |
-
Limitación de usuarios
Podemos configurar qué cuentas de usuario pueden conectarse usando SSH. También implica modificar el archivo sshd_config . Abra el archivo con privilegios de sudo/root:
|
1 |
sudo nano /etc/ssh/sshd_config |
Busque la entrada AllowUsers. Añada los usuarios permitidos:
|
1 |
AllowUsers <user_1> <user_2> |

Guarde el archivo y cierre el editor. Reinicie el demonio SSH para que los cambios surtan efecto:
|
1 |
sudo service ssh restart |
En CentOS/Fedora, ejecute el siguiente comando en su lugar:
|
1 |
sudo service sshd restart |
-
Limitación de grupos
De manera similar a la limitación de usuarios, también podemos determinar qué grupo de usuarios puede conectarse al sistema mediante SSH. Abra el archivo sshd_config :
|
1 |
sudo nano /etc/ssh/sshd_config |
Use la entrada AllowGroups para añadir un grupo de usuarios específico que pueda usar SSH:
|
1 |
AllowGroups <user_group> |

Guarde el archivo y cierre el editor. Reinicie el demonio SSH para que los cambios surtan efecto:
|
1 |
sudo service ssh restart |
Para CentOS/Fedora, ejecute el siguiente comando en su lugar:
|
1 |
sudo service sshd restart |
Tenga en cuenta que si se añade o elimina algún usuario del grupo de usuarios, es necesario reiniciar el demonio SSH. De lo contrario, los cambios de grupo no serán efectivos.
-
Deshabilitar el inicio de sesión como root
Si tiene acceso a un usuario con privilegios de sudo, se recomienda deshabilitar el inicio de sesión como root a través de SSH. Abra el archivo sshd_config :
|
1 |
sudo nano /etc/ssh/sshd_config |
Cambie el valor de la entrada PermitRootLogin a no:
|
1 |
PermitRootLogin no |

Guarde el archivo y cierre el editor. Reinicie el demonio SSH para que el cambio surta efecto:
|
1 |
sudo service ssh restart |
En CentOS/Fedora, ejecute el siguiente comando en su lugar:
|
1 |
sudo service sshd restart |
-
Redirección de pantallas de aplicaciones X
El demonio SSH también puede redirigir la pantalla de las aplicaciones X desde el servidor al cliente. Sin embargo, para que esto funcione, el sistema remoto debe tener configurado un sistema de ventanas X. La función también debe estar habilitada en la configuración de SSH. Abra el archivo de configuración de SSH:
|
1 |
sudo nano /etc/ssh/sshd_config |
Cambie el valor de la directiva X11Forwarding a yes:
|
1 |
X11Forwarding yes |

Guarde el archivo y cierre el editor. Reinicie el demonio SSH para que el cambio surta efecto:
|
1 |
sudo service ssh restart |
En CentOS/Fedora, ejecute el siguiente comando en su lugar:
|
1 |
sudo service sshd restart |
Configuraciones del cliente
En esta sección, eche un vistazo a algunas de las configuraciones comunes en el cliente SSH.
-
Información de conexión específica del servidor
En el sistema local, podemos definir los detalles específicos de una conexión remota. Toda la información se almacena en el archivo de configuración ubicado en ~/.ssh/config:
|
1 |
nano ~/.ssh/config |
Cada bloque de sistema remoto se indica mediante la palabra clave Host seguida de un alias. Todas las directivas específicas del sistema van aquí. Al conectarse al sistema remoto, SSH las aplicará automáticamente. Para obtener una explicación completa y detallada de la configuración, consulte la página de manual:
|
1 |
man ssh_config |

La entrada para una conexión remota seguirá la siguiente estructura:
|
1 2 3 |
Host <remote_hostname> <directive> <value> |
-
Tiempo de espera de la conexión
Es posible que se encuentre desconectado de las sesiones SSH antes de estar listo para realizar cualquier acción. Si el cliente no envía ningún paquete al servidor remoto, después de un tiempo, la conexión expira. Para evitar tales circunstancias, podemos configurar el cliente local para que envíe un paquete de vez en cuando para mantener la conexión activa.
Abra el archivo de configuración local:
|
1 |
nano ~/.ssh/config |
Debajo de la entrada de conexión remota, agregue la directiva ServerAliveInterval seguida del intervalo de paquetes en segundos:
|
1 |
ServerAliveInterval 120 |

Guarde el archivo y cierre el editor.
-
Deshabilitar la comprobación de host
Por defecto, cada vez que se intenta conectar a un nuevo servidor, el cliente SSH informará la huella digital del demonio SSH remoto. Es una función útil para verificar la autenticidad del host. Si un actor malicioso intenta suplantar al host remoto, aparecerá como un nuevo servidor.
Deshabilitar esta función puede ser un gran riesgo de seguridad. Generalmente, se recomienda mantener esta opción activada. En ciertas situaciones, sin embargo, deshabilitar la comprobación de host puede ser conveniente. Abra el archivo de configuración:
|
1 |
nano ~/.ssh/config |
Debajo de la sección del host remoto, agregue las siguientes directivas:

|
1 2 3 |
StrictHostKeyChecking no UserKnownHostsFile /dev/null |
La primera directiva deshabilitará la adición automática de nuevos hosts a la lista de hosts conocidos, almacenada en el archivo known_hosts. La segunda directiva es para no advertir sobre ningún cambio. Guarde el archivo y cierre el editor.
-
Multiplexación de SSH sobre una sola conexión TCP
A veces, establecer una conexión TCP puede requerir bastante tiempo. Si es necesario realizar múltiples conexiones a la misma máquina, la multiplexación es una excelente característica que puede aprovechar. La multiplexación SSH permite utilizar la misma conexión TCP para múltiples sesiones SSH. Ello reduce parte de la carga de trabajo requerida para establecer nuevas sesiones. Limitar el número de conexiones también puede ayudar.
Podemos configurar manualmente una conexión de multiplexación o dejar que SSH la use siempre que esté disponible. Aquí, configuraremos SSH para seguir la segunda ruta. Abra el archivo de configuración de SSH:
|
1 |
nano ~/.ssh/config |
Agregue una definición de host con comodín en la parte superior del archivo. Esto asegura que el siguiente conjunto de directivas se aplicará a todas las conexiones remotas. Agregue las siguientes directivas:
|
1 2 3 4 5 |
ControlMaster auto ControlPath ~/.ssh/multiplex/%r@%h:%p ControlPersist 1 |

La primera directiva le dice a SSH que use la multiplexación automáticamente siempre que esté disponible. La segunda directiva establece la ruta al socket de control. Este socket se creará cuando se establezca la primera sesión. Las sesiones posteriores seguirán este socket.
La última directiva le dice a SSH que permita que la conexión maestra inicial quede en segundo plano. También significa que las conexiones TCP terminarán automáticamente un segundo después de la última sesión de SSH. A continuación, cree el directorio que declaramos en el archivo de configuración:
|
1 |
mkdir -pv ~/.ssh/multiplex |
Finalmente, la multiplexación debería estar activa.
Códigos de escape de SSH
Después de establecer una conexión, existen formas de controlar el comportamiento de la conexión mediante códigos de escape.
-
Forzar desconexiones
¿Está atascado en una sesión de SSH? Las sesiones de SSH generalmente son administradas por el servidor. Si el servidor experimenta problemas, quedarse atascado en una sesión de SSH muerta puede ser frustrante. Afortunadamente, OpenSSH ofrece controles útiles para administrar el estado de la conexión desde el lado del cliente.
Presione Enter un par de veces. Luego, ingrese el siguiente comando:
|
1 |
~. |
![]()
Aquí, ~ es el carácter de control. Después de ejecutar este comando desde el cliente, la conexión debería cerrarse inmediatamente.
-
Sesión de SSH en segundo plano
También podemos poner una sesión de SSH en segundo plano. Al ponerla en segundo plano, volverá a la sesión de shell normal. Una vez que haya terminado su trabajo, puede volver a la shell de SSH. Tenga en cuenta que debe tener una configuración de tiempo de espera adecuada para evitar que se agote el tiempo de espera mientras la sesión de SSH permanece en segundo plano. Para poner una sesión de SSH en segundo plano, ingrese el carácter de control seguido de Ctrl + Z:
|
1 |
~<Ctrl + Z> |

Si era su tarea en segundo plano más reciente, puede reactivarla usando el siguiente comando:
|
1 |
fg |
Si hay múltiples tareas en segundo plano, podemos determinarlo a partir de la lista de trabajos:
|
1 |
jobs |

Para traer el trabajo de destino al primer plano, anote el valor del trabajo de la primera columna. Luego, ejecute el siguiente comando:
|
1 |
fg %<valor_trabajo> |
-
Cambiar la configuración de reenvío de puertos
Usando el mecanismo de control, podemos cambiar las reglas de reenvío de puertos sobre la marcha. Una vez establecida la conexión, podemos crear o eliminar reglas de reenvío de puertos. Es parte de la interfaz de línea de comandos de SSH.
Para acceder a la interfaz de línea de comandos de SSH, ejecute el comando:
|
1 |
~C |
![]()
Para listar las opciones disponibles, ingrese el siguiente comando:
|
1 |
-h |
Si la salida es demasiado mínima, intente aumentar el nivel de detalle utilizando el siguiente comando de control:
|
1 |
~v |
Ahora, ejecute el comando -h nuevamente:
|
1 |
-h |

Como explica la salida, es bastante simple implementar cualquiera de los reenvíos de puertos con un comando simple. Por ejemplo, un túnel también se puede destruir usando el comando kill, representado por K en la lista de comandos.
Pensamientos finales
Es bastante común encontrarse con SSH. Por eso aprender SSH es muy útil. Nuestra descripción general completa de SSH cubre las configuraciones de SSH más importantes que los usuarios necesitan conocer para usar SSH en el día a día. Una vez dominado, debería poder trabajar con casi todas las configuraciones de servidores SSH.
¡Feliz computación!
Comentarios
Aún no hay comentarios. Sea el primero.