Regras de Segurança
As regras de segurança do PostgreSQL impõem privilégio mínimo, isolamento de inquilino e acesso humano auditável. Os aplicativos não devem herdar poderes de DBA por padrão.
Receita
-- Modelo mínimo de role de produção
CREATE ROLE app_owner NOLOGIN;
CREATE ROLE app_api LOGIN PASSWORD 'vault' CONNECTION LIMIT 100;
CREATE ROLE app_migrator LOGIN PASSWORD 'vault';
GRANT app_readers TO app_api; -- ou app_writers por serviço
-- SEM SUPERUSER, SEM BYPASSRLS para app_api
ALTER TABLE app.orders ENABLE ROW LEVEL SECURITY;
ALTER TABLE app.orders FORCE ROW LEVEL SECURITY;Quando usar isso: Revisão de segurança, mapeamento de controle SOC2, checklist de integração para novos serviços.
Exemplo de Trabalho
# Trecho do pg_hba.conf
hostssl myapp app_api 10.10.1.0/24 scram-sha-256
hostssl myapp app_ro 10.10.2.0/24 scram-sha-256
host all all 0.0.0.0/0 rejectCREATE POLICY orders_tenant ON app.orders FOR ALL TO app_api
USING (tenant_id = current_setting('app.tenant_id')::bigint)
WITH CHECK (tenant_id = current_setting('app.tenant_id')::bigint);
REVOKE ALL ON SCHEMA public FROM PUBLIC;
GRANT USAGE ON SCHEMA app TO app_api;Resumo das regras de segurança:
| # | Regra |
|---|---|
| 1 | Sem superusuário em strings de conexão de aplicativo |
| 2 | SCRAM-SHA-256 + TLS para roles remotos |
| 3 | RLS FORCE em tabelas de inquilino compartilhadas |
| 4 | Migrator != role de tempo de execução |
| 5 | Roles de "break-glass" auditados e com TTL |
Mergulho Profundo
Regras de Conexão de Aplicativo
- A string de conexão usa
app_apiou um role mais restrito por microsserviço - PgBouncer não substitui a separação de privilégios - ainda use o role de privilégio mínimo
search_pathfixado em schemas conhecidos - impede o sequestro de objetos empublic
Regras de Acesso Humano
- Analistas:
app_roem réplica,statement_timeoutdefinido - DBAs: jump host + login individual, sem senha
postgrescompartilhada - Contagem de
BYPASSRLSdocumentada trimestralmente
Proteção de Dados
-- Nível de coluna para PII
GRANT SELECT (id, email) ON app.users TO app_ro;
REVOKE SELECT (ssn_hash) ON app.users FROM app_ro;- Criptografe backups e restrinja ambientes de restauração
pg_dumpcomo superusuário ignora RLS - classifique os arquivos de dump
Extensão e Cadeia de Suprimentos
- Lista de permissões de extensão em ADR
- Sem
CREATE EXTENSIONdo role do aplicativo - Fixe as versões das extensões em SQL de migração
Armadilhas
- Usuário master do RDS no aplicativo - O console da nuvem facilita. Correção: Crie roles de aplicativo no primeiro dia; bloqueie o master para "break-glass".
- RLS sem FORCE - Migrações do proprietário veem todos os inquilinos em erros do psql. Correção: FORCE em tabelas de inquilino.
- Confiança em pg_hba para VPC - "Rede privada" não é autenticação. Correção: Sempre SCRAM ou certificado.
- CREATE público no schema para todos - O padrão legado permite que qualquer usuário crie objetos. Correção: Revogue em clusters protegidos.
- Funções SECURITY DEFINER como backdoor - Escala para direitos do proprietário. Correção: Audite funções definidoras; proprietário mínimo.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Certificados de cliente mTLS | Identidade de malha de serviço | Analistas humanos em laptops |
| Credenciais dinâmicas do Vault | Senhas de banco de dados de curta duração | Aplicativo CRUD interno simples |
| Banco de dados por inquilino | Requisito de isolamento rígido | Milhares de inquilinos |
FAQs
RLS é suficiente sem verificações de aplicativo?
Defesa em profundidade - RLS pega bugs do aplicativo; o aplicativo ainda valida o inquilino para UX e auditoria.
Criptografar conexões dentro da VPC?
Sim - ameaças internas e frameworks de conformidade esperam TLS mesmo entre sistemas internos.
Usuário postgres no laptop?
Apenas desenvolvimento local com autenticação peer de socket local - nunca credenciais de produção na estação de trabalho.
Relacionado
- Melhores Práticas de Permissões - padrões de concessão
- Bypass RLS e Superusuário - audite caminhos de bypass
- pg_hba.conf e Autenticação - autenticação de rede
Versões do Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.