Pourquoi un nouvel utilisateur est-il capable de créer des tables dans PostgreSQL?

13

J'ai suivi deux tutoriels pour créer une base de données avec:

  1. un lien utilisateur entièrement privilégié
  2. un lien utilisateur en lecture seule

J'ai ensuite reçu un conseil du tutoriel de CJ Estel indiquant que "vous avez peut-être hérité de la possibilité de créer des tableaux même si nous ne l'avons jamais explicitement donné à notre nouvel utilisateur". Effectivement, l'utilisateur en lecture seule est capable de créer et de posséder des tables!

CJ Estel a très bien indiqué la cause profonde, à savoir une base de données de modèles. Mais la possibilité de créer des tableaux sape la plupart des didacticiels que vous obtenez de googler "postgres utilisateur en lecture seule", y compris un hébergé sur postgresql.org . Votre utilisateur a plus que des privilèges en lecture seule!

Pourquoi un nouvel utilisateur a-t-il cette capacité? Après avoir révoqué ce privilège, la base de données est-elle vraiment en lecture seule pour cet utilisateur?

Jesvin Jose
la source

Réponses:

13

TL; DR: Les nouveaux utilisateurs peuvent créer des tables dans le publicschéma parce que les gens se sont plaints que c'était trop difficile quand ils ne pouvaient pas.

Si vous n'aimez pas les valeurs par défaut, vous devez probablement créer une nouvelle base de données de modèles avec la configuration initiale que vous souhaitez. Par exemple, vous pourriez:

DROP SCHEMA public;

ou

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

dans votre modèle.

Si vous souhaitez que l' publicutilisateur n'ait aucun droit sur une base de données, vous devez en outre:

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

afin que l' publicutilisateur ne puisse pas créer de schémas ou utiliser des tables temporaires.


Personnellement, si je concevais cela, je donnerais aux utilisateurs le TEMPdroit sur la base de données par défaut, mais pas CREATE(schémas dans la base de données) ou CREATE(tables dans le publicschéma). Je les réserverais pour le propriétaire.

Ce sont des choix qui ont été faits il y a longtemps, et il est assez difficile de les changer maintenant.


En l'état actuel des choses, il y a des plaintes régulières selon lesquelles il est trop difficile de démarrer avec PostgreSQL car vous devez créer un compte utilisateur et vous voulez souvent créer également une base de données. Pourquoi ne les créons-nous pas automatiquement et par défaut, nous faisons confiance au mode d'authentification pour le rendre plus facile? Pourquoi l' postgresutilisateur n'a-t-il pas par défaut le mot de passe postgres? Pourquoi ne créons-nous pas simplement des utilisateurs s'ils existent dans le système d'exploitation? etc.

Il existe de véritables problèmes de convivialité pour les nouveaux utilisateurs - en particulier, la plupart des gens ne peersavent pas ce qu'est l' auth, ni pourquoi le simple fait d'exécuter psqlaprès l'installation de PostgreSQL leur indique qu'il n'y a pas d'utilisateur du nom auquel ils sont connectés.

C'est aussi pg_hba.confun fichier de configuration compliqué, mais les utilisateurs sont créés au niveau SQL. Cette division déroute les utilisateurs.

Beaucoup de choses, cependant, sont des compromis entre les valeurs par défaut sécurisées et les valeurs par défaut faciles où le projet ne va jamais rendre tout le monde heureux.

Craig Ringer
la source
Donc, je cours revoke create on database [databasename] from [username];et la base de données est désormais vraiment en lecture seule pour [nom d'utilisateur]. Droite? Je reviendrai sur cette réponse après avoir lu un bon livre Postgres :)
Jesvin Jose
2
En réponse au commentaire précédent, c'est un non.
Jesvin Jose