Configurer le tunnel SSH avec Paramiko pour accéder à PostgreSQL

Oct 10 2020

J'utilise actuellement Paramiko pour accéder à un serveur SFTP et me connecter à PostgreSQL sur le même serveur. J'ai trouvé de nombreux exemples d'utilisation sshtunnelpour se connecter à PostgreSQL. Mais je ne sais pas comment le faire avec du pur Paramiko.

Actuellement, mon code ressemble à quelque chose comme:

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

Merci pour vos suggestions!

Réponses

1 MartinPrikryl Oct 12 2020 at 17:06

Utilisez la redirection de port SSH.

En modifiant le code de Nested SSH à l'aide de Python Paramiko pour le tunnel de base de données, vous obtenez un code comme celui-ci:

# 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 données PostgreSQL s'exécute sur le serveur SSH lui-même, elle écoutera généralement uniquement sur l'interface de bouclage. Dans ce cas, il db_hostdoit être défini sur localhost.


Cependant, notez que ce sshtunneln'est qu'un emballage autour de Paramiko. Donc, en général, vous pouvez l'utiliser pour simplifier le code, sauf si certaines restrictions vous empêchent d'installer des packages supplémentaires.

Par exemple: connexion à la base de données PostgreSQL via le tunneling SSH en Python


Basé sur la même question à propos de MongoDB:
connectez et interrogez la base de données Mongo via SSH avec une clé privée en Python
.


Avertissement obligatoire: Ne pas utiliser AutoAddPolicy- Vous perdez ainsi une protection contre les attaques MITM . Pour une solution correcte, voir Paramiko "Serveur inconnu" .