Configurações Essenciais para Proteger seu Banco de Dados PostgreSQL
Proteger um banco de dados PostgreSQL é fundamental para salvaguardar dados sensíveis e garantir conformidade. Como um banco de dados relacional avançado de código aberto, o PostgreSQL oferece mecanismos de configuração robustos para controlar o acesso, criptografar a comunicação e minimizar potenciais vulnerabilidades. Este guia aprofunda-se nos arquivos de configuração e parâmetros críticos necessários para estabelecer uma postura de segurança reforçada para ambientes de produção.
A segurança eficaz do PostgreSQL baseia-se em dois pilares principais: controlar quem pode se conectar e como eles se conectam. Exploraremos configurações vitais dentro de postgresql.conf e o arquivo crucial de autenticação de cliente, pg_hba.conf, juntamente com a implementação de criptografia obrigatória usando SSL/TLS.
1. Reforçando a Autenticação de Cliente com pg_hba.conf
O arquivo Host-Based Authentication (pg_hba.conf) dita quais hosts podem se conectar, como quais usuários PostgreSQL eles podem se conectar, a quais bancos de dados eles podem acessar e, o mais importante, o método de autenticação exigido para essa conexão.
Entendendo a Estrutura de pg_hba.conf
Cada linha em pg_hba.conf segue um formato específico:
TYPE DATABASE USER ADDRESS METHOD [OPTIONS]
- TYPE: Tipo de conexão (ex:
local,host,hostnossl,hostssl). - DATABASE: Nome(s) do banco de dados de destino.
- USER: Função(ões) do banco de dados de destino.
- ADDRESS: Faixa de endereço IP do cliente.
- METHOD: 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 corresponda aos critérios de conexão se conecte sem uma senha. Os métodos de autenticação modernos recomendados são:
Recomendado: scram-sha-256
SCRAM (Salted Challenge Response Authentication Mechanism) oferece melhorias significativas em relação a métodos de senha mais antigos como md5, usando hashing mais forte e prevenindo ataques de replay. Esta deve ser sua escolha padrão para conexões remotas.
# Aplicar SCRAM para todas as conexões remotas na porta 5432
host all all 0.0.0.0/0 scram-sha-256
Conexões Locais
Para conexões originadas do próprio servidor (por exemplo, aplicações rodando na mesma máquina), use soquetes locais. A configuração mais segura é geralmente peer (para soquetes de domínio Unix) ou scram-sha-256 se os soquetes estiverem desabilitados ou restritos.
# Usar autenticação peer para conexões locais via soquete 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 de IP conhecida como insegura
host all all 192.168.1.0/24 reject
Dica Acionável: Após modificar
pg_hba.conf, você deve recarregar a configuração para que as alterações tenham efeito (por exemplo,pg_ctl reloadou enviando um sinal SIGHUP ao processo postmaster).
2. Implementando Criptografia SSL/TLS
Para evitar que dados sensíveis (incluindo senhas) sejam interceptados pela rede, é obrigatório impor a criptografia SSL/TLS para todas as conexões remotas.
Configuração em postgresql.conf
Certifique-se de que estes parâmetros estejam definidos corretamente em seu arquivo de configuração principal:
ssl = on: Habilita o suporte SSL globalmente.ssl_cert_file: Caminho para o arquivo do certificado do servidor (ex:server.crt).ssl_key_file: Caminho para o arquivo da chave privada do servidor (ex:server.key).
Impondo SSL em pg_hba.conf
Para forçar os clientes a usar SSL, altere o tipo de conexão em 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
Se você tiver clientes legados que não podem suportar SSL, pode permitir explicitamente conexões não-SSL, mas restringi-las apenas a operações não sensíveis, embora a rejeição total seja preferível.
3. Minimizando a Superfície de Ataque
A segurança envolve a redução da exposição do servidor de banco de dados a ameaças externas. Isso é gerenciado principalmente através da configuração de rede e desabilitação de recursos desnecessários.
Limitando o Endereço de Escuta da Rede
Por padrão, o PostgreSQL pode escutar em todas as interfaces de rede (listen_addresses = '*'). Para segurança aprimorada, configure-o explicitamente para escutar apenas na(s) interface(s) específica(s) que requerem acesso externo, ou localhost se apenas aplicações locais se conectam.
Em 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_addressesfor definido como*, todas as interfaces serão usadas. Certifique-se de quepg_hba.confcontrole estritamente quais faixas de IP podem se conectar.
Desabilitando 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 qualquer uma que não seja ativamente usada para sua carga de trabalho de produção. Isso minimiza a superfície de ataque geral.
Segurança de Senha e Funções (Roles)
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 menor privilégio: os usuários de aplicação devem ter apenas permissões SELECT, INSERT, UPDATE e DELETE nas tabelas específicas de que precisam, em vez de status de superusuário.
4. Configuração de Auditoria e Log
Embora não seja estritamente um mecanismo de controle de acesso, o log robusto é crucial para detectar e investigar incidentes de segurança. Configure os parâmetros de log em postgresql.conf para capturar eventos relevantes.
Configurações chave para auditoria de segurança:
log_statement = 'ddl'ou'all': Registra todos os comandos da Linguagem de Definição de Dados (DDL) (comoCREATE TABLE,ALTER USER). Defina como'all'temporariamente durante revisões de segurança, mas esteja ciente do impacto no desempenho.log_connections = on: Registra cada 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 estritas em pg_hba.conf, criptografia imposta via SSL, um endereço de escuta restrito e log abrangente, você estabelece uma base sólida para proteger sua implantação PostgreSQL.
Resumo das Etapas Essenciais de Segurança
- Atualizar
pg_hba.conf: Usescram-sha-256oupeerpara métodos de autenticação. - Impor Criptografia: Defina
ssl = onempostgresql.confe use entradashostsslempg_hba.conf. - Restringir Escuta: Configure
listen_addressespara apenas interfaces necessárias, evitando o padrão*se possível. - Impor Menor Privilégio: Limite as funções do banco de dados apenas às permissões absolutamente exigidas para sua função.
- Recarregar Configuração: Sempre recarregue ou reinicie o PostgreSQL após modificar arquivos de segurança para aplicar as alterações.