Настройте SSH-туннель с Paramiko для доступа к PostgreSQL

Oct 10 2020

В настоящее время я использую Paramiko для доступа к серверу SFTP и подключения к PostgreSQL на том же сервере. Я нашел много примеров использования sshtunnelдля входа в PostgreSQL. Но я не знаю, как это сделать с чистым Парамико.

В настоящее время мой код выглядит примерно так:

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

Спасибо за любые предложения!

Ответы

1 MartinPrikryl Oct 12 2020 at 17:06

Используйте переадресацию портов SSH.

Изменив код из Nested SSH с использованием Python Paramiko для туннелирования базы данных, вы получите такой код:

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

Если база данных PostgreSQL работает на самом сервере SSH, то обычно она будет прослушивать только интерфейс обратной связи. В этом случае db_hostследует установить значение localhost.


Хотя заметьте, что sshtunnelэто всего лишь оболочка вокруг Парамико. В общем, вы можете использовать его для упрощения кода, если только у вас нет ограничений, мешающих вам устанавливать дополнительные пакеты.

Например: подключение к базе данных PostgreSQL через SSH-туннель в Python


На основе того же вопроса о MongoDB:
подключитесь и запросите базу данных Mongo через SSH с закрытым ключом в Python
.


Обязательное предупреждение: Не использовать AutoAddPolicy- при этом вы теряете защиту от атак MITM . Для правильного решения см. Paramiko «Неизвестный сервер» .