Por esos motivos creativos tenia que acceder a una base de datos que solo permitía conexión local, como restricción no podía cambiar el archivo de configuración de IP permitidas en el motor de base de datos.
Como es un Tunel SSH
Un túnel SSH es una técnica utilizada para crear una conexión segura entre dos máquinas a través del protocolo SSH (Secure Shell). SSH no solo se usa para acceder remotamente a un servidor, sino que también permite redirigir el tráfico de red mediante tunneling o port forwarding, lo que asegura que los datos transmitidos estén cifrados y protegidos durante el trayecto.
Analogía práctica, imaginar que se tiene que enviar una carta importante, pero no querés que nadie la vea mientras va por el correo. Entonces, la metes en una caja fuerte que solo vos y la persona que la recibe pueden abrir. Eso es lo que hace un túnel SSH con la información que se envía por la red: la "encierra" en una conexión segura para que nadie más pueda verla.
Tipos de Túneles SSH
Cuando creas un túnel SSH, estás estableciendo una conexión cifrada entre tu máquina local y un servidor remoto a través de un puerto específico. Esta conexión cifrada permite redirigir el tráfico desde un puerto local en tu máquina hacia un puerto en el servidor remoto, o incluso hacia otra máquina detrás de ese servidor.
Local Port Forwarding:
- El tráfico que va desde un puerto específico en tu máquina local se redirige a un puerto en el servidor remoto o en otra máquina a través del servidor SSH.
- Ejemplo de uso: Si necesitas acceder a un servicio que solo está disponible en un servidor remoto y no tienes acceso directo a ese servidor, puedes usar Local Port Forwarding para enviar el tráfico a través de una conexión SSH segura.
- Ejemplo con SSH(sin sesión interactiva)
ssh -L 3338:localhost:3338 -L 3339:localhost:3339 user@<remote_server>
ssh -N -L 3339:localhost:3339 user@<remote_server>
Remote Port Forwarding (Tunel Reverso / Inverso):
- El tráfico que llega a un puerto en el servidor remoto se redirige a un puerto en tu máquina local o en otra máquina a través del túnel SSH.
- Ejemplo de uso: Si necesitas que un servidor remoto acceda a un servicio en tu máquina local o en otro servidor.
- Ejemplo con SSH (en el server)
ssh -R 80:127.0.0.1:3000 user@<remote_server_ip>
Dynamic Port Forwarding:
- Permite establecer un túnel SSH que funciona como un proxy SOCKS. Todo el tráfico de red que pase por ese puerto se redirigirá de manera segura a través de la conexión SSH.
- Ejemplo de uso: Navegar por Internet de manera segura a través de un servidor remoto, como si estuvieras usando una VPN.
- Ejemplo con SSH
ssh -D 127.0.0.1:6000 user@<remote_server>
Configurando Túnel para acceder al motor de Base de Datos
Como describí al principio necesitaba conectarme a la base de datos PostgreSQL en el servidor remoto que escucha en el localhost (127.0.0.1:5432). No hay forma de que el el cliente puede conectarse directamente a esta base de datos, pero puede acceder al servidor a través de SSH. Entonces, con el reenvío de puertos locales SSH, el cliente puede conectarce a el servidor remoto (con credencial SSH válida) y ordena a SSH que reenvíe el puerto local del cliente 5432 al puerto local del servidor 5432. Por lo tanto, cuando un programa se conecta al puerto 5432 del cliente, SSH reenvía la conexión al puerto local 5432 del servidor remoto (ejecutando PostgreSQL).
Por si estas despistado, vamos hacer un Local Port Forwarding 🤓
Desde el Server
- Creo un usuario para el tunel, no requiere ninguna shell pero si el home para almacenar la key pública
sudo adduser u61779 --shell=/bin/false--disabled-password - En caso que el SO no permita el uso usuario sin password colocar una clave de 20 caracteres y descartar, ya que no la va utilizar
- Genero la Key, para ingresar por ssh key con alguno de los algoritmos:
Curvas ElípticasRSAssh-keygen -t ed25519 -C "comentarios"
ssh-keygen -t rsa -b 4096 -C "comentarios"
- Passphrase, coloco clave para acceder a la privada cada vez que lea el archivo (si lo dejas en blanco no va pedir clave.
- En /home/user/.ssh/
Cambio el nombreCambio de permisosmv id_rsa.pub authorized_keys
chmod 600 authorized_keys
Si no cambias los permisos te vas a encontrar con algo así al querer conectarte: - Me copio la clave privada (archivo id_rsa o el nombre que le hayas dado), se puede verificar porque el header del archivo es "-----BEGIN RSA PRIVATE KEY-----", puedo usar cualquier de opciones como:
ssh-copy-id sshuser@ip_del_servidor
cat ~/.ssh/id_rsa.pub | ssh sshuser@ip_del_servidor "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
scp (para ambientes Windows WinSCP)
Desde el cliente
Guardo la privada en algún lugar seguro, es la que voy usar para iniciar el tunel
Si uso PuTTY :
- Debo convertir la clave privada a PPK (formato propietario de PuTTY para almacenar keys) con PuTTYgen
- Para convertir es ir a Conversions -> Import key
- Colocamos el Passhprhase (configurado previamentes cuando lo generamos) y presionamos el botón Save private key
- Guardamos el archivo PPK en algún lugar seguro (va ser mi nueva clave privada para usar con el PuTTY)
Probando la conexión:
- Session -> IP server : Colocamos la IP o Hostname del server a conectarnos
- Connection -> SSH -> Auth -> Credential -> Private key file for authenticate
- Selecciono el archivo PPK generado previamente
- Botón Open para iniciar el túnel
Se va conectar y cerrar la ventana (porque no tengo shell), quiere decir que esta OK
Para Túnel con Putty
Igual que anterior pero sumamos los siguientes pasos antes de darle al botón Open
- Connection -> SSH -> Tunnels
- Source port: puerto local de la maquina cliente (ej 5000)
- Destination: IP y Puerto del server, en este caso localhost:5432
- Botón Add (para agregarlo como Fowarded port)
- Boton Open
Recordar que estamos haciendo un Local Port Forwarding
Tunel con DBeaver
Como tenía que conectarme con un manager de base de datos para administrar un motor, utilizo el DBeaver que es gratuito y permite conectarme haciendo tunel ssh (combo 2x1) 😉
Creamos la conexión a la base con:
Base de Datos -> Nueva Conexión
En mi caso necesitaba Postgre, Siguiente
Valido los datos a donde me tengo que conectar, el Host dejar en localhost, porque con el túnel es como nos paremos en el servidor.
Voy a la solapa SSH, tildo SSH Tunnel
- Host/IP : Coloco la IP/Hostname del Servidor
- User Name: el nombre del usuario linux que creamos en el server para hacer el túnel
- Athentcation Method: seleccionamos Public Key
- Private Key: Seleccionamos el archivo con la clave privada generada en el server
- Passphrase: clave para acceder al archivo de clave privada (recomiendo destildar para que lo solicite cada vez que nos conectamos, no confío como almacena las claves DBeaver)
Con el botón Test Tunnel Configuration podemos comprobar que el túnel funciona correctamente
Si falla vamos a ver un mensaje criptico, que nos obligar a revisar los pasos anterioresFinalizamos y ya tenemos la conexión creada
Para usarla en el panel izquierdo botón derecho Conectar y SUCESS
Referencias
- https://www.daveperrett.com/articles/2010/09/14/ssh-authentication-refused/
- https://askubuntu.com/questions/306798/trying-to-do-ssh-authentication-with-key-files-server-refused-our-key
- https://medium.com/@bonguides25/how-to-fix-server-refused-our-key-in-putty-ssh-2d833e4cdf9f
- https://repost.aws/knowledge-center/ec2-server-refused-our-key
- https://www.ssh.com/academy/ssh/copy-id
- https://datawookie.dev/blog/2023/12/ssh-tunnel-local-port-forwarding/
- https://www.ssh.com/academy/ssh/tunneling
- https://goteleport.com/blog/ssh-tunneling-explained/
0 comments:
Publicar un comentario