web-dev-qa-db-fra.com

L'utilisateur créé peut accéder à toutes les bases de données dans PostgreSQL sans aucune subvention

Je dois manquer quelque chose en ce qui concerne la configuration de PostgreSQL. Ce que j'aimerais faire, c'est créer plusieurs bases de données et utilisateurs qui sont isolés les uns des autres afin qu'un utilisateur spécifique n'ait accès qu'aux bases de données que je spécifie. Cependant, d'après ce que je peux déterminer, tout utilisateur créé a accès à toutes les bases de données sans octroi de subventions spécifiques.

Voici ce que je fais sur un serveur Ubuntu 12.04:

  1. apt-get install postgresql
  2. Sudo -u postgres createuser -DRSP mike1 (Spécification du mot de passe pour le nouvel utilisateur)
  3. Sudo -u postgres crééb data1
  4. psql -h localhost -U mike1 data1 (Spécification du mot de passe pour l'utilisateur mike1 pour se connecter)

Il semble que le nouvel utilisateur "mike1" n'ait aucun problème à se connecter à la base de données "data1" et à créer des tables, etc. Et cela sans exécuter aucune commande GRANT (et le propriétaire de "data1" est "postgres" puisque je n'ai pas spécifié de propriétaire à l'étape 3). Est-ce vraiment ainsi que cela est censé fonctionner?

Ce que je voudrais faire, c'est accorder à mike1 un accès complet aux données1, puis répéter cette opération pour plus d'utilisateurs et de bases de données, en veillant à ce que les utilisateurs n'aient accès qu'à une (ou éventuellement plusieurs) bases de données de mon choix.

45
mikeplate

Au niveau SQL, chaque utilisateur peut en effet se connecter à une base de données nouvellement créée, jusqu'à ce que la commande SQL suivante soit émise:

REVOKE connect ON DATABASE database_name FROM PUBLIC;

Une fois cela fait, chaque utilisateur ou rôle qui devrait pouvoir se connecter doit se voir accorder explicitement le privilège de connexion:

GRANT connect ON DATABASE database_name TO rolename;

Modifier: dans un scénario multi-locataire, plus que le simple privilège connect serait supprimé. Pour obtenir des conseils et des bonnes pratiques sur l'hébergement multiclient, vous pouvez consulter le wiki public de postgresql: Hébergement de bases de données partagées et Gestion des droits dans PostgreSQL .

47
Daniel Vérité

PUBLIC a accès à la base de données par défaut, mais il ne peut pas accéder aux données. Vous pouvez RÉVOQUER le PUBLIC:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

Si vous souhaitez ce paramètre pour toutes les futures bases de données, révoquez CONNECT sur la base de données template1 (base de données de modèles par défaut pour la création d'une nouvelle base de données):

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;
24
Frank Heikens

Outre la révocation des privilèges de connexion de PUBLIC par défaut et leur octroi comme souhaité, l'autre niveau auquel vous pouvez contrôler l'accès se fait via le fichier pg_hba.conf.

Vous pouvez trouver où le fichier est stocké avec:

SHOW hba_file;

Si vous choisissez d'utiliser ce mécanisme, des commentaires intégrés peuvent suffire à vous aider à démarrer. Les documents sont ici:

http://www.postgresql.org/docs/current/interactive/auth-pg-hba-conf.html

4
kgrittn

Je suis tombé sur ce fil à la recherche d'un moyen d'empêcher les utilisateurs de répertorier même les autres noms de base de données. Le REVOKE CONNECT n'empêche pas cela.

Selon les réponses à cette SO question il n'y a pas de moyen (recommandable) pour y parvenir.

0
AdamAL