PostgreSQL: Berechtigung für Relation verweigert

14

Ich bin etwas verwirrt über das Festlegen von Berechtigungen in PostgreSQL.

Ich habe diese Rollen:

                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 admin     | Superuser, Create role, Create DB, Replication | {}
 meltemi   | Create role, Create DB                         | {rails}
 rails     | Create DB, Cannot login                        | {}
 myapp     |                                                | {rails}

und Datenbanken:

                                    List of databases
        Name         | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
---------------------+--------+----------+-------------+-------------+-------------------
 myapp_production    | rails  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ...

Benutzer myapphat kein Problem, die myapp_productionDatenbank abzufragen, Datensätze hinzuzufügen und zu löschen. Ich möchte meltemi, dass auch die gleiche Datenbank abgefragt werden kann. Also habe ich eine Rolle erstellt, railsdie die Datenbank besitzt und sowohl Mitglieder meltemials auch myappMitglieder von rails. Aber ich bekomme immer noch permission denied for relationFehler. Meltemikann das Schema anzeigen, aber die Datenbank nicht abfragen.

Mir ist gerade aufgefallen (mit \dtBefehl), dass myappder Eigentümer der Tabellen ist:

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | events            | table | myapp
 public | schema_migrations | table | myapp
 ...
 public | users             | table | myapp
 ...

Die Tabellen wurden über ein ORM (Rails ActiveRecord Migrations) erstellt.

Ich weiß, dass die Autorisierung in PostgreSQL sehr unterschiedlich ist (im Gegensatz zu MySQL und anderen, die ich verwendet habe). Wie soll ich meine Datenbank einrichten, damit verschiedene Benutzer darauf zugreifen können? Einige sollten in der Lage sein, CRUD, aber andere nur in der Lage zu lesen, etc ...

Vielen Dank für jede Hilfe. Entschuldigung, ich weiß, dass dies eine sehr grundlegende Frage ist, aber ich konnte die Antwort nicht selbst finden.

Meltemi
quelle

Antworten:

4

Darüber habe ich gerade in meiner Antwort auf "Einem anderen Benutzer in ServerFault Rechte für die postgresql-Datenbank erteilen" geschrieben.

Grundsätzlich ist die beste Lösung, wenn Sie einen einzelnen Benutzer haben und anderen Benutzern dieselben Rechte gewähren möchten, diesen Benutzer in eine Gruppe umzuwandeln, einen neuen Benutzer mit demselben Namen wie den ursprünglichen Benutzer zu erstellen, der Mitglied der Gruppe ist, und Gewähren Sie diese Gruppe auch anderen Benutzern.

Also in Ihrem Fall railswird umbenannt, um zu sagen myapp_users, dann erstellen Sie eine neue Login-Rolle (Benutzer) mit dem Namen railsund GRANT myapp_users TO rails. Jetzt bist du ein GRANT myapp_users TO meltemi. Sowohl das neue railsKonto als auch der meltemiBenutzer haben jetzt die Rechte des alten railsKontos.

Für eine genauere Kontrolle empfehle ich normalerweise, dass Sie vermeiden, den täglichen Login-Benutzern oder deren Gruppen den Besitz der Tabellen zu übertragen. Geben Sie ihnen Zugriff über eine NOINHERITGruppe, für die sie explizit SET GROUPeinen völlig anderen Benutzer für privilegierte Vorgänge wie DDL und GRANTs verwenden müssen oder besser . Leider funktioniert dies nicht mit Rails, da Rails gerne Migrationen anwendet, wann immer es sich anfühlt, und AFAIK Ihnen nicht die Möglichkeit gibt, einen anderen, privilegierteren Benutzer anzugeben, unter dem die Migrationen ausgeführt werden sollen.

Craig Ringer
quelle
OK, lies den Beitrag, mit dem du verlinkt bist. sehr hilfreich! Nun, wenn ich die Dinge richtig verstehe, denke ich, dass Sie beabsichtigt haben, myappanstelle von railsoben zu verwenden? Da myappgehören die Tabellen (das habe ich nie angegeben, muss die Migration haben). Auf jeden Fall wäre es sorta Sinn machen , wenn ich umbenannt myappzu myapp_groupund machte dann einen neuen Benutzer , myappdie die App Schienen würde DB verbinden. Make myappund das Vorhandene meltemisind beide Mitglieder der myapp_groupRolle. Aber was passiert, wenn ich die nächste Migration durchführe? Wird es nicht dazu gehören myapp, das Problem erneut zu erstellen?!?
Meltemi
1
Sie müssen verstehen, dass PostgreSQL nur roles(seit Version 8.1) hat. Die Begriffe userund groupwerden aus historischen Gründen und Kompatibilitätsgründen beibehalten. Grundsätzlich ist eine "Gruppe" eine Rolle ohne Anmeldeberechtigung. Sie können gewähren myapp, meltemiauch wenn myappes sich nur um einen anderen "Benutzer" handelt. Beginnen Sie mit dem Lesen des Handbuchs hier .
Erwin Brandstetter
Ich verstehe die rolesvs groupsvs usersTrennung in Postgres, zumindest denke ich, dass ich es tue. Es tut uns leid, die oben angegebene falsche (und verwirrende) Terminologie zu verwenden. Ich verstehe jedoch immer noch nicht, wie ich meine Datenbank einrichten soll, sodass eine Rolle ohne Anmeldung die Datenbank und zwei Anmelderollen BESITZT myappund meltemibeide vollen Zugriff haben können. Eine dieser Rollen myappwird die Ausführung von Rails-Migrationen sein, bei denen unweigerlich neue Tabellen erstellt werden, deren Eigentümer wiederum myappein angemeldeter Benutzer ist. Soll ich einfach meltemiein "Mitglied" werden myappund damit fertig sein? Aber das klingt doch blöd ... nein?!?
Meltemi
1
@Meltemi: Wenn Sie alle Privilegien gewähren möchten, myappdie dazu gehören meltemi, dann wäre das das Richtige. Wenn Sie melteminur einen Teil der Berechtigungen erhalten möchten, ist dies nicht der Fall . Erstellen Sie dann eine Gruppenrolle, die die Berechtigungen enthält, und erteilen Sie diese an meltemi. Diese verwandte Frage zu SO wird Sie höchstwahrscheinlich interessieren . Ich antwortete erklärendDEFAULT PRIVILEGES
Erwin Brandstetter
@Meltemi Ja, wie gewohnt machen Rails-Migrationen das Bild kompliziert. Rails sollte es Ihnen wirklich ermöglichen, ein anderes Benutzerkonto anzugeben , unter dem Migrationen ausgeführt werden sollen. Sie können möglicherweise einen SET ROLEBefehl zum Beginn Ihrer Migrationen und einen Befehl zum RESET ROLEEnde hinzufügen , aber ich würde Rails nicht vertrauen, damit das Ganze ordnungsgemäß ausgeführt wird. Erwin hat recht; In diesem Fall besteht die beste Lösung darin, dass GRANTdie Benutzerschienen dem anderen Benutzer den Besitz übertragen und den ersten Benutzer als Gruppe für den zweiten Benutzer verwenden.
Craig Ringer