Privilégios Padrão
ALTER DEFAULT PRIVILEGES anexa modelos de concessão a objetos futuros criados por um papel específico em um esquema. Sem ele, cada migração deve lembrar de instruções GRANT manuais.
Receita
-- Executar como proprietário da migração (cria tabelas em deploy)
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT SELECT ON TABLES TO app_readers;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_writers;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT USAGE, SELECT ON SEQUENCES TO app_writers;Quando usar isso: Inicialização de um novo esquema, integração de um novo papel de serviço ou correção de falhas recorrentes de "esqueci de GRANT" no deploy.
Exemplo de Trabalho
CREATE ROLE app_owner NOLOGIN;
CREATE ROLE app_migrator LOGIN PASSWORD 'vault';
GRANT app_owner TO app_migrator;
CREATE SCHEMA app AUTHORIZATION app_owner;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
REVOKE ALL ON TABLES FROM PUBLIC;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT SELECT ON TABLES TO app_readers;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_writers;
-- A migração cria nova tabela - as concessões são aplicadas automaticamente
SET ROLE app_owner;
CREATE TABLE app.orders (id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY);
RESET ROLE;
-- Verificar
SELECT grantee, privilege_type
FROM information_schema.table_privileges
WHERE table_schema = 'app' AND table_name = 'orders';O que isso demonstra:
FOR ROLE app_ownercorresponde ao papel criador - detalhe críticoREVOKE ALL FROM PUBLICnos padrões fecha o acesso público para novas tabelas- A nova tabela
ordersjá possui as concessõesapp_readers/app_writers
Análise Detalhada
FOR ROLE Importa
-- Errado: padrões para o usuário atual apenas
ALTER DEFAULT PRIVILEGES IN SCHEMA app GRANT SELECT ON TABLES TO app_ro;
-- Correto: padrões quando app_owner cria objetos
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT SELECT ON TABLES TO app_ro;- Os padrões são indexados pelo papel criador do objeto, não apenas pelo proprietário do esquema.
- O migrador de CI deve consistentemente
SET ROLE app_ownerou conectar comoapp_ownerviaSET SESSION AUTHORIZATION(apenas superusuário). - Listar padrões configurados:
SELECT * FROM pg_default_acl;Tipos de Objeto
| Comando | Aplica-se a |
|---|---|
ON TABLES | Tabelas e views |
ON SEQUENCES | Sequências de suporte de serial/identidade |
ON FUNCTIONS | Funções e procedimentos |
ON TYPES | Domínios e tipos |
Concessões Únicas Ainda Necessárias
-- Objetos existentes antes que os padrões fossem definidos
GRANT SELECT ON ALL TABLES IN SCHEMA app TO app_readers;ALTER DEFAULT PRIVILEGESnão é retroativo.- Scripts de inicialização de migração frequentemente combinam
ALL TABLES+ALTER DEFAULT PRIVILEGES.
Armadilhas
- FOR ROLE Errado - O migrador é executado como
app_migrator, mas os padrões são definidos paraapp_owner. Correção: Alinhar o papel criador ou adicionar padrões para ambos. - Múltiplos Migradores - O usuário do Flyway versus o usuário de hotfix humano criam objetos sem padrões. Correção: Apenas um papel de migração em produção.
- Sequências Esquecidas - Concessões de tabela existem;
INSERTfalha emnextval. Correção: Privilégios padrão emSEQUENCEStambém. - Esquema criado por superusuário - Os padrões para
app_ownernão se aplicam a tabelas criadas por superusuário. Correção: Nunca crie tabelas de aplicativos como superusuário. - Teste apenas em esquema vazio - Os padrões nunca são testados até a segunda migração. Correção: CI cria duas tabelas e afirma as concessões.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Grant em cada arquivo de migração | Políticas explícitas por tabela | Fácil esquecer sequências |
| Gatilho de evento em DDL | Auditoria/concessão centralizada | Equipe não tem habilidade de manutenção de gatilhos |
| Proprietário = app_api (anti-padrão) | Nunca recomendado | Você quer o mínimo de privilégio |
FAQs
Substituir GRANT manual em migrações?
Use padrões para tabelas rotineiras; mantenha GRANT explícito para exceções (nível de coluna, tabelas sensíveis).
Múltiplos esquemas?
Repita ALTER DEFAULT PRIVILEGES por esquema ou use um loop de inicialização em SQL.
Views e materialized views?
Coberto por ON TABLES. Direitos de atualização em matviews precisam de consideração separada para o papel de atualização.
Como remover um padrão?
ALTER DEFAULT PRIVILEGES ... REVOKE ... espelha a sintaxe de concessão; inspecione pg_default_acl antes das alterações.
Relacionados
- Padrões GRANT/REVOKE - concessões únicas em objetos existentes
- Noções Básicas de Migrações - disciplina de papel de migração
- Melhores Práticas de Permissões - o aplicativo se conecta com o mínimo de privilégio
Versões da Pilha: 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+.