¿Qué es el protocolo SSH?

Conexión a una máquina remota a través de la línea de comandos
Aprende sobre la línea de comandos remota que te permite realizar operaciones en una computadora mientras trabajas en otra
SSH es un protocolo seguro para acceder de forma remota a computadoras.
A través de SSH, puedes ejecutar comandos en la línea de comandos de una computadora que se encuentra físicamente en otro lugar.
En otras palabras, SSH es una línea de comandos remota. Visualmente, estás trabajando en tu propia computadora, pero en realidad estás trabajando en otra.
¿Qué significa "protocolo"?
Un protocolo es un conjunto de acuerdos y reglas mediante los cuales diferentes programas pueden intercambiar información. SSH es un conjunto de reglas que son conocidas tanto por tu computadora como por la computadora remota.
Ejemplo: ingresas un comando para eliminar un archivo. Este comando se envía a otra computadora y se ejecuta allí. La respuesta (o mensaje de error) regresa y se muestra en tu computadora.
¿Qué significa "protocolo seguro"?
Los sitios web con HTTPS y la banca en línea funcionan con este tipo de protocolo. En una conexión segura, todos los datos se transmiten de forma cifrada. Incluso si un intruso intercepta la información, no podrá descifrarla.
¿Para qué se utiliza SHH?
No siempre es posible estar físicamente cerca de la computadora con la que necesitas trabajar. Por ejemplo, si deseas crear tu propio sitio web, este estará alojado en la computadora de un proveedor de alojamiento. Esta computadora puede estar en el otro lado del mundo. Para ejecutar comandos en ella sin acceso físico, necesitarás una clave SSH.
¿Cómo conectarse a través de SSH?
Para conectarte a una máquina remota a través de SSH, necesitarás un cliente, que es un programa especial. En sistemas tipo *nix (Linux, macOS), el cliente generalmente está instalado de forma predeterminada, por lo que solo necesitas abrir la terminal.
Para conectarte, debes especificar la dirección del servidor y, opcionalmente, el nombre de usuario y el puerto. Así es como se ve el comando al usar el cliente de consola (en la terminal):

ssh username@remote_host -p port
Por ejemplo, para conectarte al servidor 52.307.149.244 con la cuenta ivan, debes ingresar:

ssh ivan@52.307.149.244
Si no especificas el puerto, se utilizará el puerto SSH predeterminado, que es 22. El puerto utilizado se configura en el servidor SSH, que es el programa que se ejecuta en la computadora remota y espera conexiones externas.
Fingerprint
Cuando te conectas por primera vez, aparecerá el siguiente mensaje:

The authenticity of host '52.307.149.244 (52.307.149.244)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
Ingresa yes la primera vez.

Esto se necesita para aumentar la seguridad. Al configurar el servidor SSH, se crea una combinación única de caracteres, llamada fingerprint (huella digital). Tu computadora guarda esta combinación y la verifica en cada nueva conexión. Imagina que alguien ha realizado cambios en el sistema, por ejemplo:
  • Reinstaló el servidor SSH
  • Reinstaló todo el sistema operativo
  • Reemplazó la computadora remota, manteniendo su dirección
Incluso en este caso, notarás los cambios porque el fingerprint también cambiará.
Si el fingerprint no cambia, no aparecerá este mensaje.
Conexión SSH con contraseña
La forma más sencilla es conectarse con una contraseña. Después de ingresar el comando ssh, el sistema te pedirá la contraseña:

ivan@52.307.149.244's password:
Deberás ingresar la contraseña cada vez.
Conexión SSH, con clave sin contraseña
Para una conexión conveniente a través de SSH (y muchos otros servicios) sin ingresar una contraseña, puedes usar claves.
Debes crear un par de claves: una clave privada (secreta) y una clave pública (abierta). Debes guardar la clave privada y nunca mostrarla a nadie. Puedes mostrar la clave pública a todos y distribuirla libremente.
Estas claves están vinculadas entre sí de tal manera que si cifras información con una clave, solo puedes descifrarla con la otra. Por ejemplo, si tu amigo cifra un mensaje con tu clave pública, solo tú podrás leerlo porque necesitarás tu clave privada. Y viceversa: si cifras algo con tu clave privada, solo se puede descifrar con tu clave pública. Dado que la clave pública está disponible para todos, cualquiera puede descifrar este mensaje. Pero pueden estar seguros de que el mensaje proviene de ti. Esta es la idea de la firma digital.
Generación de claves
Creemos un par de claves:

ssh-keygen
El programa se ejecutará y te preguntará dónde guardar las claves:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):
Presiona Enter para guardar en la ubicación predeterminada, el directorio .ssh/id_rsa en tu directorio de inicio.
El programa te pedirá una passphrase. Es como una contraseña para la clave. Puedes simplemente presionar Enter y omitir este paso. También puedes ingresar una passphrase, que deberás ingresar cada vez que uses la clave.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Las claves se han creado:

Your identification has been saved in /home/demo/.ssh/id_rsa.
Your public key has been saved in /home/demo/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|       +         |
|      o S   .    |
|     o   . * +   |
|      o + = O .  |
|       + = = +   |
|      ....Eo+    |
+-----------------+
Ahora tienes dos archivos:
  • ~/.ssh/id_rsa — clave privada. ¡Nunca la compartas con nadie!
  • ~/.ssh/id_rsa.pub — clave pública. Puedes compartirla sin problemas.
En Windows, puedes usar ssh-gen en el subsistema Ubuntu para Windows o en la línea de comandos de Git for Windows.
Cargar la clave pública del servidor
Debes agregar la clave pública al servidor en el archivo ~/.ssh/authorized_keys. La forma más sencilla es ejecutar el siguiente comando en tu máquina local para copiar la clave:

ssh-copy-id -i /home/demo/.ssh/id_rsa.pub ivan@52.307.149.244
Otra forma es conectarte con una contraseña, abrir el archivo ~/.ssh/authorized_keys en un editor y agregar el texto de tu archivo ~/.ssh/id_rsa.pub al final.

Ahora, no se te pedirá la contraseña al conectarte1.

Después de habilitar las conexiones con clave, se recomienda deshabilitar la conexión con contraseña.
ssh-agent
Cuando trabajas con claves, pueden surgir dos situaciones incómodas:
  • 1
    Si especificaste una passphrase (contraseña para la clave) al crear la clave, tendrás que ingresarla cada vez que te conectes
  • 2
    Si tienes varias claves para diferentes propósitos, tendrás que especificar la clave correcta manualmente al conectarte a través de ssh
ssh-agent resuelve estos problemas. Este agente de autenticación (authentication agent) funciona en segundo plano en sistemas tipo *nix. En algunos otros sistemas, es necesario instalarlo y configurar su inicio automático.

Si agregas una clave al agente, entonces:
  • 1
    No se te pedirá la passphrase para esa clave
  • 2
    No tendrás que especificar la clave manualmente, se utilizará automáticamente al conectarte correspondientemente
ssh-add /home/demo/.ssh/id_rsa agregará la clave id_rsa al agente en ejecución del sistema. Si tiene una passphrase, el agente te pedirá que la ingreses.

Si ejecutas ssh-add sin argumentos, se agregarán las claves ~/.ssh/id_rsa, ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 y ~/.ssh/identity.

Puedes ver la lista de claves agregadas al agente con el comando ssh-add -L:

→ ssh-add -L
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC91r/+5WEQHcxVMrxpP9jKuONjlrnEHshfG3v/ab2NKDSljdskODOIsdhaaoDoiSADhAaoDISHasoiDiASisjadOHISDdKJDASHSidshIHDSIHDIAsdjasAs7XG/drBhi16zQ2e8VcLD7bVQS1Cpo0O1tP+93YQBvcIE02RltqVKYo7BlgCaJzpdowK8fHSzpfCYsEFjdjosOjfdsjdjkAJOKkKKHJHhaIiAiaihsiIoqkpqdmlnvnuuUSCaAS8aDhajiadiiAahhakKAKDHAKurmD08jnX9HfH/d15pLK/Glo1Su6iEOU3bW8k92QlY54pPFLKiNRPFuUryE5md7T /Users/demo/.ssh/some_key.pem
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsLC9WpSZ/9YpQ2z1FTSsORcP+ohzCdVjYaoc3C0fRnUbkp4SnvMHFTHNFFod0FhV0cQcOLvBsZAK/0tUPIXeDDFvYD70r5i0AsQbqA0k7gK3b3MP7tmnPxMHd607TI+1FMO54Yig0vnpZOgKmgCsxWq6tckwyLB91BlPiGxLBZiu5yPDIguEQCSnAwkF0vjqrNGsoHB4+fkj0USfjiifsjihf39hifSIHiJFHSijshfj39jfsjisfiisfiissr893IFsifijfsjSOIiAShadfhssU0q0JpjaDEWcMmYXmuz3xSnbhkueGLBXMU2zXDFDWCDSHq9/oRr29UAfVaHAMw== /Users/demo/.ssh/id_rsa
ssh-agent está vinculado a la sesión. Por lo tanto, por ejemplo, si reinicias la computadora, deberás agregar las claves al agente nuevamente.
Reenvío de claves
Imagina que te has conectado a un servidor remoto X. Luego, deseas conectarte desde ese servidor a otro servidor Y, por ejemplo, para hacer git pull desde GitHub. En este caso, deberás tener una copia de tus claves en el servidor X.

La utilidad ssh con la opción -A permite "reenviar" las claves desde la máquina a la que te conectas a la remota:

ssh -A ivan@52.307.149.244
Las claves agregadas al agente de autenticación (ssh-agent) estarán disponibles en el servidor remoto. Sin embargo, los archivos de clave no estarán físicamente en el servidor.
Preguntas frecuentes
¿Cuál es la diferencia entre Telnet y SSH?

Telnet es un programa específico con una interfaz gráfica que se utiliza para conectarse a través de SSH. Por lo general, solo los usuarios de Windows lo utilizan, mientras que en Linux y macOS se utiliza la utilidad de línea de comandos ssh.
Enlaces adicionales
Leer otros artículos de Guías
Lea otros artículos relevantes del mundo de la tecnología y el espíritu empresarial.