Privilèges pour le propriétaire de la base de données; utilisateur de l'application

15

Version rapide:

Quelle commande dois-je émettre pour permettre à un propriétaire de base de données de lui permettre d'accéder aux tables de cette base de données et cela peut-il être fait à partir du compte de ce propriétaire?


Version plus longue:

Je crée une base de données sur RDS. J'ai un utilisateur «root» que j'ai configuré avec Amazon.

Amazon crée automatiquement le rôle de groupe «rds_superuser» qui est très privilégié, mais pas en fait un superutilisateur.

Je crée une base de données et un utilisateur pour l'application comme suit:

create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;

\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;

J'ai mis à jour ce script pour refléter les suggestions de Craig Ringer sur la façon dont je devrais gérer cela.

Lorsque l'application se connecte (avec les informations d'identification master_application), elle crée (et possède donc) les tables.

Mon problème est que je ne peux pas utiliser ma connexion administrative (rootish) pour exécuter des requêtes car cet utilisateur n'a aucun privilège sur la table.

J'ai pu résoudre ce problème auparavant en exécutant ce qui suit à partir du compte d'application:

GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;

Mais il semble bizarre qu'un utilisateur subalterne redonne des privilèges à un utilisateur administratif.

Alors ... Y a-t-il une commande que je peux exécuter avant ou après avoir créé les tables à partir de l'application qui garantira que le propriétaire de la base de données peut accéder aux tables dans la base de données?


mettre à jour après avoir réessayé les privilèges alter default ...

Cela n'accorde toujours pas l'accès aux tables; Je vois que cela est suggéré ailleurs et c'est tout à fait logique, mais cela ne fonctionne pas pour moi. Depuis un shell psql:

master_integration=> \ddp
                           Default access privileges
      Owner       | Schema | Type  |             Access privileges             
------------------+--------+-------+-------------------------------------------
 integration_root |        | table | integration_root=arwdDxt/integration_root+
                  |        |       | rds_superuser=arwdDxt/integration_root
(1 row)

master_integration=> \dp users
                           Access privileges
 Schema | Name  | Type  | Access privileges | Column access privileges 
--------+-------+-------+-------------------+--------------------------
 public | users | table |                   | 
(1 row)

integration_root est mon utilisateur superutilisateur et is users est une table dans ma base de données.


Mise à jour

J'ai reçu une réponse assez inutile de quelqu'un d'Amazon.

Ils m'ont demandé d'appeler ALTER DEFAULT PRIVILEGES à partir de la connexion master_application. Bien que cela fonctionnerait probablement, cela ne répondrait pas à ma question (comment faire pour que cela se produise uniquement à partir du compte rds_superuser).

Je leur ai demandé de clarifier cela et ils sont partis.

Andy Davis
la source

Réponses:

9

Tu veux ALTER DEFAULT PRIVILEGES.

Donnez les rds_superuserdroits d'accès par défaut à toutes les nouvelles tables.

Cela n'affecte que les tables créées après le ALTER. Pour les tables existantes, vous devez GRANTdisposer de droits.

Craig Ringer
la source
J'avais essayé de faire ça. J'ai mal formulé cela dans la question d'origine, je l'ai édité pour montrer exactement la commande que j'exécutais. Ai-je eu quelque chose de mal?
Andy Davis
Elle n'affecte que les tables créées après le ALTER. Quand l'as-tu fait? Pour les tables existantes, vous devez GRANTdisposer de droits.
Craig Ringer
J'ai modifié les privilèges par défaut, puis créé les tables. Je vais essayer à nouveau, j'ai peut-être fait une erreur.
Andy Davis
Toujours pas de chance avec cela, même si cela semble absolument être la commande qui devrait résoudre le problème. J'ai mis à jour la commande pour inclure la sortie de \ ddp et \ dp de l'une des tables.
Andy Davis
Extrêmement étrange. Pouvez-vous reproduire le problème dans un PostgreSQL standard (non RDS)?
Craig Ringer
0

Le schéma public est censé être visible par tous les utilisateurs. Vous ne devez pas limiter les droits du schéma public à un seul groupe.

Donc, si vous n'utilisez pas:

GRANT ALL ON SCHEMA public TO GROUP rds_superuser WITH GRANT OPTION;

Vous pouvez travailler en toute sécurité avec le schéma public avec tous les comptes.

Si vous ne voulez pas que des comptes spécifiques gâchent vos tables de schéma public, créez un nouveau rôle (pour les utilisateurs de votre application) et révoquez les droits de ce rôle particulier dans le schéma public. Quelque chose comme:

CREATE USER mywebuser WITH PASSWORD '*****';
REVOKE ALL PRIVILEGES ON SCHEMA public FROM mywebuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mywebuser; (or whatever rights you need to provide)

Pas l'inverse lorsque vous essayez de le faire.

Alexandros
la source
Hein? Un GRANTne devrait jamais être en mesure de réduire les droits d'accès. Je ne suis pas convaincu. Notez que les droits sur un schéma ne sont pas hérités non plus par les nouvelles tables de ce schéma, donc avoir accès au publicschéma ne signifie pas que vous pouvez utiliser des tables en son sein.
Craig Ringer
J'ai finalement pu essayer cela et cela n'aide pas la situation.
Andy Davis
J'ai modifié la question pour éliminer la subvention à laquelle faisait référence @Aleandros. Cela ne semblait pas être le problème, mais je pense que c'était une distraction.
Andy Davis