É possível usar o SSH para encriptar a conexão de rede entre os clientes e um servidor PostgreSQL. Feito corretamente, fornece uma conexão de rede adequadamente segura, mesmo para clientes não compatíveis com SSL.
Primeiro, certifique-se de que o servidor SSH
esteja funcionando corretamente na mesma máquina que o servidor
PostgreSQL, e que se possa fazer login
usando ssh como algum usuário
[117];
só então poderá ser estabelecido um túnel seguro para o servidor remoto.
Um túnel seguro escuta em uma porta local e encaminha todo o tráfego
para uma porta na máquina remota.
O tráfego enviado para a porta remota pode chegar em seu endereço
localhost,
ou um endereço de ligação diferente,
se for desejado; não parece estar vindo de sua máquina local.
O comando a seguir cria um túnel seguro da máquina cliente para a
máquina remota foo.com:
ssh -L 63333:localhost:5432 joe@foo.com
O primeiro número no argumento -L, 63333, é o número
da porta local do túnel; pode ser qualquer porta não usada.
(A IANA reserva as portas 49152 a 65535 para uso privado.)
O nome, ou endereço de IP, que vem depois, é o endereço remoto
vinculado ao qual se está conectando, ou seja,
localhost
neste caso, que é o padrão.
O segundo número, 5432, é a extremidade remota do túnel, ou seja,
o número da porta do servidor de banco de dados sendo usado.
Para se conectar ao servidor de banco de dados usando este túnel,
o cliente deve se conectar à porta 63333 na máquina local:
psql -h localhost -p 63333 postgres
Para o servidor de banco de dados, parece que é o usuário
joe, no hospedeiro foo.com,
se conectando ao endereço de ligação
localhost,
e será usado qualquer procedimento de autenticação configurado para
conexões por este usuário para este endereço de ligação.
Note que o servidor não pensa que a conexão é encriptada por
SSL, porque, na verdade, não é encriptada entre
o servidor SSH e o servidor
PostgreSQL.
Isto não deve representar nenhum risco extra de segurança, porque
estão na mesma máquina.
Para que a configuração do túnel seja bem-sucedida, o usuário deve
ter permissão para se conectar via ssh como
joe@foo.com, como se tivesse tentado usar
ssh para criar uma sessão de terminal.
Também poderia ter sido configurado o encaminhamento de porta como
ssh -L 63333:foo.com:5432 joe@foo.com
mas aí o servidor de banco de dados veria a conexão como chegando
em seu endereço de ligação foo.com, que não está
aberto na configuração padrão
listen_addresses = 'localhost'.
Geralmente não é o que se deseja.
Se tiver que “saltar” para o servidor de banco de dados por meio de algum hospedeiro de login, uma possível configuração pode ser esta:
ssh -L 63333:db.foo.com:5432 joe@shell.foo.com
Note que dessa forma a conexão de shell.foo.com
para db.foo.com não será encriptada pelo túnel
SSH.
O SSH oferece algumas possibilidades de
configuração quando a rede está restrita de várias maneiras.
Consulte a documentação do SSH para obter detalhes.
Existem várias outras aplicações que podem fornecer túneis seguros usando um procedimento conceitualmente semelhante ao que acabamos de descrever.
Exemplo 18.2. Exemplo do tradutor
Conexão TCP/IP segura usando túnel SSH
Neste exemplo é usado o psql instalado na máquina cliente para acessar o servidor PostgreSQL instalado em outra máquina da rede, através de um túnel SSH.
A partir de um terminal na máquina cliente é configurado um encaminhamento de porta local para a máquina do servidor PostgreSQL [118], que o psql pode usar para acessar o PostgreSQL na máquina remota. A porta local 63333 irá encaminhar sua conexão para a porta 5432 na máquina remota.
$ ssh -L 127.0.0.1:63333:localhost:5432 ana@192.168.3.6 ana@192.168.3.6's password: Last login: Tue Apr 7 12:55:56 2026 from 192.168.3.25 $ whoami ana $ hostname -I 192.168.3.6 ... $ # psql 18.3 da máquina remota acessando a máquina remota via soquete local $ psql psql (18.3 (Debian 18.3-1.pgdg13+1), servidor 17.9 (Debian 17.9-1.pgdg13+1)) Digite "help" para obter ajuda. ana=>
A partir de um segundo terminal na máquina cliente, é feito o acesso ao servidor PostgreSQL através do encaminhamento usando o psql. O nome de usuário do banco de dados não precisa ser idêntico ao nome de usuário do sistema operacional.
$ # psql 18.4 da máquina cliente acessando a máquina remota via tcp/ip
$ psql --username=ana --host=localhost --port=63333 ana
Senha para o usuário ana:
psql (18.4 (Debian 18.4-1.pgdg12+1), servidor 17.9 (Debian 17.9-1.pgdg13+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, ↵
compression: desativado, ALPN: postgresql)
Digite "help" para obter ajuda.
ana=>
Pode ser consultado na máquina remota os tipos das conexões estabelecidas pela usuária ana usando a visão pg_stat_activity:
SELECT
pid,
usename,
client_addr,
CASE
WHEN client_addr IS NULL THEN 'Unix Socket (Local)'
ELSE 'TCP/IP Connection'
END AS connection_type
FROM pg_stat_activity
WHERE usename='ana';
pid | usename | client_addr | connection_type ------+---------+-------------+--------------------- 2878 | ana | | Unix Socket (Local) 2923 | ana | ::1 | TCP/IP Connection (2 linhas)
[117]
Para ativar o sshd execute os comandos
sudo systemctl enable sshd e
sudo systemctl start sshd no
Linux (N. T.)