PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Conceder privilégios para um banco de dados específico no PostgreSQL

Conceito básico no Postgres


As funções são objetos globais que podem acessar todos os bancos de dados em um cluster de banco de dados - dados os privilégios necessários.

Um grupo contém muitos bancos de dados , que contém muitos esquemas . Esquemas (mesmo com o mesmo nome) em diferentes bancos de dados não estão relacionados. A concessão de privilégios para um esquema se aplica apenas a esse esquema específico no banco de dados atual (o banco de dados atual no momento da concessão).

Todo banco de dados começa com um esquema public por padrão. Isso é uma convenção, e muitas configurações começam com ela. Fora isso, o esquema public é apenas um esquema como qualquer outro.

Vindo do MySQL, você pode querer começar com um único esquema public , ignorando efetivamente a camada de esquema completamente. Estou usando dezenas de esquemas por banco de dados regularmente.
Os esquemas são um pouco (mas não completamente) como diretórios no sistema de arquivos.

Depois de usar vários esquemas, certifique-se de entender search_path contexto:
  • Como o search_path influencia a resolução do identificador e o "esquema atual"

Privilégios padrão


Por documentação em GRANT :

PostgreSQL concede privilégios padrão em alguns tipos de objetos para PUBLIC . Nenhum privilégio é concedido a PUBLIC por padrão em tabelas, colunas, esquemas ou tablespaces. Para outros tipos, os privilégios padrão concedidos a PUBLIC são os seguintes:CONNECT e CREATE TEMP TABLE para bancos de dados; EXECUTE privilégio para funções; e USAGE privilégio para as línguas.

Todos esses padrões podem ser alterados com ALTER DEFAULT PRIVILEGES :
  • Conceder tudo em um esquema específico no banco de dados para uma função de grupo no PostgreSQL

Função do grupo


Como @Craig comentou, é melhor GRANT privilégios para uma função de grupo e, em seguida, tornar um usuário específico membro dessa função (GRANT a função de grupo para a função de usuário). Dessa forma, é mais simples distribuir e revogar pacotes de privilégios necessários para determinadas tarefas.

Uma função de grupo é apenas outra função sem login. Adicione um login para transformá-lo em uma função de usuário. Mais:
  • Por que o PostgreSQL fundiu usuários e grupos em funções?

Funções predefinidas


Atualização: Postgres 14 ou posterior adiciona as novas funções predefinidas (formalmente "funções padrão") pg_read_all_data e pg_write_all_data para simplificar alguns dos abaixo. Ver:
  • Conceder acesso a todas as tabelas de um banco de dados

Receita


Digamos, temos um novo banco de dados mydb , um grupo mygrp , e um usuário myusr ...

Enquanto estiver conectado ao banco de dados em questão como superusuário (postgres por exemplo):
REVOKE ALL ON DATABASE mydb FROM public;  -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp;  -- since we revoked from public

GRANT USAGE ON SCHEMA public TO mygrp;

Para atribuir "a um usuário todos os privilégios a todas as tabelas" como você escreveu (eu posso ser mais restritivo):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those

Para definir privilégios padrão para objetos futuros, execute para cada função que cria objetos neste esquema:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;

-- more roles?

Agora, conceda o grupo ao usuário:
GRANT mygrp TO myusr;

Resposta relacionada:
  • PostgreSQL - o usuário de banco de dados só deve ter permissão para chamar funções

Configuração alternativa (não padrão)


Vindo do MySQL, e como você deseja manter os privilégios nos bancos de dados separados, você pode gostar desta configuração não padrão db_user_namespace . Por documentação:

Este parâmetro habilita nomes de usuário por banco de dados. Ele está desligado por padrão.

Leia o manual com atenção. Eu não uso essa configuração. Não anula o acima.