Desejo migrar um aplicativo interno simples, orientado a banco de dados, do SQLite3 para o PostgreSQL 9.3 e aumentar as permissões no banco de dados à medida que for avançando.
Atualmente, o aplicativo consiste em um comando para atualizar os dados; e um para consultá-lo. Naturalmente, também precisarei manter o banco de dados de outras maneiras (crie novas tabelas, visualizações, gatilhos, etc.).
Embora esse aplicativo seja o único hospedado no servidor a princípio, eu preferiria assumir que ele pode estar hospedado em um servidor com outros bancos de dados no futuro, em vez de ter que embaralhar mais tarde, se necessário. o futuro.
Eu pensaria que esses seriam um conjunto de requisitos bastante comum, mas estou tendo problemas para encontrar um tutorial simples explicando como configurar um novo banco de dados no PostgreSQL, com esse tipo de separação de usuário / privilégio. As referências continuam extensivamente sobre grupos, usuários, funções, bancos de dados, esquemas e domínio; mas acho-os confusos.
Aqui está o que eu tentei até agora (de dentro psql
como 'postgres'):
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;
\connect hostdb
CREATE SCHEMA hostdb;
CREATE USER hostdb_admin WITH PASSWORD 'youwish';
CREATE USER hostdb_mgr WITH PASSWORD 'youwish2';
CREATE USER hostdb_usr WITH PASSWORD 'youwish3';
GRANT ALL PRIVILEGES ON DATABASE hostdb TO hostdb_admin;
GRANT CONNECT ON DATABASE hostdb TO hostdb_mgr, hostdb_usr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO hostdb_mgr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT ON TABLES TO hostdb_usr;
Mas não estou obtendo a semântica pretendida. Eu quero tê-lo configurado para que apenas o hostdb_admin
possa criar (e soltar e alterar) tabelas; o hostdb_mgr
pode ler, inserir, atualizar e excluir em todas as tabelas por padrão; e o hostdb_usr
pode apenas ler todas as tabelas (e visualizações).
Quando tentei isso, descobri que era capaz de criar tabelas hostdb
como qualquer um desses usuários; mas, para cada usuário, eu só podia ler ou modificar as tabelas criadas por esse usuário - a menos que eu use um explícito GRANT
.
Eu estou supondo que há algo faltando entre CREATE DATABASE
e CREATE SCHEMA
, algo para aplicar SCHEMA
ao DATABASE
?
(À medida que as coisas se tornam mais avançadas, também terei perguntas para aplicar restrições semelhantes TRIGGERS
, procedimentos armazenados VIEWS
e talvez outros objetos).
Onde posso encontrar um guia, tutorial ou série de vídeos decente sobre isso?
fonte
public
pseudorol. Pode ser considerado um papel do qual todos os outros papéis (usuário, grupo - todos são iguais) fazem parte. Tente remover os privilégios dele, por exemploREVOKE CREATE ON SCHEMA hostdb FROM public
,. A revogação de direitos no nível do banco de dados, como você fez, desativa apenas algumas permissões no nível do banco de dados, sem efeito em esquemas ou tabelas.public
acontece com privilégios paraPUBLIC
. Fora isso, não há privilégios padrão para novos esquemas. Portanto, isso não afeta o caso de uso demonstrado. Veja o capítulo na minha resposta.Respostas:
Você encontrará tudo no manual. Links abaixo.
É verdade que o assunto não é trivial e, às vezes, confuso. Aqui está uma receita para o caso de uso:
Receita
Como superusuário
postgres
:Se você deseja um administrador mais poderoso que também possa gerenciar bancos de dados e funções, adicione os atributos de função
CREATEDB
eCREATEROLE
acima.Conceda cada função ao próximo nível superior, para que todos os níveis "herdam" pelo menos o conjunto de privilégios do próximo nível inferior (em cascata):
Estou nomeando o esquema
schma
(não ohostdb
que seria confuso). Escolha qualquer nome. Opcionalmente, torneschma_admin
o proprietário do esquema:Para
and drop and alter
ver as notas abaixo.As vistas são especiais. Para um:
E para visualizações atualizáveis :
Os gatilhos também são especiais. Você precisa do
TRIGGER
privilégio em cima da mesa e:Mas já estamos expandindo demais o escopo desta pergunta ...
Anotações importantes
Propriedade
Se você deseja permitir
schma_admin
(sozinho) descartar e alterar tabelas, faça com que a função possua todos os objetos. A documentação:Ou crie todos os objetos com a função
schma_admin
para começar, para que você não precise definir explicitamente o proprietário. Ele também simplifica os privilégios padrão, que você só precisa definir para a única função:Objetos pré-existentes
Os privilégios padrão se aplicam apenas aos objetos recém-criados e apenas à função específica com a qual eles são criados. Você também precisará adaptar permissões para objetos existentes :
O mesmo se aplica se você criar objetos com uma função que não foi
DEFAULT PRIVILEGES
definida, como o superusuáriopostgres
. Propriedade Reassign paraschma_admin
e privilégios definir manualmente - ou conjuntoDEFAULT PRIVILEGES
depostgres
bem (enquanto conectado à DB certo!):Privilégios padrão
Você estava perdendo um aspecto importante do
ALTER DEFAULT PRIVILEGES
comando. Aplica-se à função atual, a menos que seja especificado o contrário:Os privilégios padrão se aplicam apenas ao banco de dados atual. Portanto, você não mexe com outros bancos de dados no cluster do banco de dados. A documentação:
Você também pode definir privilégios padrão para
FUNCTIONS
eTYPES
(não apenasTABLES
eSEQUENCES
), mas esses podem não ser necessários.Privilégios padrão para
PUBLIC
Os privilégios padrão concedidos
PUBLIC
são rudimentares e superestimados por alguns. A documentação:Negrito ênfase minha. normalmente o único comando acima é suficiente para cobrir tudo:
Em particular, nenhum privilégio padrão é concedido
PUBLIC
para novos esquemas. Pode ser confuso que o esquema padrão chamado "public" comece comALL
privilégios paraPUBLIC
. Esse é apenas um recurso de conveniência para facilitar o início dos bancos de dados recém-criados. Não afeta outros esquemas de nenhuma maneira. Você pode revogar esses privilégios no banco de dados de modelostemplate1
, e todos os bancos de dados criados recentemente neste cluster são iniciados sem eles:O privilégio
TEMP
Como revogamos todos os privilégios
hostdb
dePUBLIC
, usuários comuns não podem criar tabelas temporárias a menos que permitamos explicitamente. Você pode ou não querer adicionar isso:search_path
Não se esqueça de definir o
search_path
. Se você tiver apenas um banco de dados no cluster, poderá definir o padrão global empostgresql.conf
. Caso contrário (mais provável), defina-a como propriedade do banco de dados, ou apenas para funções envolvidas ou mesmo a combinação de ambas. Detalhes:Convém defini-lo como
schma, public
se você usar o esquema público também, ou mesmo (menos provável)$user, schma, public
...Uma alternativa seria usar o esquema padrão "público", que deve funcionar com as configurações padrão, a
search_path
menos que você o tenha alterado. Lembre-se de revogar privilégiosPUBLIC
neste caso.Relacionado
fonte
this
se parece com instruções para a nave espacial ...