Imposta il tunnel SSH con Paramiko per accedere a PostgreSQL

Oct 10 2020

Attualmente utilizzo Paramiko per accedere a un server SFTP e connettermi a PostgreSQL sullo stesso server. Ho trovato molti esempi utilizzando sshtunnelper accedere a PostgreSQL. Ma non so come farlo con il puro Paramiko.

Attualmente il mio codice ha un aspetto simile 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))

Grazie per eventuali suggerimenti!

Risposte

1 MartinPrikryl Oct 12 2020 at 17:06

Usa il port forwarding SSH.

Modificando il codice da SSH annidato utilizzando Python Paramiko per il tunneling del database, ottieni un codice come questo:

# 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))

Se il database PostgreSQL viene eseguito sul server SSH stesso, in genere ascolterà solo sull'interfaccia di loopback. In tal caso db_hostdovrebbe essere impostato su localhost.


Anche se nota che sshtunnelè solo un involucro attorno a Paramiko. Quindi, in generale, puoi usarlo per semplificare il codice, a meno che tu non abbia alcune restrizioni che ti impediscono di installare pacchetti aggiuntivi.

Ad esempio: connessione al database PostgreSQL tramite tunneling SSH in Python


Basato sulla stessa domanda su MongoDB:
Connetti ed esegui query sul database Mongo su SSH con chiave privata in Python
.


Avviso obbligatorio: non utilizzare AutoAddPolicy: in questo modo si perde la protezione dagli attacchi MITM . Per una corretta soluzione, vedere Paramiko "Unknown Server" .