139 votes

Postgresql : que fait GRANT ALL PRIVILEGES ON DATABASE ?

J'essaie d'accorder tous les privilèges sur toutes les tables d'une base de données donnée à un nouvel utilisateur postgres (pas le propriétaire). Il semble que GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user; ne le fait pas. Après avoir exécuté ladite commande avec succès (en tant qu'utilisateur postgres), j'obtiens ce qui suit en tant que new_user :

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

Deux questions :

1) Que fait la commande ci-dessus, alors, si elle n'accorde pas toutes les permissions sur toutes les tables de my_db ?

2) Quelle est la bonne façon d'accorder toutes les permissions sur toutes les tables à un utilisateur (y compris sur toutes les tables créées dans le futur) ?

145voto

Priyan R Points 687

Les réponses à vos questions proviennent de la Documentation en ligne sur PostgreSQL 8.4 .

  1. GRANT ALL PRIVILEGES ON DATABASE accorde le CREATE , CONNECT et TEMPORARY des privilèges sur une base de données à un rôle (les utilisateurs sont appelés à juste titre des rôles ). Aucun de ces privilèges ne permet réellement à un rôle de lire les données d'une table ; SELECT Le privilège sur la table est nécessaire pour cela.

  2. Je ne suis pas sûr qu'il existe une façon "correcte" d'accorder tous les privilèges sur toutes les tables à un rôle. La meilleure façon de s'assurer qu'un rôle donné dispose de tous les privilèges sur une table est de s'assurer que le rôle possède la table. Par défaut, chaque objet nouvellement créé appartient au rôle qui l'a créé, donc si vous voulez qu'un rôle ait tous les privilèges sur une table, utilisez ce rôle pour la créer.

    PostgreSQL 9.0 introduit la syntaxe suivante qui est presque ce que vous voulez :

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    Le hic, c'est que si vous créez des tables dans des schémas autres que le schéma "public" par défaut, ce GRANT ne s'applique pas à eux. Si vous utilisez des schémas non publics, vous devrez GRANT les privilèges de ces schémas séparément.

34voto

Chris Cogdon Points 341

Il est possible de configurer plusieurs logins pour agir en tant que propriétaire de la base de données :

  • Créez un rôle "nologin" pour agir en tant que propriétaire : CREATE ROLE dbowner NOLOGIN
  • Changez le propriétaire de votre base de données en ceci : ALTER DATABASE mydb OWNER TO dbowner
  • Accordez toutes vos connexions à ce nouveau rôle : GRANT dbowner TO user1, user2

Maintenant, si l'utilisateur 1 ou l'utilisateur 2 se connecte, ils ont toutes les permissions sur "mydb" sans aucune autre autorisation requise.

Toutefois, je considère cette solution avec prudence. Il est tentant de demander à votre application Web d'utiliser l'un de ces identifiants pour éviter de créer des autorisations supplémentaires à chaque mise à jour du schéma, mais vous supprimez ainsi une forme de protection très utile. Utilisez la solution ci-dessus si vous voulez vraiment plusieurs "admins", mais restez-en au modèle "accorder tous les privilèges sur toutes les tables du schéma ..." ci-dessus pour le login de votre application "normale".

12voto

Promise Preston Points 153

Dans PostgreSQL 12 et plus, il est possible de accorder tous les privilèges d'une table dans une base de données à un rôle/utilisateur/compte.

La syntaxe est la suivante :

GRANT ALL ON table_name TO role_name;

Si vous voulez l'accorder à toutes les tables de la base de données alors la syntaxe sera :

GRANT ALL ON ALL TABLES TO role_name;

Si vous voulez l'accorder à toutes les tables d'un schéma de la base de données alors la syntaxe sera :

GRANT ALL ON ALL TABLES IN SCHEMA schema_name TO role_name;

Voici comment j'ai procédé :

Tout d'abord, je me suis connecté au serveur de la base de données Postgres :

psql -U postgres

Sortie

psql (12.6 (Ubuntu 12.6-0ubuntu0.20.04.1))
Type "help" for help.

Ensuite, j'ai créé un utilisateur/rôle/compte de base de données :

CREATE ROLE alice4 WITH LOGIN PASSWORD 'securePass1';

Sortie

CREATE ROLE

Ensuite, j'ai créé une table dans la base de données postgres :

create table candidates (
    candidate_id int generated always as identity,
    first_name varchar(100) not null,
    last_name varchar(100) not null,
    email varchar(255) not null unique,
    phone varchar(25) not null,
    primary key(candidate_id)
);

Sortie

CREATE TABLE

Ensuite, j'ai accordé tous les privilèges sur le candidates au compte/utilisateur/rôle alice4

GRANT ALL ON candidates TO alice4;

Sortie

GRANT

Ensuite, je me suis déconnecté de la base de données postgres et de l'application postgres compte/utilisateur/rôle :

exit

Ensuite, je me suis connecté à la base de données Postgres à l'aide de l'utilitaire alice4 compte/utilisateur/rôle :

psql -U alice4 -W postgres

Sortie

Password: 
psql (12.6 (Ubuntu 12.6-0ubuntu0.20.04.1))
Type "help" for help.

Ensuite, j'ai inséré des données dans le candidates qui a été créé précédemment :

INSERT INTO candidates(first_name, last_name, email, phone)
VALUES('Joe','Com','joe.com@example.com','408-111-2222');

Sortie

INSERT 0 1

Ensuite, j'ai sélectionné toutes les données dans le candidates qui a été créé précédemment :

SELECT * FROM candidates;

Sortie

 candidate_id | first_name | last_name |        email        |    phone     
--------------+------------+-----------+---------------------+--------------
            1 | Joe        | Com       | joe.com@example.com | 408-111-2222
(1 row)

Ressources : PostgreSQL GRANT

C'est tout.

J'espère que cela vous aidera

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X