17 septiembre, 2024

Tunel SSH en Linux con Key

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

    ssh -L 3338:localhost:3338 -L 3339:localhost:3339 user@<remote_server>
    (sin sesión interactiva)

    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

  1. 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
  2. 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
  3. Genero la Key, para ingresar por ssh key con alguno de los algoritmos:
    Curvas Elípticas

    ssh-keygen -t ed25519 -C "comentarios" 
    RSA

    ssh-keygen -t rsa -b 4096 -C "comentarios" 
  4. Passphrase, coloco clave para acceder a la privada cada vez que lea el archivo (si lo dejas en blanco no va pedir clave.
  5. En /home/user/.ssh/
    Cambio el nombre

    mv id_rsa.pub authorized_keys
    Cambio de permisos

    chmod 600 authorized_keys

    Si no cambias los permisos te vas a encontrar con algo así al querer conectarte:
  6. 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

Seleccionamos el motor correspondiente

 

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 anteriores

Finalizamos 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