PostgreSQL SSL · 7 min read · Dec 21, 2025

Como habilitar SSL para conexões PostgreSQL

Por padrão, todas as conexões PostgreSQL são inseguras, o que pode causar problemas de segurança quando executadas em ambientes de produção com alto tráfego. A criptografia SSL garante que qualquer dado transferido não seja interceptado por ninguém no meio de uma conexão.

Este tutorial ensinará como habilitar SSL/TLS para conexões PostgreSQL.

Pré-requisitos

  • Um servidor Linux. Para nosso tutorial, estamos executando um servidor Ubuntu 22.04.
  • Um usuário sudo não-root.
  • Um nome de domínio totalmente qualificado (FQDN) como postgresql.example.com.
  • Certifique-se de que tudo está atualizado. $ sudo apt update $ sudo apt upgrade
  • Alguns pacotes que seu sistema precisa. $ sudo apt install curl nano software-properties-common apt-transport-https ca-certificates lsb-release ubuntu-keyring -y Alguns desses pacotes podem já estar instalados em seu sistema.

Passo 1 - Configurar o Firewall

Antes de instalar quaisquer pacotes, o primeiro passo é configurar o firewall para abrir portas para HTTP, HTTPS e PostgreSQL.

Verifique o status do firewall.

$ sudo ufw status

Você deve ver algo como o seguinte.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Abra as portas HTTP, HTTPS e PostgreSQL no firewall.

$ sudo ufw allow 5432
$ sudo ufw allow http
$ sudo ufw allow https

Verifique o status novamente para confirmar.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
5432                       ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)
5432 (v6)                  ALLOW       Anywhere (v6)             

Passo 2 - Instalar PostgreSQL 14

O Ubuntu 22.04 vem com o PostgreSQL 14 por padrão. Para instalar, emita o seguinte comando.

$ sudo apt install postgresql postgresql-contrib

O pacote postgresql-contrib contém algumas utilidades extras.

Você também pode usar o repositório APT oficial do PostgreSQL para instalar. Execute o seguinte comando para adicionar a chave GPG do PostgreSQL.

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null

Adicione o repositório APT à sua lista de fontes.

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

Atualize o repositório do sistema.

$ sudo apt update

Agora, você pode instalar o PostgreSQL usando o comando mencionado acima.

Verifique o status do serviço PostgreSQL.

$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2022-12-12 00:01:06 UTC; 19s ago
   Main PID: 3497 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Dec 12 00:01:06 postgresql systemd[1]: Starting PostgreSQL RDBMS...
Dec 12 00:01:06 postgresql systemd[1]: Finished PostgreSQL RDBMS.

Você pode ver que o serviço está habilitado e em execução por padrão.

Defina a senha para a conta postgres.

$ sudo -i -u postgres psql -c "ALTER USER postgres PASSWORD '';"

Passo 3 - Instalar SSL

Para instalar um certificado SSL usando o Let’s Encrypt, precisamos baixar a ferramenta Certbot. Usaremos o instalador de pacotes Snapd para isso. O Ubuntu 22.04 vem pré-instalado com o Snap.

Certifique-se de que sua versão do Snapd está atualizada.

$ sudo snap install core 
$ sudo snap refresh core

Instale o Certbot.

$ sudo snap install --classic certbot

Use o seguinte comando para garantir que o comando Certbot seja executado criando um link simbólico para o diretório /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Gere um certificado SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d postgresql.example.com

O comando acima fará o download de um certificado para o diretório /etc/letsencrypt/live/postgresql.example.com em seu servidor.

Gere um certificado grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Passo 4 - Configurar a renovação do Certbot para PostgreSQL

O PostgreSQL não tem permissão para acessar os certificados da pasta Let’s Encrypt, portanto, não podemos dizer a ele para usar os certificados da pasta diretamente. A alternativa é copiar os certificados para o diretório do PostgreSQL, mas isso funciona apenas temporariamente, pois eles expirarão e você terá que copiá-los novamente manualmente.

O melhor método é usar um hook de renovação que será executado automaticamente em cada renovação e realizará as operações de cópia.

Procure o diretório de dados do PostgreSQL.

$ sudo -i -u postgres psql -U postgres -c 'SHOW data_directory'

Crie o arquivo de hook de renovação e abra-o para edição.

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

Cole o seguinte código nele.

#!/bin/bash
umask 0177
DOMAIN=postgresql.example.com
DATA_DIR=/var/lib/postgresql/15/main
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $DATA_DIR/server.crt
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $DATA_DIR/server.key
chown postgres:postgres $DATA_DIR/server.crt $DATA_DIR/server.key
# apenas para SELinux - CentOS, Red Hat
# chcon -t postgresql_db_t $DATA_DIR/server.crt $DATA_DIR/server.key

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Torne o arquivo executável.

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

Passo 5 - Configurar PostgreSQL

Encontre o caminho para o arquivo de configuração do PostgreSQL.

$ sudo -i -u postgres psql -U postgres -c 'SHOW config_file'

Abra o arquivo para edição.

$ sudo nano /etc/postgresql/15/main/postgresql.conf

Localize a seção Configurações de Conexão e descomente a variável listen_address e altere seu valor para *. Certifique-se de que fique assim.

listen_address = '*'        # em qual IP(s) escutar;

Localize a seção SSL e edite o arquivo para corresponder aos seguintes valores.

ssl = on  
ssl_cert_file = 'server.crt'  
ssl_key_file = 'server.key'  
ssl_prefer_server_ciphers = on
ssl_dh_params_file = '/etc/ssl/certs/dhparam.pem'

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Passo 6 - Configurar Conexão PostgreSQL

Abra o arquivo /etc/postgresql/15/main/pg_hba.conf para edição.

$ sudo nano /etc/postgresql/15/main/pg_hba.conf

Adicione a seguinte linha para habilitar SSL para PostgreSQL.

hostssl all  all  0.0.0.0/0  scram-sha-256

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Passo 7 - Renovar Certificado

Execute o seguinte comando para realizar uma renovação forçada. Isso acionará o script de implantação que copia os certificados para o local correto para uso do PostgreSQL.

$ sudo certbot renew --force-renewal

Verifique se os certificados foram copiados para o diretório de dados do PostgreSQL.

$ sudo ls /var/lib/postgresql/15/main/

Você verá a seguinte saída que mostrará os certificados.

base          pg_dynshmem   pg_notify    pg_snapshots  pg_subtrans  PG_VERSION  postgresql.auto.conf  server.crt
global        pg_logical    pg_replslot  pg_stat       pg_tblspc    pg_wal      postmaster.opts       server.key
pg_commit_ts  pg_multixact  pg_serial    pg_stat_tmp   pg_twophase  pg_xact     postmaster.pid

Reinicie o PostgreSQL para aplicar as alterações.

$ sudo systemctl restart postgresql

Passo 8 - Testar a Conexão

Conecte-se ao banco de dados de outra máquina com o cliente PostgreSQL instalado.

$ psql -d "dbname=postgres sslmode=require" -h postgresql.example.com -U postgres

Você deve ver o seguinte prompt do PostgreSQL. Estamos usando um cliente com PostgreSQL 14, portanto, você verá um aviso sobre versões incompatíveis.

Senha para o usuário postgres:
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1), servidor 15.1 (Ubuntu 15.1-1.pgdg22.04+1))
AVISO: versão principal do psql 14, versão principal do servidor 15.
         Alguns recursos do psql podem não funcionar.
Conexão SSL (protocolo: TLSv1.3, cifra: TLS_AES_256_GCM_SHA384, bits: 256, compressão: off)
Digite "help" para ajuda.

postgres=#

Isso confirma uma conexão SSL bem-sucedida.

Saia do shell.

postgres=# \q

Se seu aplicativo estiver usando uma string de conexão, use-a no seguinte formato para uma conexão SSL.

postgres://user:[email protected]:5432/database_name?sslmode=require

Você pode alterar o modo SSL para verify-full ou verify-ca se tiver o certificado raiz do Let’s Encrypt disponível no local /var/lib/postgresql/.postgresql no lado do cliente.

Crie o diretório /var/lib/postgresql/.postgresql.

$ sudo mkdir -p /var/lib/postgresql/.postgresql

O certificado raiz do Let’s Encrypt é ISRG Root X1, que está localizado no servidor no caminho /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt.

Copie o certificado raiz para o diretório /var/lib/postgresql/.postgresql.

$ sudo cp /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt /var/lib/postgresql/.postgresql/root.crt

Teste a conexão usando o modo verify-full ou verify-ca e você deve ver uma conexão bem-sucedida.

Passo 9 - Verificar os Clientes

Faça login no shell do PostgreSQL no servidor.

$ sudo -i -u postgres psql

Execute o seguinte comando SQL para verificar os clientes conectados.

SELECT ssl.pid, usename, datname, ssl, ssl.version, ssl.cipher, ssl.bits, client_addr
FROM pg_catalog.pg_stat_ssl ssl, pg_catalog.pg_stat_activity activity
WHERE ssl.pid = activity.pid;

Você deve ver uma saída semelhante.

 pid  | usename  | datname  | ssl | version |         cipher         | bits |  client_addr
------+----------+----------+-----+---------+------------------------+------+----------------
 5126 | postgres | postgres | t   | TLSv1.3 | TLS_AES_256_GCM_SHA384 |  256 | 122.161.84.220
 5154 | postgres | postgres | f   |         |                        |      |
(2 rows)

Isso confirma a conexão do cliente do lado do servidor.

Conclusão

Isso conclui o tutorial sobre como habilitar SSL nas conexões PostgreSQL. Se você tiver alguma dúvida, poste nos comentários abaixo.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.