Wo finde ich eine anständige Anleitung, ein Tutorial oder eine Videoserie dazu?
Sie finden alles im Handbuch. Links unten.
Zugegeben, die Angelegenheit ist nicht trivial und manchmal verwirrend. Hier ist ein Rezept für den Anwendungsfall:
Rezept
Ich möchte es so konfiguriert haben, dass nur die hostdb_admin
Tabellen erstellen (und löschen und ändern) können;
das hostdb_mgr
lesen kann, einfügen, aktualisieren und löschen auf alle Tabellen standardmäßig;
und der hostdb_usr
kann nur alle Tabellen (und Views) lesen.
Als Superuser postgres
:
CREATE USER schma_admin WITH PASSWORD 'youwish';
-- CREATE USER schma_admin WITH PASSWORD 'youwish' CREATEDB CREATEROLE; -- see below
CREATE USER schma_mgr WITH PASSWORD 'youwish2';
CREATE USER schma_usr WITH PASSWORD 'youwish3';
Wenn Sie einen leistungsstärkeren Administrator wünschen, der auch Datenbanken und Rollen verwalten kann, fügen Sie die Rollenattribute CREATEDB
undCREATEROLE
höher hinzu.
Weisen Sie jede Rolle der nächsthöheren Ebene zu, sodass alle Ebenen mindestens die Berechtigungen der nächst niedrigeren Ebene "erben" (kaskadieren):
GRANT schma_usr TO schma_mgr;
GRANT schma_mgr TO schma_admin;
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public; -- see notes below!
GRANT CONNECT ON DATABASE hostdb TO schma_usr; -- others inherit
\connect hostdb -- psql syntax
Ich benenne das Schema schma
( hostdb
was nicht verwirrend wäre). Wähle einen beliebigen Namen. Optional macht schma_admin
den Besitzer des Schemas:
CREATE SCHEMA schma AUTHORIZATION schma_admin;
SET search_path = schma; -- see notes
ALTER ROLE schma_admin IN DATABASE hostdb SET search_path = schma; -- not inherited
ALTER ROLE schma_mgr IN DATABASE hostdb SET search_path = schma;
ALTER ROLE schma_usr IN DATABASE hostdb SET search_path = schma;
GRANT USAGE ON SCHEMA schma TO schma_usr;
GRANT CREATE ON SCHEMA schma TO schma_admin;
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT SELECT ON TABLES TO schma_usr; -- only read
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO schma_mgr; -- + write, TRUNCATE optional
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO schma_mgr; -- SELECT, UPDATE are optional
Für and drop and alter
siehe Hinweise unten.
Wenn die Dinge weiter fortgeschritten sind, werde ich auch Fragen haben, um ähnliche Einschränkungen für TRIGGERS
gespeicherte Prozeduren VIEWS
und möglicherweise andere Objekte anzuwenden .
Ansichten sind etwas Besonderes. Für einen:
... (Beachten Sie jedoch, dass ALL TABLES
Ansichten und Fremdtabellen berücksichtigt werden).
Und für aktualisierbare Ansichten :
Beachten Sie, dass der Benutzer, der das Einfügen, Aktualisieren oder Löschen in der Ansicht ausführt, über die entsprechenden Berechtigungen zum Einfügen, Aktualisieren oder Löschen in der Ansicht verfügen muss. Darüber hinaus muss der Eigentümer der Ansicht über die entsprechenden Berechtigungen für die zugrunde liegenden Basisbeziehungen verfügen, der Benutzer, der das Update ausführt, benötigt jedoch keine Berechtigungen für die zugrunde liegenden Basisbeziehungen (siehe
Abschnitt 38.5 ).
Trigger sind auch etwas Besonderes. Sie benötigen das TRIGGER
Privileg für den Tisch und:
Aber wir weiten den Umfang dieser Frage bereits übermäßig aus ...
Wichtige Notizen
Eigentum
Wenn Sie zulassen möchten schma_admin
(allein) fallen zu lassen und alte Tabellen machen die Rolle besitzt alle Objekte. Die Dokumentation:
Das Recht, ein Objekt zu löschen oder seine Definition in irgendeiner Weise zu ändern, wird nicht als gewährbares Privileg behandelt. Es ist dem Eigentümer inhärent und kann weder gewährt noch widerrufen werden. (Ein ähnlicher Effekt kann jedoch erzielt werden, indem die Mitgliedschaft in der Rolle, der das Objekt gehört, gewährt oder widerrufen wird (siehe unten). Der Eigentümer verfügt implizit auch über alle Berechtigungsoptionen für das Objekt.
ALTER TABLE some_tbl OWNER TO schma_admin;
Oder erstellen Sie zunächst alle Objekte mit der Rolleschma_admin
, dann müssen Sie den Eigentümer nicht explizit festlegen. Es vereinfacht auch Standardprivilegien, die Sie dann nur für die eine Rolle festlegen müssen:
Bereits vorhandene Objekte
Standardberechtigungen gelten nur für neu erstellte Objekte und nur für die bestimmte Rolle, mit der sie erstellt wurden. Sie möchten die Berechtigungen auch für vorhandene Objekte anpassen :
Gleiches gilt, wenn Sie Objekte mit einer Rolle erstellen, die nicht DEFAULT PRIVILEGES
festgelegt wurde, wie z postgres
. B. der Superuser . Umhängen Eigentum schma_admin
und Set Privilegien manuell - oder Set DEFAULT PRIVILEGES
für postgres
als auch (während auf der rechten Seite DB verbunden!):
ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ... -- etc.
Standardprivilegien
Ihnen fehlte ein wichtiger Aspekt des ALTER DEFAULT PRIVILEGES
Befehls. Dies gilt für die aktuelle Rolle, sofern nicht anders angegeben:
Standardberechtigungen gelten nur für die aktuelle Datenbank. Sie können sich also nicht mit anderen Datenbanken im DB-Cluster anlegen. Die Dokumentation:
für alle in der aktuellen Datenbank erstellten Objekte
Möglicherweise möchten Sie auch Standardberechtigungen für FUNCTIONS
und festlegen TYPES
(nicht nur TABLES
und SEQUENCES
), diese sind jedoch möglicherweise nicht erforderlich.
Standardprivilegien für PUBLIC
Standardprivilegien, die gewährt werden, PUBLIC
sind rudimentär und werden von einigen überschätzt. Die Dokumentation:
PostgreSQL gewährt Standardprivilegien für einige Objekttypen
PUBLIC
. Standardmäßig werden keine Berechtigungen PUBLIC
für Tabellen, Spalten, Schemas oder Tablespaces erteilt . Für andere Typen gelten die folgenden Standardberechtigungen PUBLIC
: CONNECT
und CREATE TEMP TABLE
für Datenbanken; EXECUTE
Privileg für Funktionen; und USAGE
Privileg für Sprachen.
Meine kühne Betonung. Normalerweise reicht der obige Befehl aus, um alles abzudecken:
REVOKE ALL ON DATABASE hostdb FROM public;
Insbesondere werden keine Standardberechtigungen PUBLIC
für neue Schemas erteilt . Es kann verwirrend sein, dass das Standardschema mit dem Namen "public" mit ALL
Berechtigungen für beginnt PUBLIC
. Dies ist nur eine praktische Funktion, um den Start mit neu erstellten Datenbanken zu erleichtern. Andere Schemata sind davon in keiner Weise betroffen. Sie können diese Berechtigungen in der Vorlagendatenbank widerrufen. template1
Dann werden alle neu erstellten Datenbanken in diesem Cluster ohne sie gestartet:
\connect template1
REVOKE ALL ON SCHEMA public FROM public;
Das Privileg TEMP
Da wir alle Berechtigungen hostdb
von aufgehoben haben PUBLIC
, können reguläre Benutzer nur dann temporäre Tabellen erstellen, wenn wir dies ausdrücklich zulassen. Möglicherweise möchten Sie Folgendes hinzufügen oder nicht:
GRANT TEMP ON DATABASE hostdb TO schma_mgr;
search_path
Vergessen Sie nicht, das einzustellen search_path
. Wenn Sie nur eine Datenbank im Cluster haben, können Sie einfach die globale Standardeinstellung festlegen postgresql.conf
. Andernfalls wird es (wahrscheinlicher) als Eigenschaft der Datenbank festgelegt oder nur für beteiligte Rollen oder sogar für die Kombination aus beiden. Einzelheiten:
Möglicherweise möchten Sie dies festlegen, schma, public
wenn Sie auch das öffentliche Schema verwenden, oder sogar (mit geringerer Wahrscheinlichkeit) $user, schma, public
...
Eine Alternative wäre die Verwendung des Standardschemas "public", das mit Standardeinstellungen für funktionieren sollte, search_path
sofern Sie dies nicht geändert haben. Denken Sie PUBLIC
in diesem Fall daran, die Berechtigungen für zu widerrufen .
verbunden
public
Pseudorolle. Man kann sich eine Rolle vorstellen, in der jede andere Rolle (Benutzer, Gruppe - alle sind gleich) Mitglied ist. Versuchen Sie, die Berechtigungen daraus zu entfernen, indem Sie beispielsweiseREVOKE CREATE ON SCHEMA hostdb FROM public
. Wenn Sie wie bisher Rechte auf Datenbankebene widerrufen, werden nur einige Berechtigungen auf Datenbankebene deaktiviert, ohne dass dies Auswirkungen auf Schemas oder Tabellen hat.