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 comsudo systemctl reload postgresqlouSELECT 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_addressesestiver definido como*, todas as interfaces serão usadas. Certifique-se de que opg_hba.confcontrole 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), comoCREATE TABLEeALTER 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
- Atualize o
pg_hba.conf: Usescram-sha-256oupeerpara métodos de autenticação. - Imponha Criptografia: Defina
ssl = onnopostgresql.confe use entradashostsslnopg_hba.conf. - Restrinja a Escuta: Configure
listen_addressesapenas para as interfaces necessárias, evitando o padrão*se possível. - Imponha Privilégio Mínimo: Limite as funções do banco de dados apenas às permissões absolutamente necessárias para sua função.
- 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.