Usar SSH de forma inteligente
Módulo 2: SSH y claves · Tiempo de lectura: 10 minutos
Objetivo de aprendizaje: Después de esta lección podrá usar SSH a diario de forma práctica con su propio archivo de configuración, copiar archivos con scp y rsync, y llegar a una base de datos mediante un túnel sin tener que abrir el puerto de la base de datos a internet.
Conceptos clave: ~/.ssh/config, Host, HostName, User, IdentityFile, scp, rsync, sftp, port forwarding, -L, túnel, ProxyJump, ServerAliveInterval, otro número de puerto, revocar una clave
Escribir menos con ~/.ssh/config
Al cabo de unas semanas escribirá esto decenas de veces al día:
anna@laptop:~$ ssh -i ~/.ssh/id_ed25519 anna@192.0.2.10Con un archivo de configuración para el cliente el comando se acorta y comete menos errores. El archivo está en su propio ordenador: ~/.ssh/config (Windows: C:\Users\anna\.ssh\config, sin extensión).
Host web1
HostName 192.0.2.10
User anna
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
Host test
HostName test.example.com
User anna
Port 2222Ahora basta con:
anna@laptop:~$ ssh web1
anna@web1:~$¿Qué hacen estas líneas?
- Host es el alias que usted elige. Lo escribe después de
ssh,scpyrsync. - HostName es la dirección real: una dirección IP o un nombre que figura en el DNS.
- User y Port son el nombre de usuario y el puerto, para que no tenga que recordarlos.
- IdentityFile indica la clave. Resulta útil si tiene varias claves; sin esta línea, ssh prueba sus claves predeterminadas.
- ServerAliveInterval 60 envía cada 60 segundos una pequeña señal de vida. Muchos routers domésticos y redes wifi cortan una conexión inactiva al cabo de unos minutos; así su sesión permanece abierta.
Aquí también cuenta el primer valor, igual que en el servidor. Por eso, coloque las reglas generales como Host * al final del archivo.
Copiar archivos: scp, rsync y sftp
scp copia un archivo, con la misma forma que cp, pero con host: delante:
anna@laptop:~$ scp backup.sql web1:/home/anna/
anna@laptop:~$ scp web1:/var/log/nginx/error.log .rsync es más inteligente con carpetas y grandes cantidades de datos: solo envía lo que ha cambiado y puede reanudar una copia interrumpida. Debe estar instalado en ambos lados (apt install rsync).
anna@laptop:~$ rsync -avz --progress ./site/ web1:/var/www/example.com/Fíjese en la barra después de ./site/: con barra, rsync copia el contenido de la carpeta; sin barra, copia la carpeta misma (obtendrá entonces /var/www/example.com/site/). Si tiene dudas, pruebe primero con --dry-run, y tenga mucho cuidado con --delete, que en el lado receptor elimina todo lo que no existe en su lado.
sftp y los programas gráficos como FileZilla o WinSCP usan la misma conexión SSH y la misma clave. Por lo tanto, no necesita un servidor FTP aparte. No se recomienda un servidor FTP tradicional en un VPS: el FTP normal envía su contraseña sin cifrar por la red.
Un túnel en lugar de un puerto abierto
Quizá sea lo más útil que puede hacer SSH. Supongamos que en su servidor funciona una base de datos PostgreSQL y quiere acceder a ella desde su portátil con un programa gráfico. La tentación de abrir el puerto 5432 a internet es grande. No lo haga: los puertos de bases de datos abiertos son una de las principales causas de filtraciones de datos (lección 10.2), y más adelante el curso comprueba desde fuera que están cerrados (ejercicio Z5.1).
Con el reenvío de puertos local (local port forwarding) hace que SSH cree un túnel:
anna@laptop:~$ ssh -L 5432:127.0.0.1:5432 web1Léalo así: "escucha en mi portátil en el puerto 5432 y envía todo lo que llegue allí por la conexión SSH a 127.0.0.1:5432, visto desde el servidor". Mientras esta sesión esté abierta, conecte su programa de base de datos a localhost, puerto 5432, en su propio portátil, y llegará a la base de datos del servidor.
¿Por qué es tan bueno?
- La base de datos solo escucha en
127.0.0.1en el servidor y no es accesible desde fuera. - La conexión está cifrada por SSH, aunque la base de datos no tenga cifrado propio.
- Solo quien puede iniciar sesión por SSH tiene acceso. Así aprovecha la seguridad sólida que ya tiene.
Si en su portátil ya hay algo en el puerto 5432, elija otro número a la izquierda: -L 15432:127.0.0.1:5432, y conéctese al puerto 15432. Si guarda el túnel en ~/.ssh/config, lo tendrá siempre a mano:
Host web1-db
HostName 192.0.2.10
User anna
LocalForward 15432 127.0.0.1:5432Con ssh -N web1-db obtiene solo el túnel, sin línea de comandos.
A través de un servidor intermedio: ProxyJump
A veces solo puede llegar a un servidor a través de otro, por ejemplo un servidor de base de datos sin dirección IP pública detrás de su servidor web. ProxyJump salta a través del primer servidor hasta el segundo:
Host db1
HostName 10.0.0.5
User anna
ProxyJump web1La diferencia con el agent forwarding (lección 2.1): con ProxyJump, el cifrado va de extremo a extremo entre su portátil y db1. El servidor intermedio solo reenvía los paquetes y no puede usar su clave.
Otro número de puerto: ¿sí o no?
Muchas guías recomiendan poner SSH en otro puerto, por ejemplo el 2222. ¿Qué consigue realmente?
- Reduce el ruido: la mayoría de los intentos automatizados de adivinar contraseñas solo prueban el puerto 22. Su registro estará más tranquilo.
- No es una medida de seguridad. Un escáner que recorre todos los puertos encuentra SSH en segundos por su banner de versión.
Con claves y el inicio de sesión con contraseña desactivado (lección 2.2), el puerto apenas importa para la seguridad. Si aun así quiere cambiarlo, hágalo en el orden correcto: abra el nuevo puerto en el firewall, haga que SSH escuche en ambos puertos, pruebe en una segunda ventana y solo entonces cierre el puerto antiguo. En Ubuntu 24.04 y posteriores esto incluye systemctl daemon-reload y systemctl restart ssh.socket (lección 2.2). No olvide que su proveedor quizá también tenga un firewall.
Revocar el acceso
¿Un antiguo compañero o un desarrollador web tenía una clave en su servidor y ya no trabaja para usted? Revocar el acceso es sencillo si lleva un control:
- Revise todas las claves:
ssh-keygen -lf ~/.ssh/authorized_keys, y hágalo para cada usuario (también/root/.ssh/authorized_keys). - Elimine la línea de esa persona.
- Si usaba su propia cuenta de usuario, bloquéela (lección 3.1) y compruebe si estaba en el grupo
sudo(lección 3.2). - Si ha visto contraseñas, como la de una base de datos en un archivo de configuración, cámbielas también.
Una clave normal no tiene fecha de caducidad. Lo que no elimine seguirá funcionando, incluso años después. Si da acceso temporal a alguien, puede poner la opción expiry-time="20261231" delante de su línea en authorized_keys; después de esa fecha, el servidor rechaza la clave.
Resumen
~/.ssh/configen su propio ordenador guarda por servidor el nombre, el usuario, el puerto y la clave;Host *va al final.- scp para archivos sueltos, rsync para carpetas (cuidado con la barra y con
--delete), sftp en lugar de FTP. - Con
ssh -Lllega a una base de datos mediante un túnel cifrado, mientras el puerto de la base de datos sigue cerrado desde fuera. - ProxyJump salta de forma segura a través de un servidor intermedio; es mejor que el agent forwarding.
- Otro número de puerto reduce el ruido, pero no protege. Las claves que no elimina siguen funcionando.
Cuestionario
Ejercicio
Ejercicio O2.3: Una configuración SSH y un túnel. Cree en su propio ordenador un ~/.ssh/config con un alias para su servidor, inicie sesión solo con ssh <bijnaam>, copie un archivo con scp o rsync y cree un túnel con -L hacia un servicio que en su servidor solo escuche en 127.0.0.1 (si todavía no tiene base de datos, use el puerto 22 del propio servidor: ssh -L 2200:127.0.0.1:22 <bijnaam> y después ssh -p 2200 anna@localhost). Responda a las preguntas sobre qué hace el túnel y por qué no hace falta abrir el puerto.
Ejercicio O2.3: Una configuración SSH y un túnel
Este ejercicio lo hace usted mismo; nadie lo revisa. Marque lo que haya hecho y señale el ejercicio como realizado.
Su portátil escucha en el puerto de la izquierda, el tráfico pasa cifrado por SSH y llega en el servidor a 127.0.0.1:<poort>. El servicio sigue siendo inaccesible desde fuera. Otro puerto SSH genera menos ruido en su registro, pero no es una medida de seguridad; las claves y desactivar el inicio de sesión con contraseña sí lo son.
Sus marcas y notas se quedan solo en este navegador; no las enviamos a ningún sitio. Si ha iniciado sesión, en Mis cursos solo guardamos que ha realizado el ejercicio.
Para saber más
Los pasos de estos artículos se aplican a los VPS y paneles de WebOké; con otros proveedores funciona de forma similar.
- Iniciar sesión en su VPS con SSH (y crear una clave SSH)
- Manual de ssh_config (ajustes del cliente): https://man.openbsd.org/ssh_config
- Manual de ssh (opciones
-L,-J,-N): https://man.openbsd.org/ssh
