Por que um novo usuário é capaz de criar tabelas no PostgreSQL?

13

Segui dois tutoriais para criar um banco de dados com:

  1. um link de usuário totalmente privilegiado
  2. um link de usuário somente leitura

Recebi uma dica do tutorial de CJ Estel, afirmando que "você pode ter herdado a capacidade de criar tabelas, mesmo que nunca a tenhamos explicitamente dado ao nosso novo usuário". Com certeza, o usuário somente leitura é capaz de criar e possuir tabelas!

CJ Estel apontou muito bem a causa raiz, a saber, um banco de dados de modelos. Mas a capacidade de criar tabelas prejudica a maioria dos tutoriais que você obtém no Google "postgres de usuário somente leitura", incluindo um hospedado no postgresql.org . Seu usuário tem mais do que privilégios somente leitura!

Por que um novo usuário tem essa capacidade? Depois de revogar esse privilégio, o banco de dados é realmente somente leitura para esse usuário?

Jesvin Jose
fonte

Respostas:

13

TL; DR: Novos usuários podem criar tabelas no publicesquema porque as pessoas reclamaram que era muito difícil quando não podiam.

Se você não gostar dos padrões, provavelmente deverá criar um novo banco de dados de modelos com a configuração inicial que deseja. Por exemplo, você pode:

DROP SCHEMA public;

ou

REVOKE ALL ON SCHEMA public FROM public;
GRANT USAGE ON SCHEMA public TO public;

no seu modelo.

Se você deseja que o publicusuário não tenha direitos em um banco de dados, deve:

REVOKE ALL ON DATABASE mydbname FROM public;
GRANT CONNECT ON DATABASE mydbname TO public;

para que o publicusuário não possa criar esquemas ou usar tabelas temporárias.


Pessoalmente, se eu estivesse projetando isso, daria aos usuários o TEMPdireito no banco de dados por padrão, mas não CREATE(esquemas no banco de dados) ou CREATE(tabelas no publicesquema). Eu reservaria para o proprietário.

São escolhas que foram feitas há muito tempo, e é muito difícil mudá-las agora.


Como é, existem reclamações regulares de que é muito difícil iniciar o PostgreSQL porque você precisa criar uma conta de usuário e, com frequência, também deseja criar um banco de dados. Por que simplesmente não os criamos automaticamente e o padrão é "confiar" como o modo de autenticação para facilitar? Por que o postgresusuário não possui a senha padrão postgres? Por que não criamos automaticamente usuários se eles existem no sistema operacional? etc.

Existem alguns problemas de usabilidade genuínos para novos usuários - em particular, a maioria das pessoas não tem idéia do que peeré a autenticação, ou por que apenas rodar psqlapós a instalação do PostgreSQL diz que não há usuário com o nome no qual está conectado.

Também é confuso que pg_hba.confseja um arquivo de configuração, mas os usuários são criados no nível SQL. Essa divisão confunde os usuários.

Muitas coisas, no entanto, são compromissos entre padrões seguros e padrões fáceis, onde o projeto nunca fará todo mundo feliz.

Craig Ringer
fonte
Então, eu corro revoke create on database [databasename] from [username];e o banco de dados agora é verdadeiramente somente leitura para [nome de usuário]. Certo? Eu vou voltar a esta resposta novamente quando tenho ler um bom livro Postgres :)
Jesvin Jose
2
Em resposta ao comentário anterior, é um não.
Jesvin Jose #