Qué es SSH
SSH significa Secure Shell (terminal seguro). Es la forma estándar de abrir una terminal dentro de una computadora que está lejos de ti. En lugar de escribir comandos en tu máquina, escribes comandos que se ejecutan directamente en el servidor, como si estuvieras sentado frente a él. Y todo lo que pasa entre los dos extremos va cifrado, es decir, codificado, para que nadie en el camino pueda leerlo.
servidor mediante túnel -->🧠 Analogía: un túnel secreto y blindado
Imagina que tu servidor está en una fortaleza distante. Para comunicarte con él, podrías gritar por la calle, pero cualquiera te oiría. SSH construye un túnel secreto y blindado que va directamente desde tu escritorio hasta el interior de la fortaleza. Todo lo que envías por este túnel:
- •Nadie de afuera puede leerlo (se cifra)
- •Nadie se hace pasar por ti (se requiere tu clave para acceder)
- •Tú mandas desde dentro (escribes aquí, se ejecuta allá)
💡 Consejo: ya usas SSH sin darte cuenta
Cuando haces git push para GitHub usando una URL que empieza con git@github.com, por debajo de todo, es SSH quien realiza la conexión segura. El mismo protocolo que usarás para entrar a tu VPS ya mueve tu código todos los días.
Generando tu par de claves
SSH usa dos claves que se generan juntas: una publica es una privada. La pública la distribuyes entre los servidores a los que quieres acceder. La privada queda guardada en tu máquina y nunca, jamás, sal de ella. Tú tienes tu clave privada. Todo el mundo tiene tu clave pública, y eso está bien.
🧠 Analogía: candado y llave
La clave publica y es como un candado abierto: tú distribuyes copias a todo el mundo. Cualquiera puede cerrar una puerta con su candado. Pero solo la llave privada abre ese candado, y esa clave solo existe en tu bolsillo. Por eso, compartir la pública es seguro, y perder la privada es peligroso.
ssh-keygen - Crear el par de claves
Ejecuta este comando en la tu máquina (no en el servidor). El -t ed25519 elige un tipo de clave moderno y seguro.
$ ssh-keygen -t ed25519 -C "seu-email@exemplo.com"
Generating public/private ed25519 key pair.
# ¿Dónde guardar? Presiona Enter para usar el valor predeterminado
Enter file in which to save the key (/home/voce/.ssh/id_ed25519):
# Contraseña de la clave (opcional, pero recomendada). Puedes dejarla vacía
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/voce/.ssh/id_ed25519
Your public key has been saved in /home/voce/.ssh/id_ed25519.pub
Mira los dos archivos creados
$ ls -l ~/.ssh
# -rw------- = solo tú lees y escribes (la privada)
-rw------- 1 voce voce 411 jun 17 10:00 id_ed25519
# .pub = la pública (se puede mostrar)
-rw-r--r-- 1 voce voce 102 jun 17 10:00 id_ed25519.pub
# Ver el contenido de la PUBLICA (esta puedes copiarla)
$ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... seu-email@exemplo.com
✓ Qué HACER
- ✓Compartir solo el archivo
.pub - ✓Poner una passphrase en la clave privada
- ✓Hacer una copia de seguridad de la clave privada en un lugar seguro
✗ Qué NO hacer
- ✗Enviar la clave privada (
id_ed25519) para nadie - ✗Subir la clave privada a GitHub o a una nube pública
- ✗Pegar la clave privada en chats o correos electrónicos
⚠️ Error común
Problema: Copiaste el archivo equivocado y el servidor rechaza la conexión.
Solución: Debes copiar el contenido del archivo que termina en .pub (la clave pública). Si copiaste el archivo sin el .pub, guarda la clave privada, que nunca debe salir de tu máquina. Revisa siempre el .pub al final del nombre.
Copiar la clave pública al servidor
Tu clave pública debe estar en el servidor para que te reconozca. El servidor guarda las claves autorizadas en un archivo llamado ~/.ssh/authorized_keys. Cada vez que intentas entrar, comprueba si tu clave está en esta lista. Hay dos formas de agregarla: la fácil (ssh-copy-id) y la manual.
Forma fácil: ssh-copy-id
Un solo comando copia tu clave pública y la coloca en el lugar correcto.
$ ssh-copy-id usuario@192.168.0.10
# Te pide la CONTRASEÑA del servidor (solo esta vez)
usuario@192.168.0.10's password:
Number of key(s) added: 1
Now try logging into the machine with: "ssh usuario@192.168.0.10"
Forma manual: authorized_keys
Si el ssh-copy-id no existe (algo común en Windows), hazlo manualmente. Primero copia tu clave pública y luego pégala en el servidor.
# En TU máquina, mira la clave pública
$ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3Nza... voce@exemplo.com
# Entra al servidor y pégala en la lista de autorizadas
$ ssh usuario@192.168.0.10
$ mkdir -p ~/.ssh && chmod 700 ~/.ssh
$ echo "ssh-ed25519 AAAAC3Nza... tú@ejemplo.com" >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
Prueba el acceso con clave
Ahora intenta entrar de nuevo. Si la clave funcionó, no ya no pide la contraseña.
$ ssh usuario@192.168.0.10
# ¡Si no pide contraseña, la clave funciona!
Welcome to Ubuntu 22.04 LTS
usuario@servidor:~$
⚠️ Error común
Problema: Aunque la clave esté copiada, el servidor sigue pidiendo la contraseña.
Solución: Casi siempre son permisos incorrectos. SSH ignora la carpeta .ssh si está "demasiado abierta". Ejecútalo en el servidor: chmod 700 ~/.ssh e chmod 600 ~/.ssh/authorized_keys. Esto cierra el archivo para que solo tú puedas verlo.
Conectar: ssh usuario@ip
El comando para entrar es sencillo: ssh usuario@ip. O usuario y es la cuenta dentro del servidor (generalmente root o un nombre que creaste) y el IP y es la dirección del VPS que anotaste en el módulo anterior. En el primer acceso, SSH te mostrará la "huella digital" (fingerprint) del servidor y te preguntará si confías en él.
Anatomía del comando
$ ssh root@203.0.113.45
↑ ↑ ↑
cmd usuario ip del servidor
# Para usar un puerto distinto del predeterminado (22)
$ ssh -p 2222 root@203.0.113.45
👁 Qué vas a ver en el primer acceso
$ ssh root@203.0.113.45
The authenticity of host '203.0.113.45' can't be established.
ED25519 key fingerprint is SHA256:a1b2c3d4...
Are you sure you want to continue connecting (yes/no)?
yes
Warning: Permanently added '203.0.113.45' to known hosts.
Welcome to Ubuntu 22.04 LTS
root@servidor:~$
Esta fingerprint y es la identidad del servidor. Escribes yes una sola vez. SSH guarda esa identidad en el archivo ~/.ssh/known_hosts y, las próximas veces, ya no pregunta.
💡 Consejo: para salir, escribe exit
Mientras estés conectado, cada comando se ejecuta en el servidor, no en tu máquina. Para cerrar la sesión y volver a tu terminal local, solo tienes que escribir exit y presiona Enter. El prompt vuelve a mostrar el nombre de tu máquina.
⚠️ Error común
Problema: Connection refused o Connection timed out.
Solución: Verifica tres cosas. (1) ¿La IP es correcta? Compárala con el panel del proveedor. (2) ¿El servidor está encendido? (3) ¿El puerto 22 está habilitado en el firewall del VPS? "Refused" suele indicar que el servicio está detenido; "timed out" suele indicar que el firewall está bloqueando. Ajustarás el firewall en el próximo módulo.
Atajos con ~/.ssh/config
Escribir ssh root@203.0.113.45 -p 2222 hacerlo cada vez cansa y es fácil equivocarse. El archivo ~/.ssh/config te permite dar un apodo para cada servidor. Después, ingresas un nombre corto, como ssh meuvps, y SSH completa el resto automáticamente.
🧠 Analogía: los contactos del celular
No memorizas el número de teléfono de cada amigo: lo guardas en tus contactos con un nombre y llamas por el nombre. El ~/.ssh/config y es tu agenda de servidores. En vez de memorizar la IP, el usuario y el puerto, guardas todo con un apodo y te "conectas" usando ese apodo.
Crear el archivo de config
Abre (o crea) el archivo en tu máquina con nano y escribe un bloque por servidor:
$ nano ~/.ssh/config
# Escribe esto dentro de nano:
Host meuvps
HostName 203.0.113.45
User root
Port 2222
IdentityFile ~/.ssh/id_ed25519
Guarda con Ctrl+O, Enter, y sal con Ctrl+X.
Qué significa cada línea
- •
Host- el alias que vas a escribir (por ejemplo:meuvps) - •
HostName- la IP o el dominio real del servidor - •
User- el usuario con el que inicias sesión - •
Port- el puerto de SSH (solo si es diferente de 22) - •
IdentityFile- qué clave privada usar en esta conexión
Antes y después
# Antes: comando largo y fácil de equivocarse
$ ssh -p 2222 -i ~/.ssh/id_ed25519 root@203.0.113.45
# Después: solo el apodo
$ ssh meuvps
root@servidor:~$
✓ Qué HACER
- ✓Usar alias claros (
prod,teste) - ✓Indenta las líneas dentro de cada
Host - ✓Apuntar la
IdentityFilecorrecta por servidor
✗ Qué NO hacer
- ✗Escribir el puerto en la línea del
Host - ✗Apuntar la
IdentityFilepara la clave.pub - ✗Dejar el archivo legible para otros usuarios
Deshabilitando el acceso con contraseña
Mientras el servidor acepte contraseñas, los bots de internet intentarán adivinar la tuya miles de veces al día. Como ahora ya accedes con una clave, puedes cerrar definitivamente la puerta de la contraseña. Sin aceptar contraseñas, estos ataques dejan de funcionar. Solo puede entrar quien tenga la clave privada correcta, es decir, tú.
⚠️ Cuidado: prueba la clave ANTES
Esta es la parte más peligrosa del módulo. Si desactivas la contraseña sin asegurarte de que la clave funcione; podrías quedarte fuera de tu propio servidor. Regla de oro: abre una segunda ventana de la terminal, confirma que ssh meuvps entra sin pedir contraseña y solo después modifica la configuración. Mantén abierta la sesión actual como medida de seguridad.
Abre el archivo de configuración de SSH
En el servidor, edita el archivo principal con permisos de administrador (sudo).
$ sudo nano /etc/ssh/sshd_config
Cambia la línea PasswordAuthentication
Busca esta línea (puede estar con # al frente, que es un comentario) y déjalo así:
# Antes (aceptaba contraseña)
#PasswordAuthentication yes
# Después (sin el # y con "no")
PasswordAuthentication no
Guarda con Ctrl+O, Enter y sal con Ctrl+X.
Reinicia el servicio SSH
El cambio solo se aplica después de reiniciar el sshd. Tu sesión actual sigue abierta.
$ sudo systemctl restart ssh
# En algunos sistemas el servicio se llama sshd
$ sudo systemctl restart sshd
Confirma en una ventana nueva
Sin cerrar la sesión anterior, abre otra e inicia sesión de nuevo. Debe funcionar con la clave.
$ ssh meuvps
# ¡Pudiste entrar sin que te pidiera contraseña = todo bien!
root@servidor:~$
👁 Qué cambia para un atacante
# Intento de alguien que no tiene tu clave:
$ ssh root@203.0.113.45
root@203.0.113.45: Permission denied (publickey).
Observa el publickey: el servidor indica que solo acepta claves. Sin contraseña que adivinar, el ataque automático no tiene por dónde intentarlo.
💡 Consejo: guarda un plan B
Casi todos los proveedores de VPS ofrecen un consola web (a veces llamado «VNC» o «consola serial») en el panel de control. Si algún día pierdes el acceso por SSH, esa consola te permite entrar al servidor desde el navegador, sin depender de SSH. Averigua dónde está ese botón antes de necesitarlo.
📚 Resumen del módulo
Siguiente módulo:
3.3 - Firewall: controlar qué puertos quedan abiertos y cerrar el servidor al mundo