Configure o túnel SSH com Paramiko para acessar PostgreSQL

Oct 10 2020

Atualmente, uso Paramiko para acessar um servidor SFTP e me conectar ao PostgreSQL no mesmo servidor. Encontrei muitos exemplos de uso sshtunnelpara fazer logon no PostgreSQL. Mas não sei como fazer isso com puro Paramiko.

Atualmente, meu código é semelhante 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))

Obrigado por qualquer sugestão!

Respostas

1 MartinPrikryl Oct 12 2020 at 17:06

Use o encaminhamento de porta SSH.

Modificando o código de SSH aninhado usando Python Paramiko para encapsulamento de banco de dados, você obtém um 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))

Se o banco de dados PostgreSQL for executado no próprio servidor SSH, ele ouvirá normalmente apenas na interface de loopback. Nesse caso, db_hostdeve ser definido como localhost.


Porém, note que sshtunnelé apenas um envoltório em torno de Paramiko. Portanto, em geral, você pode usá-lo para simplificar o código, a menos que tenha algumas restrições que o impeçam de instalar pacotes adicionais.

Por exemplo: Conectando-se ao banco de dados PostgreSQL por meio de encapsulamento SSH em Python


Com base na mesma pergunta sobre MongoDB:
Conecte e consulte o banco de dados Mongo sobre SSH com chave privada em Python
.


Aviso obrigatório: Não use AutoAddPolicy- Você está perdendo a proteção contra ataques MITM ao fazer isso. Para uma solução correta, consulte Paramiko "Servidor desconhecido" .