Configure el túnel SSH con Paramiko para acceder a PostgreSQL

Oct 10 2020

Actualmente uso Paramiko para acceder a un servidor SFTP y conectarme a PostgreSQL en el mismo servidor. Encontré muchos ejemplos que usan sshtunnelpara iniciar sesión en PostgreSQL. Pero no sé cómo hacerlo con Paramiko puro.

Actualmente mi código se parece a:

# establish SSH tunnel
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(hostname=host, username=user, password=password)

# setup SFTP server
self.sftp = self.ssh.open_sftp()

# connect to datebase
self.engine = create_engine('postgres+psycopg2://{}:{}@{}:{}/{}'.format(user, password, host, port, db))

¡Gracias por cualquier sugerencia!

Respuestas

1 MartinPrikryl Oct 12 2020 at 17:06

Utilice el reenvío de puertos SSH.

Modificando el código de SSH anidado usando Python Paramiko para la tunelización de la base de datos, obtiene un código como este:

# establish SSH tunnel
self.ssh = paramiko.SSHClient()
# ...
self.ssh.connect(hostname=ssh_host, username=ssh_user, password=ssh_password)

transport = ssh_client.get_transport()
dest_addr = (db_host, db_port)
local_unique_port = 4000 # any unused local port
local_host = 'localhost'
local_addr = (local_host, local_unique_port)
vmchannel = vmtransport.open_channel("direct-tcpip", dest_addr, local_addr)

self.engine = create_engine(
    'postgres+psycopg2://{}:{}@{}:{}/{}'.format(
        db_user, db_password, local_host, local_unique_port, db))

Si la base de datos PostgreSQL se ejecuta en el servidor SSH, normalmente escuchará solo en la interfaz de bucle invertido. En ese caso, db_hostdebería establecerse en localhost.


Aunque tenga en cuenta que sshtunneles solo una envoltura de Paramiko. Entonces, en general, puede usarlo para simplificar el código, a menos que tenga algunas restricciones que le impidan instalar paquetes adicionales.

Por ejemplo: conectarse a la base de datos PostgreSQL a través de un túnel SSH en Python


Basado en la misma pregunta sobre MongoDB:
conecte y consulte la base de datos Mongo a través de SSH con clave privada en Python
.


Advertencia obligatoria: No usar: al hacerlo AutoAddPolicy, está perdiendo la protección contra los ataques MITM . Para una solución correcta, consulte Paramiko "Servidor desconocido" .