¿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 SSH?
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. En Windows 10 (versión 1809 o posterior) y Windows 11, el cliente OpenSSH viene como una función opcional del sistema (si no aparece instalado, puedes agregarlo desde «Características opcionales») y se usa desde PowerShell.
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 203.0.113.10 (una dirección de ejemplo) con la cuenta ana, debes ingresar:
ssh ana@203.0.113.10
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 '203.0.113.10 (203.0.113.10)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? yes
Ingresa yes la primera vez. El tipo de clave (ED25519, ECDSA o RSA) depende de lo que ofrezca el servidor, y la huella se muestra en formato SHA256.
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:
ana@203.0.113.10'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 con el algoritmo Ed25519, que es el que genera por defecto OpenSSH desde la versión 9.5 (octubre de 2023). El parámetro -C agrega un comentario que te ayuda a identificar la clave, por ejemplo tu correo:
ssh-keygen -t ed25519 -C "tu_correo@ejemplo.com"
Si te conectas a un servicio antiguo que solo admite RSA, puedes crear una clave de ese tipo con ssh-keygen -t rsa -b 4096.
El programa se ejecutará y te preguntará dónde guardar las claves:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/demo/.ssh/id_ed25519):
Presiona Enter para guardar en la ubicación predeterminada, el directorio .ssh/id_ed25519 en tu directorio de inicio.
El programa te pedirá una passphrase. Es como una contraseña para la clave y la protege si alguien consigue el archivo de la clave privada. Te recomendamos establecer una passphrase en tu equipo personal y cargar la clave con ssh-add (ver más abajo), así el agente evita que tengas que escribirla cada vez. Presionar Enter y dejarla vacía es posible, pero la clave quedará sin protección.
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_ed25519
Your public key has been saved in /home/demo/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx tu_correo@ejemplo.com
The key's randomart image is:
+--[ED25519 256]--+
| |
| |
| |
| + |
| o S . |
| o . * + |
| o + = O . |
| + = = + |
| ....Eo+ |
+-----------------+
Ahora tienes dos archivos:
- ~/.ssh/id_ed25519 — clave privada. ¡Nunca la compartas con nadie!
- ~/.ssh/id_ed25519.pub — clave pública. Puedes compartirla sin problemas.
En Windows 10 (1809 o posterior) y Windows 11, el cliente OpenSSH ya incluye ssh-keygen: abre PowerShell y ejecuta el mismo comando. También puedes usar WSL (el subsistema de Linux para Windows) o Git Bash, que viene con 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_ed25519.pub ana@203.0.113.10
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_ed25519.pub al final.
Ahora, no se te pedirá la contraseña del servidor al conectarte (si protegiste tu clave con una passphrase, se te pedirá esa passphrase, salvo que uses ssh-agent).
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:
- Si especificaste una passphrase (contraseña para la clave) al crear la clave, tendrás que ingresarla cada vez que te conectes
- 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, como Windows, puede ser necesario habilitar el servicio del agente (OpenSSH Authentication Agent) y configurar su inicio automático.
Si agregas una clave al agente, entonces:
- No se te pedirá la passphrase para esa clave
- No tendrás que especificar la clave manualmente, se utilizará automáticamente al conectarte correspondientemente
ssh-add /home/demo/.ssh/id_ed25519 agregará la clave id_ed25519 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 predeterminadas que existan en tu carpeta ~/.ssh, por ejemplo id_rsa, id_ecdsa o id_ed25519.
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 ana@203.0.113.10
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.
Usa -A solo con servidores de confianza. Mientras estés conectado, un administrador del servidor remoto (o quien lo haya comprometido) podría usar tu agente para autenticarse en tu nombre en otros servidores. Para saltar a través de un servidor intermedio suele ser preferible la opción -J (ProxyJump), por ejemplo ssh -J ana@bastion.ejemplo.com ana@destino.ejemplo.com. Y si solo necesitas hacer git pull en el servidor, considera usar una deploy key del repositorio.
Preguntas frecuentes
¿Cuál es la diferencia entre Telnet y SSH?
Telnet es un protocolo antiguo de acceso remoto que envía todo, incluidas las contraseñas, sin cifrar. SSH cifra la conexión y lo reemplazó en la práctica. No debes confundir Telnet con los clientes gráficos de SSH (por ejemplo, PuTTY), que son programas distintos y sí usan el protocolo SSH. En Linux, macOS y Windows moderno puedes conectarte con la utilidad de línea de comandos ssh.