Comandos Essenciais para Gerenciamento de Usuários, Funções e Permissões no PostgreSQL
Gerencie funções do PostgreSQL, associação a grupos, concessões, revogações, privilégios padrão e auditorias de permissão com exemplos práticos de SQL.
Comandos Essenciais para Gerenciar Usuários, Funções e Permissões no PostgreSQL
Usuários, funções e permissões no PostgreSQL decidem quem pode conectar, o que podem ler e o que podem alterar. Se essas permissões crescerem por tentativa e erro, seu banco de dados se torna difícil de auditar e fácil de expor demais.
O PostgreSQL usa um único conceito, a função, tanto para usuários de login quanto para grupos. Uma função com LOGIN pode conectar. Uma função sem LOGIN é frequentemente usada como um grupo que carrega privilégios compartilhados.
Criar e Alterar Funções
Crie uma função de login de aplicação com uma senha:
CREATE ROLE app_user WITH LOGIN PASSWORD 'senha_forte_aqui';
Crie uma função de grupo para acesso de leitura compartilhado:
CREATE ROLE reporting_readonly NOLOGIN;
Atributos comuns de função incluem:
| Atributo | O que permite |
|---|---|
LOGIN |
Conectar ao servidor de banco de dados. |
CREATEDB |
Criar bancos de dados. |
CREATEROLE |
Criar, alterar e excluir muitas funções, com limites importantes em torno de funções de superusuário. |
REPLICATION |
Usar conexões de replicação. |
SUPERUSER |
Ignorar verificações normais de permissão. Use apenas para funções de administrador rigorosamente controladas. |
INHERIT |
Usar privilégios de funções das quais é membro. Este é o padrão. |
Altere uma senha ou desabilite o login com ALTER ROLE:
ALTER ROLE app_user WITH PASSWORD 'nova_senha_forte';
ALTER ROLE funcionario_antigo NOLOGIN;
Antes de excluir uma função, lide com tudo que ela possui e quaisquer privilégios que foram concedidos a ela:
REASSIGN OWNED BY funcionario_antigo TO postgres;
DROP OWNED BY funcionario_antigo;
DROP ROLE funcionario_antigo;
REASSIGN OWNED transfere objetos de propriedade. DROP OWNED remove privilégios concedidos à função e pode excluir objetos ainda de propriedade dela no banco de dados atual, então revise cuidadosamente antes de executá-lo.
Use Funções de Grupo para Acesso Mais Limpo
Conceda permissões a funções de grupo e depois adicione pessoas ou funções de aplicação a esses grupos.
GRANT reporting_readonly TO alice, bob;
REVOKE reporting_readonly FROM bob;
WITH ADMIN OPTION permite que o membro conceda e revogue essa associação de função para outros. Isso por si só não torna o membro um superusuário nem dá poder irrestrito sobre o banco de dados.
GRANT reporting_readonly TO lider_equipe WITH ADMIN OPTION;
Esse padrão mantém o acesso mais fácil de auditar. Em vez de verificar 50 usuários para concessões de tabela, você pode verificar a função de grupo.
Conceder Permissões de Objeto
Use GRANT para permitir ações específicas em objetos específicos.
GRANT SELECT ON TABLE production.orders TO reporting_readonly;
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE app.orders TO app_user;
Privilégios comuns de tabela são SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES e TRIGGER.
Permissões de esquema são separadas das permissões de tabela. Uma função geralmente precisa de USAGE no esquema e privilégios nas tabelas dentro dele:
GRANT USAGE ON SCHEMA app TO app_user;
GRANT SELECT ON ALL TABLES IN SCHEMA app TO app_user;
Para inserções que usam sequências, conceda acesso à sequência também:
GRANT USAGE, SELECT ON SEQUENCE app.orders_id_seq TO app_user;
Para funções, conceda execução explicitamente:
GRANT EXECUTE ON FUNCTION app.audit_log_insert(text) TO app_user;
Revogar Permissões
REVOKE remove uma concessão direta.
REVOKE INSERT ON TABLE production.orders FROM app_user;
REVOKE ALL PRIVILEGES ON TABLE production.orders FROM reporting_readonly;
Se um usuário ainda tiver acesso após uma revogação, verifique a associação a grupos. O usuário pode herdar o mesmo privilégio através de outra função.
Definir Permissões para Tabelas Futuras
GRANT ON ALL TABLES afeta apenas tabelas existentes. Para tabelas criadas posteriormente, use ALTER DEFAULT PRIVILEGES a partir da função que criará essas tabelas.
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA app
GRANT SELECT ON TABLES TO reporting_readonly;
Esta é uma das etapas ausentes mais comuns em configurações de permissão do PostgreSQL. Um usuário pode ler as tabelas de hoje, mas é negado nas tabelas de amanhã porque os privilégios padrão nunca foram configurados.
Auditar Acesso Atual
No psql, estes comandos são verificações rápidas:
\du
\du+ app_user
\dp app.orders
\dn+
As visões de catálogo são melhores para relatórios repetíveis:
SELECT rolname, rolsuper, rolcreaterole, rolcreatedb, rolcanlogin
FROM pg_roles
ORDER BY rolname;
Para concessões de tabela:
SELECT grantee, table_schema, table_name, privilege_type
FROM information_schema.table_privileges
WHERE table_schema = 'app'
ORDER BY grantee, table_name, privilege_type;
Hábitos de Segurança que Valem a Pena
Dê funções dedicadas às aplicações em vez de usar uma conta de DBA humana. Conceda o menor conjunto de privilégios que a aplicação precisa. Evite SUPERUSER e concessões amplas de ALL PRIVILEGES para o trabalho do dia a dia.
Use funções de grupo para acesso compartilhado e revise as associações regularmente. Quando alguém muda de equipe, remover uma associação de grupo é mais seguro do que caçar concessões em nível de tabela.
O próximo passo prático é escolher um esquema de produção e listar suas funções, associações, concessões de tabela e privilégios padrão. Corrija as lacunas lá antes de expandir o mesmo padrão para o resto dos seus bancos de dados.