Protegendo Conexões PostgreSQL com Configuração SSL/TLS: Um Guia Completo

Aprenda a proteger conexões PostgreSQL com criptografia SSL/TLS. Este guia abrangente aborda a configuração do lado do servidor e do cliente, incluindo a geração de certificados, a modificação de `postgresql.conf` e `pg_hba.conf`, e a configuração de clientes para uma comunicação segura e criptografada. Proteja seus dados confidenciais em trânsito e garanta a conformidade com os padrões de segurança modernos.

100 visualizações

Protegendo Conexões PostgreSQL com Configuração SSL/TLS: Um Guia Completo

No cenário digital interconectado de hoje, a segurança dos dados em trânsito é primordial. O PostgreSQL, um poderoso sistema de gestão de base de dados relacional de código aberto, oferece mecanismos robustos para encriptar conexões usando SSL/TLS. Este guia fornece um passo a passo abrangente da configuração de servidores e clientes PostgreSQL para impor a encriptação SSL/TLS, salvaguardando informações sensíveis de interceções e ataques "man-in-the-middle" em redes não confiáveis. A implementação destas medidas de segurança é crucial para manter a integridade dos dados, garantir a conformidade com rigorosos padrões de segurança e construir confiança com os seus utilizadores.

Este artigo abordará os passos essenciais, desde a geração ou obtenção de certificados SSL até à configuração do PostgreSQL para os usar e, finalmente, a configuração de clientes para conexões seguras. Aprofundaremos nos parâmetros de configuração necessários e forneceremos exemplos práticos para o ajudar a implementar estas melhorias de segurança de forma eficaz.

Compreendendo SSL/TLS no PostgreSQL

SSL/TLS (Secure Sockets Layer/Transport Layer Security) é um protocolo criptográfico concebido para fornecer segurança de comunicação através de uma rede de computadores. Quando aplicado ao PostgreSQL, encripta os dados trocados entre o servidor da base de dados e os seus clientes. Isso impede que partes não autorizadas intercetem e leiam informações sensíveis, como credenciais, dados financeiros ou detalhes pessoais.

O PostgreSQL suporta dois modos principais para SSL/TLS:

  • ssl=on: Permite conexões SSL, mas não as exige. Os clientes podem conectar usando conexões SSL ou não-SSL.
  • ssl=prefer: Tenta estabelecer uma conexão SSL, mas volta para uma conexão não-SSL se falhar.
  • ssl=require: Exige conexões SSL. Se uma conexão SSL não puder ser estabelecida, a conexão do cliente será rejeitada.

Impor ssl=require é a opção mais segura para proteger os dados em trânsito.

Pré-requisitos para a Configuração SSL/TLS

Antes de começar a configurar o PostgreSQL para SSL/TLS, certifique-se de que possui o seguinte:

  1. OpenSSL Instalado: O kit de ferramentas OpenSSL é essencial para gerar e gerir certificados SSL. Geralmente vem pré-instalado em sistemas Linux e macOS. Para Windows, pode ser necessário fazer o download e instalá-lo separadamente.
  2. Acesso aos Ficheiros de Configuração do PostgreSQL: Irá precisar de privilégios administrativos para modificar os ficheiros postgresql.conf e pg_hba.conf.
  3. Compreensão das Autoridades de Certificação (CAs): Embora possa criar certificados autoassinados para testes, os ambientes de produção devem idealmente usar certificados assinados por uma Autoridade de Certificação (CA) confiável ou por uma CA empresarial interna.

Configuração SSL/TLS do Lado do Servidor

A configuração do lado do servidor envolve ativar o SSL, especificar a localização dos certificados e chaves SSL e configurar a autenticação do cliente.

1. Gerar ou Obter Certificados e Chaves SSL

Existem duas formas principais de obter certificados SSL para o seu servidor PostgreSQL:

  • Certificados Autoassinados (para testes/desenvolvimento): São criados usando OpenSSL e não são confiáveis por padrão por clientes externos. São úteis para a configuração inicial e testes internos.
  • Certificados de uma Autoridade de Certificação (CA) (para produção): Obtenha certificados de uma CA pública confiável (por exemplo, Let's Encrypt, DigiCert) ou de uma CA empresarial interna. Isso garante que os clientes possam verificar a identidade do servidor.

Criar Certificados Autoassinados usando OpenSSL:

Esta é uma abordagem comum para ambientes de desenvolvimento e internos. Execute os seguintes comandos no seu servidor PostgreSQL ou numa máquina com OpenSSL:

  1. Criar um diretório para certificados: É uma boa prática manter os certificados organizados.
    bash sudo mkdir -p /etc/postgresql/ssl sudo chown postgres:postgres /etc/postgresql/ssl cd /etc/postgresql/ssl

  2. Gerar a Chave Privada do Servidor: Esta chave deve ser mantida em segredo.
    bash sudo openssl genrsa -des3 -out server.key 2048
    Será solicitado que insira uma frase secreta. Lembre-se desta frase secreta, pois precisará dela quando o PostgreSQL iniciar.

  3. Remover a Frase Secreta (opcional, mas recomendado para reinícios automáticos): Para inicialização automática sem entrada manual da frase secreta, remova a frase secreta. Tenha extremo cuidado, pois qualquer pessoa com acesso a este ficheiro pode personificar o seu servidor.
    bash sudo openssl rsa -in server.key -out server.key

  4. Criar um Pedido de Assinatura de Certificado de Servidor (CSR): Contém informações sobre o seu servidor.
    bash sudo openssl req -new -key server.key -out server.csr
    Será solicitado que forneça informações como Nome do País, Estado, Nome da Localidade, Nome da Organização, Nome Comum (este deve ser o nome do host ou endereço IP do seu servidor) e um endereço de e-mail.

  5. Assinar o Certificado com a Sua Própria CA (para uso interno):

    • Criar uma chave privada e um certificado de CA raiz (se ainda não tiver um):
      bash # Gerar chave privada da CA sudo openssl genrsa -des3 -out root.key 2048 # Criar certificado da CA (válido por 3650 dias) sudo openssl req -new -x509 -days 3650 -key root.key -out root.crt
    • Assinar o CSR do servidor com a CA: Isto cria o certificado de servidor confiável.
      bash sudo openssl x509 -req -days 365 -in server.csr -CA root.crt -CAkey root.key -set_serial 01 -out server.crt
  6. Definir Permissões: Garanta que o utilizador PostgreSQL pode ler estes ficheiros.
    bash sudo chown postgres:postgres server.key server.crt root.crt sudo chmod 600 server.key sudo chmod 644 server.crt root.crt

Usar Certificados de uma CA Pública/Empresarial:

Se obtiver certificados de uma CA, receberá tipicamente:

  • server.crt: O certificado público do seu servidor.
  • server.key: A chave privada do seu servidor.
  • root.crt (ou similar): O certificado raiz da CA (e potencialmente certificados intermédios).

Coloque estes ficheiros num diretório seguro (por exemplo, /etc/postgresql/ssl/) e certifique-se de que o utilizador PostgreSQL tem permissões de leitura.

2. Configurar postgresql.conf

Edite o seu ficheiro postgresql.conf (geralmente localizado no seu diretório de dados do PostgreSQL) para ativar o SSL e especificar os ficheiros de certificado.

#------------------------------------------------------------------------------
# SSL
#------------------------------------------------------------------------------

ssl = on

# Estes estão todos em formato PEM e são ignorados se a chave/certificado do servidor não estiverem
# configurados. Por padrão, espera-se que os ficheiros estejam no diretório de dados do servidor.
# Alternativamente, podem ser especificados como caminhos completos.
ssl_cert_file = '/etc/postgresql/ssl/server.crt'     # (altere o nome do ficheiro se necessário)
ssl_key_file = '/etc/postgresql/ssl/server.key'      # (altere o nome do ficheiro se necessário)
ssl_ca_file = '/etc/postgresql/ssl/root.crt'         # (opcional, para verificação de certificado de cliente)

# Opcional: especificar a lista de cifras, se necessário
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'

# Opcional: ativar a verificação de certificado de cliente
#ssl_ca_file deve ser definido para um ficheiro contendo os certificados de CA a confiar
#ssl_crl_file = ''
#ssl_crl_dir = ''
  • ssl = on: Ativa o suporte SSL no servidor.
  • ssl_cert_file: Caminho para o certificado público do servidor.
  • ssl_key_file: Caminho para a chave privada do servidor.
  • ssl_ca_file: Caminho para o certificado da CA (se desejar verificar certificados de cliente ou se o certificado do seu servidor for assinado por uma CA personalizada).

3. Configurar pg_hba.conf para Impor SSL

O ficheiro pg_hba.conf controla a autenticação do cliente. Precisa de modificar as entradas para impor conexões SSL.

Por padrão, as entradas em pg_hba.conf são semelhantes a isto:

# TIPO    BASE DE DADOS   UTILIZADOR      ENDEREÇO                MÉTODO
local     all             all                                     peer
# Conexões locais IPv4:
host      all             all             127.0.0.1/32            scram-sha-256
# Conexões locais IPv6:
host      all             all             ::1/128                 scram-sha-256

Para impor SSL, altere as entradas host para hostssl:

# TIPO    BASE DE DADOS   UTILIZADOR      ENDEREÇO                MÉTODO
local     all             all                                     peer
# Conexões locais IPv4:
hostssl   all             all             127.0.0.1/32            scram-sha-256
# Conexões locais IPv6:
hostssl   all             all             ::1/128                 scram-sha-256

# Exemplo para acesso à rede externa - exige SSL
hostssl   all             all             0.0.0.0/0               scram-sha-256
hostssl   all             all             ::/0                    scram-sha-256
  • hostssl: Este tipo de registo exige conexões SSL. Qualquer tentativa de conexão sem SSL será rejeitada.
  • hostnossl: Este tipo de registo proíbe explicitamente conexões SSL.
  • host: Permite conexões SSL e não-SSL (este é o padrão e menos seguro).

4. Reiniciar o Servidor PostgreSQL

Após modificar postgresql.conf e pg_hba.conf, deve reiniciar o serviço PostgreSQL para que as alterações entrem em vigor.

# Para sistemas que usam systemd (a maioria das distribuições Linux modernas)
sudo systemctl restart postgresql

# Para sistemas que usam init.d
sudo service postgresql restart

Configuração SSL/TLS do Lado do Cliente

Os clientes também precisam de ser configurados para conectar-se de forma segura. Isso envolve especificar parâmetros de conexão, potencialmente fornecer certificados de cliente e verificar o certificado do servidor.

1. Parâmetros da String de Conexão

Ao conectar via psql ou qualquer biblioteca de cliente PostgreSQL, pode especificar parâmetros SSL na string de conexão ou como opções individuais.

Conexão SSL Básica (Apenas Autenticação do Servidor):

psql "sslmode=require host=your_server_hostname dbname=your_db user=your_user"
  • sslmode: Controla o comportamento SSL do cliente.
    • disable: Permitir apenas conexões não-SSL.
    • allow: Permitir não-SSL, mas preferir SSL se o servidor o suportar.
    • prefer (padrão): Preferir SSL, mas permitir não-SSL se o SSL falhar.
    • require: Permitir apenas conexões SSL. Se o servidor não suportar SSL, a conexão falha.
    • verify-ca: Permitir apenas conexões SSL e verificar se o certificado do servidor é assinado por uma CA confiável. O parâmetro sslrootcert deve ser definido.
    • verify-full: Permitir apenas conexões SSL, verificar o certificado do servidor contra uma CA confiável e verificar se o nome do host do servidor corresponde ao nome comum (CN) ou nome alternativo do sujeito (SAN) do certificado.

Verificar o Certificado do Servidor (verify-ca ou verify-full):

Para segurança aprimorada, os clientes devem verificar a identidade do servidor. Isso exige que o cliente confie na CA que assinou o certificado do servidor.

  1. Obter o Certificado da CA: Obtenha o ficheiro root.crt (ou o certificado da CA apropriado) que foi usado para assinar o certificado do servidor.
  2. Especificar sslrootcert: Diga ao cliente onde encontrar este certificado da CA.
psql "sslmode=verify-full host=your_server_hostname dbname=your_db user=your_user sslrootcert=/path/to/your/root.crt"

2. Certificados de Cliente (Autenticação Mútua)

Para um nível de segurança ainda mais elevado, pode implementar a autenticação mútua, onde o servidor também verifica a identidade do cliente usando certificados de cliente.

Gerar Certificados de Cliente:

Semelhante aos certificados de servidor, precisará de uma chave privada de cliente e de um certificado de cliente assinado por uma CA confiável pelo servidor (geralmente a mesma CA que o certificado do servidor).

  1. Gerar Chave Privada de Cliente:
    bash openssl genrsa -des3 -out client.key 2048

  2. Criar CSR de Cliente:
    bash openssl req -new -key client.key -out client.csr
    Forneça detalhes, garantindo que o Nome Comum seja único para o cliente.

  3. Assinar CSR de Cliente com CA:
    bash sudo openssl x509 -req -days 365 -in client.csr -CA root.crt -CAkey root.key -set_serial <unique_serial> -out client.crt

  4. Definir Permissões:
    bash chmod 600 client.key chmod 644 client.crt

Configurar pg_hba.conf para Autenticação por Certificado de Cliente:

No servidor, precisa de configurar pg_hba.conf para aceitar a autenticação por certificado de cliente. Isso geralmente usa o método de autenticação cert.

# TIPO    BASE DE DADOS   UTILIZADOR      ENDEREÇO                MÉTODO
# Exigir SSL e autenticação por certificado de cliente para um utilizador/bd específico
hostssl   all             your_user       your_client_ip/32       cert map=your_cert_map

Também pode ser necessário definir um ficheiro de mapa de certificados (opção cert_map) se quiser mapear detalhes específicos do certificado de cliente (como Subject ou SubjectAltName) para utilizadores PostgreSQL. Consulte a documentação do PostgreSQL para a configuração detalhada da autenticação cert e mapeamento de certificados.

Configurar o Cliente para Usar Certificados:

Atualize a string de conexão do cliente para incluir os caminhos para o seu certificado e chave:

psql "sslmode=verify-full host=your_server_hostname dbname=your_db user=your_user \nsslrootcert=/path/to/your/root.crt sslcert=/path/to/your/client.crt sslkey=/path/to/your/client.key"

Melhores Práticas e Dicas

  • Usar sslmode verify-full: Sempre procure usar verify-full no lado do cliente para prevenir ataques "Man-in-the-Middle".
  • Proteger Chaves Privadas: Certifique-se de que as chaves privadas (ficheiros .key) têm permissões de ficheiro rigorosas (por exemplo, chmod 600) e são apenas legíveis pelo utilizador PostgreSQL no servidor e pelo utilizador de conexão no cliente.
  • Renovar Certificados Regularmente: Os certificados têm datas de expiração. Implemente um processo para renová-los antes que expirem para evitar interrupções de conexão.
  • Gestão Centralizada de Certificados: Para implantações maiores, considere usar um sistema de gestão de certificados ou automatizar a emissão e renovação de certificados.
  • Monitorizar Registos: Verifique os registos do PostgreSQL para quaisquer erros relacionados com SSL durante a inicialização ou tentativas de conexão.
  • Documentação: Consulte a documentação oficial do PostgreSQL para os parâmetros mais atualizados e opções de configuração avançadas específicas para a sua versão do PostgreSQL.

Conclusão

A configuração de SSL/TLS para conexões PostgreSQL é um passo crítico na proteção da sua infraestrutura de base de dados. Ao ativar o SSL no servidor, impor ssl=require ou hostssl em pg_hba.conf, e configurar clientes com definições sslmode apropriadas (idealmente verify-full), aumenta significativamente a segurança dos dados transmitidos através da sua rede. A implementação da autenticação mútua com certificados de cliente adiciona outra camada robusta de segurança. Embora a configuração inicial possa parecer complexa, os benefícios a longo prazo da proteção de dados e conformidade tornam-na uma prática indispensável para qualquer implantação de PostgreSQL.