Berechtigungen für den Datenbankbesitzer; Anwendungsbenutzer

15

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.

Andy Davis
quelle

Antworten:

9

Sie möchten ALTER DEFAULT PRIVILEGES.

Gewähren Sie die rds_superuserStandardzugriffsrechte für alle neuen Tabellen.

Dies betrifft nur Tabellen, die nach dem erstellt wurden ALTER. Für vorhandene Tabellen müssen Sie GRANTRechte besitzen.

Craig Ringer
quelle
Ich hatte versucht, das zu tun. Ich habe dies in der ursprünglichen Frage schlecht formuliert. Ich habe es bearbeitet, um genau den Befehl anzuzeigen, den ich ausgeführt habe. Habe ich etwas falsch gemacht?
Andy Davis
Dies betrifft nur Tabellen, die nach dem erstellt wurden ALTER. Wann hast du es getan? Für vorhandene Tabellen müssen Sie GRANTRechte besitzen.
Craig Ringer
Ich habe die Standardprivilegien geändert und dann die Tabellen erstellt. Ich werde es noch einmal versuchen, vielleicht habe ich einen Fehler gemacht.
Andy Davis
Immer noch kein Glück damit, obwohl es absolut wie der Befehl scheint, der das Problem lösen sollte. Ich habe den Befehl so aktualisiert, dass er die Ausgabe von \ ddp und \ dp aus einer der Tabellen enthält.
Andy Davis
Furchtbar merkwürdig. Können Sie das Problem in einem normalen (nicht RDS) PostgreSQL reproduzieren?
Craig Ringer
0

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:

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

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:

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)

Nicht umgekehrt, wie Sie es versuchen.

Alexandros
quelle
Huh? A GRANTsollte 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 das publicSchema haben, können Sie auch keine Tabellen in diesem Schema verwenden.
Craig Ringer
Ich habe es endlich ausprobiert und es hilft nicht weiter.
Andy Davis
Ich habe die Frage bearbeitet, um den Grant zu entfernen, auf den sich @Aleandros bezog. Es schien nicht das Problem zu sein, aber ich denke, es war eine Ablenkung.
Andy Davis