Quando crio um usuário no Postgres,
create user test with password 'test';
O usuário acaba conseguindo se conectar a todos os bancos de dados da instância. O usuário também pode selecionar em qualquer tabela:
# psql -h localhost testdb test
Password for user test: *****
psql (8.4.20, server 9.1.13)
WARNING: psql version 8.4, server version 9.1.
Some psql features might not work.
Type "help" for help.
testdb=> select * from testtable;
id
------------
1
(1 row)
A \l
listagem do banco de dados mostra que testdb
tem arquivos Access privileges
. Então, por que um usuário recém-criado pode se conectar a esse banco de dados?
O usuário "teste" recém-criado também pode selecionar dados de tabelas. Por que ele pode fazer isso sem uma série grant
de select
privilégios?
Eu gostaria de criar um usuário que só pode se conectar a um banco de dados e apenas ler a partir de determinadas visualizações. Como posso impedir que um usuário leia diretamente das tabelas?
Também abordando a questão nos comentários.
Função
public
Por documentação:
Ênfase em negrito minha. A associação
public
não pode ser revogada (ou concedida). Você só pode revogar privilégios depublic
. No seu caso, para bloquear todas as funções sem privilégios explícitos, como @Robert já forneceu :Função
postgres
A função de banco de dados
postgres
é asuperuser
por padrão. Você pode tirar issopostgres
- mas isso seria imprudente: todos (incluindo alguns programas clientes) esperampostgres
ser um superusuário. Você também pode criar mais superusuários (cuidado com isso!). Os superusuários não precisam de privilégios. O manual mais uma vez :Quanto a sua pergunta:
Não exatamente.
Os privilégios são concedidos pelo proprietário ou um superusuário (ou uma função que recebeu o privilégio de fazê-lo).
postgres=UC/postgres
significariapostgres
concedido, o que não é preciso para privilégios vazios, mas o efeito é o mesmo em uma instalação padrão.No entanto, não
public
obtém privilégios para novos esquemasCONNECT
e apenasTEMP
(pode criar tabelas temporárias) privilégios para bancos de dados por padrão, não oCREATE
privilégio (não pode criar esquemas). Isso seria algo como=UT/??
de acordo com a lista de possíveis privilégios - o manual mais uma vez :Você pode alterar os privilégios padrão. Escrevi mais sobre isso na resposta relacionada mencionada nos comentários:
Mas esses privilégios padrão só se aplicam a objetos criados depois que os padrões foram alterados. Então, o que significa uma entrada ACL vazia? O manual no catálogo do sistema
pg_default_acl
:Ênfase em negrito minha.
Para resolver a questão de por que o teste pode
SELECT
partir de tabelas sem umGRANT
, é porque você não executou explicitamenteREVOKE
a capacidade de se conectar ao(s) seu(s) banco(s) de dados a partirPUBLIC
de e, em seguida, executou explicitamenteGRANT
para o seutest
usuário:Uma vez feito isso, você faria
REVOKE SELECT
para o usuário dentro desse banco de dados suas tabelas e outros itens que deseja impedir que o usuário acesse e, em seguida, explicitamenteGRANT SELECT
para as visualizações.Observe que o usuário aqui também pode ser uma função, à qual vários usuários podem ser adicionados.