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.
la source
ALTER
. Quand l'as-tu fait? Pour les tables existantes, vous devezGRANT
disposer de droits.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:
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:
Pas l'inverse lorsque vous essayez de le faire.
la source
GRANT
ne 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 aupublic
schéma ne signifie pas que vous pouvez utiliser des tables en son sein.