Configurações Essenciais para Proteger seu Banco de Dados PostgreSQL

Proteja o PostgreSQL com regras pg_hba.conf, autenticação SCRAM, imposição de TLS, ouvintes limitados, privilégio mínimo e logs de auditoria.

Configurações Essenciais para Proteger seu Banco de Dados PostgreSQL

Proteger o PostgreSQL começa com uma pergunta simples: quem tem permissão para se conectar, de onde e com qual método de autenticação? Se o pg_hba.conf for muito amplo ou o servidor escutar em mais interfaces do que o necessário, seu banco de dados terá uma superfície de ataque maior do que o necessário.

Este guia aborda as configurações de segurança do PostgreSQL que você deve revisar primeiro: pg_hba.conf, autenticação de senha SCRAM, TLS, ouvintes de rede, permissões de funções e logs.

1. Reforçando a Autenticação de Clientes com pg_hba.conf

O arquivo de Autenticação Baseada em Host (pg_hba.conf) determina quais hosts podem se conectar, quais usuários do PostgreSQL eles podem usar, quais bancos de dados podem acessar e, mais importante, o método de autenticação exigido para essa conexão.

Entendendo a Estrutura do pg_hba.conf

Cada linha no pg_hba.conf segue um formato específico:

TIPO BANCO_DE_DADOS USUÁRIO ENDEREÇO MÉTODO [OPÇÕES]

  • TIPO: Tipo de conexão (ex.: local, host, hostnossl, hostssl).
  • BANCO_DE_DADOS: Nome(s) do(s) banco(s) de dados alvo.
  • USUÁRIO: Função(ões) do banco de dados alvo.
  • ENDEREÇO: Faixa de endereço IP do cliente.
  • MÉTODO: Mecanismo de autenticação (ex.: scram-sha-256, md5, reject, trust).

Melhores Práticas para Métodos de Autenticação

Nunca use o método trust em produção, pois ele permite que qualquer pessoa que atenda aos critérios de conexão se conecte sem senha. Os métodos de autenticação modernos recomendados são:

Recomendado: scram-sha-256

O SCRAM (Mecanismo de Autenticação de Desafio-Resposta com Sal) oferece melhorias significativas em relação a métodos de senha mais antigos, como md5, usando hash mais forte e prevenindo ataques de repetição. Esta deve ser sua escolha padrão para conexões remotas.

# Forçar SCRAM para conexões remotas de uma sub-rede de aplicação
host    appdb   app_user 10.20.30.0/24  scram-sha-256

Defina password_encryption = 'scram-sha-256' no postgresql.conf antes de criar ou rotacionar senhas. Senhas existentes armazenadas com hashes mais antigos não são convertidas automaticamente; redefina-as após habilitar o SCRAM.

password_encryption = 'scram-sha-256'

Evite regras amplas como esta, a menos que outro controle de rede já restrinja o acesso:

host    all     all     0.0.0.0/0       scram-sha-256

Conexões Locais

Para conexões originadas do próprio servidor (ex.: aplicações executadas na mesma máquina), use sockets locais. A configuração mais segura geralmente é peer (para sockets de domínio Unix) ou scram-sha-256 se os sockets estiverem desabilitados ou restritos.

# Usar autenticação peer para conexões locais via socket Unix
local   all     all             peer

Rejeitando Conexões Explicitamente

Use o método reject para bloquear explicitamente conexões de redes perigosas ou não confiáveis.

# Bloquear todas as conexões de uma faixa IP insegura conhecida
host    all     all     192.168.1.0/24  reject

Dica Prática: Após modificar o pg_hba.conf, recarregue o PostgreSQL para que as alterações entrem em vigor, por exemplo com sudo systemctl reload postgresql ou SELECT pg_reload_conf();.

2. Implementando Criptografia SSL/TLS

Para evitar que dados sensíveis (incluindo senhas) sejam interceptados pela rede, é obrigatório impor criptografia SSL/TLS para todas as conexões remotas.

Configuração no postgresql.conf

Certifique-se de que estes parâmetros estejam definidos corretamente no seu arquivo de configuração principal:

  • ssl = on: Habilita o suporte SSL globalmente.
  • ssl_cert_file: Caminho para o arquivo de certificado do servidor (ex.: server.crt).
  • ssl_key_file: Caminho para o arquivo de chave privada do servidor (ex.: server.key).

Impondo SSL no pg_hba.conf

Para forçar os clientes a usar SSL, altere o tipo de conexão no pg_hba.conf de host para hostssl:

# Permitir apenas conexões via SSL/TLS
hostssl all     all     0.0.0.0/0       scram-sha-256

hostssl corresponde apenas a conexões SSL. Certifique-se de que você não tenha também uma regra host anterior ou posterior que permita os mesmos usuários sem TLS. Para tornar a política óbvia, adicione uma regra de rejeição para conexões não SSL:

hostnossl all    all     0.0.0.0/0       reject

3. Minimizando a Superfície de Ataque

A segurança envolve reduzir a exposição do servidor de banco de dados a ameaças externas. Isso é gerenciado principalmente através da configuração de rede e da desativação de recursos desnecessários.

Limitando o Endereço de Escuta da Rede

O PostgreSQL geralmente padrão escuta em localhost, mas implantações empacotadas e imagens gerenciadas podem diferir. Configure-o explicitamente para escutar apenas na interface específica que requer acesso, ou mantenha-o em localhost se apenas aplicações locais se conectarem.

No postgresql.conf:

# Escutar apenas em localhost (127.0.0.1) se possível
listen_addresses = 'localhost'

# OU, escutar apenas em uma interface de rede privada específica
# listen_addresses = '192.168.1.10'

Aviso de Segurança: Se listen_addresses estiver definido como *, todas as interfaces serão usadas. Certifique-se de que o pg_hba.conf controle estritamente quais faixas IP podem se conectar.

Desativando Extensões e Recursos Desnecessários

Cada extensão habilitada adiciona complexidade potencial e vetores de ataque. Audite regularmente as extensões instaladas e remova aquelas que não são usadas ativamente para sua carga de trabalho de produção. Isso minimiza a superfície de ataque geral.

Segurança de Senhas e Funções

Certifique-se de que todas as funções administrativas (como o usuário postgres padrão) tenham senhas fortes e complexas definidas usando ALTER USER:

ALTER USER postgres WITH PASSWORD 'SuaSenhaForteEComplexa123!';

Use o princípio do privilégio mínimo: usuários de aplicação devem ter apenas permissões SELECT, INSERT, UPDATE e DELETE nas tabelas específicas que precisam, em vez de status de superusuário.

4. Configuração de Auditoria e Logging

Embora não seja estritamente um mecanismo de controle de acesso, um logging robusto é crucial para detectar e investigar incidentes de segurança. Configure parâmetros de logging no postgresql.conf para capturar eventos relevantes.

Configurações chave para auditoria de segurança:

  • log_statement = 'ddl' ou 'all': Registra todos os comandos de Linguagem de Definição de Dados (DDL), como CREATE TABLE e ALTER USER. Use 'all' com cuidado, pois pode criar um volume alto de logs e pode capturar texto de consulta sensível.
  • log_connections = on: Registra toda tentativa de conexão bem-sucedida.
  • log_disconnections = on: Registra quando os clientes se desconectam.
  • log_duration = on: Registra o tempo de execução de todas as instruções, o que às vezes pode revelar padrões de atividade incomuns.

Ao combinar regras de acesso rigorosas no pg_hba.conf, criptografia imposta via SSL, um endereço de escuta restrito e logging abrangente, você estabelece uma base sólida para proteger sua implantação do PostgreSQL.

Etapas Essenciais de Segurança

  1. Atualize o pg_hba.conf: Use scram-sha-256 ou peer para métodos de autenticação.
  2. Imponha Criptografia: Defina ssl = on no postgresql.conf e use entradas hostssl no pg_hba.conf.
  3. Restrinja a Escuta: Configure listen_addresses apenas para as interfaces necessárias, evitando o padrão * se possível.
  4. Imponha Privilégio Mínimo: Limite as funções do banco de dados apenas às permissões absolutamente necessárias para sua função.
  5. Recarregue a Configuração: Sempre recarregue ou reinicie o PostgreSQL após modificar arquivos de segurança para aplicar as alterações.

Essas configurações são a base. Depois de aplicá-las, teste a partir de um cliente permitido, teste a partir de um cliente bloqueado e verifique se os logs mostram o comportamento de conexão esperado.