Skonfiguruj tunel SSH z Paramiko, aby uzyskać dostęp do PostgreSQL

Oct 10 2020

Obecnie używam Paramiko, aby uzyskać dostęp do serwera SFTP i połączyć się z PostgreSQL na tym samym serwerze. Znalazłem wiele przykładów użycia sshtunneldo logowania się do PostgreSQL. Ale nie wiem, jak to zrobić z czystą Paramiko.

Obecnie mój kod wygląda mniej więcej tak:

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

Dzięki za wszelkie sugestie!

Odpowiedzi

1 MartinPrikryl Oct 12 2020 at 17:06

Użyj przekierowania portów SSH.

Modyfikując kod z zagnieżdżonego SSH przy użyciu Python Paramiko do tunelowania bazy danych, otrzymujesz taki kod:

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

Jeśli baza danych PostgreSQL działa na samym serwerze SSH, zazwyczaj nasłuchuje tylko na interfejsie sprzężenia zwrotnego. W takim przypadku db_hostnależy ustawić na localhost.


Chociaż uwaga, sshtunnelto tylko opakowanie wokół Paramiko. Ogólnie rzecz biorąc, możesz go użyć do uproszczenia kodu, chyba że masz pewne ograniczenia uniemożliwiające instalowanie dodatkowych pakietów.

Na przykład: Łączenie się z bazą danych PostgreSQL przez tunelowanie SSH w Pythonie


W oparciu o to samo pytanie dotyczące MongoDB:
Połącz i zapytaj bazę danych Mongo przez SSH z kluczem prywatnym w Pythonie
.


Obowiązkowe ostrzeżenie: Nie używaj AutoAddPolicy- w ten sposób tracisz ochronę przed atakami MITM . Aby uzyskać poprawne rozwiązanie, zobacz Paramiko „Nieznany serwer” .