Schnellversion:
Welchen Befehl muss ich ausgeben, damit ein Datenbankbesitzer auf Tabellen in dieser Datenbank zugreifen kann, und kann dies über das Konto dieses Besitzers erfolgen?
Längere Version:
Ich erstelle eine Datenbank für RDS. Ich habe einen Root-Benutzer, den ich mit Amazon konfiguriert habe.
Amazon erstellt automatisch die Gruppenrolle 'rds_superuser', die sehr privilegiert ist, aber eigentlich kein Superuser.
Ich erstelle eine Datenbank und einen Benutzer für die Anwendung wie folgt:
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;
Ich habe dieses Skript aktualisiert, um Vorschläge von Craig Ringer zu berücksichtigen, wie ich damit umgehen soll.
Wenn die App eine Verbindung herstellt (mit den Anmeldeinformationen für master_application), erstellt sie die Tabellen (und besitzt sie daher).
Mein Problem ist, dass ich mein Administrator-Login (Root-Login) nicht zum Ausführen von Abfragen verwenden kann, da dieser Benutzer keine Berechtigungen für die Tabelle hat.
Ich konnte dieses Problem zuvor lösen, indem ich Folgendes über das Anwendungskonto ausführte:
GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;
Es scheint jedoch schwierig zu sein, wenn ein untergeordneter Benutzer einem Benutzer mit Verwaltungsaufgaben Berechtigungen zurückgibt.
Also ... Gibt es einen Befehl, den ich ausführen kann, bevor oder nachdem ich die Tabellen aus der Anwendung heraus erstellt habe, um sicherzustellen, dass der Eigentümer der Datenbank auf die Tabellen in der Datenbank zugreifen kann?
Update nach erneutem Versuch, die Standardrechte zu ändern ...
Dies gewährt immer noch keinen Zugriff auf die Tabellen. Ich sehe, dass es anderswo vorgeschlagen wird, und es macht durchaus Sinn, aber es funktioniert nicht für mich. Aus einer Psql-Shell:
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 ist mein Superuser-ish-Benutzer und users ist eine Tabelle in meiner Datenbank.
Aktualisieren
Ich habe eine ziemlich nutzlose Antwort von jemandem bei Amazon erhalten.
Sie baten mich, ALTER DEFAULT PRIVILEGES vom master_application-Login aus anzurufen. Während dies wahrscheinlich funktionieren würde, würde es meine Frage nicht beantworten (wie mache ich das nur über das Konto rds_superuser).
Ich bat sie, dies zu klären und sie gingen weg.
quelle
ALTER
. Wann hast du es getan? Für vorhandene Tabellen müssen SieGRANT
Rechte besitzen.Das öffentliche Schema soll für alle Benutzer sichtbar sein. Sie sollten die Rechte des öffentlichen Schemas nicht auf nur eine Gruppe beschränken.
Also, wenn Sie nicht verwenden:
Sie können mit allen Konten sicher mit dem öffentlichen Schema arbeiten.
Wenn Sie nicht möchten, dass bestimmte Konten Ihre öffentlichen Schematabellen durcheinander bringen, erstellen Sie eine neue Rolle (für Benutzer Ihrer App) und widerrufen Sie Berechtigungen für diese bestimmte Rolle innerhalb des öffentlichen Schemas. Etwas wie:
Nicht umgekehrt, wie Sie es versuchen.
quelle
GRANT
sollte niemals in der Lage sein , Zugriffsrechte einzuschränken. Ich bin nicht überzeugt. Beachten Sie, dass die Rechte an einem Schema auch nicht an neue Tabellen in diesem Schema vererbt werden. Wenn Sie also Zugriff auf daspublic
Schema haben, können Sie auch keine Tabellen in diesem Schema verwenden.