Ich möchte eine relativ einfache, interne, datenbankgesteuerte Anwendung von SQLite3 auf PostgreSQL 9.3 migrieren und die Berechtigungen in der Datenbank nach und nach verschärfen.
Die Anwendung besteht derzeit aus einem Befehl zum Aktualisieren der Daten. und eine, um es abzufragen. Natürlich muss ich die Datenbank auch auf andere Weise pflegen (neue Tabellen, Ansichten, Trigger usw. erstellen).
Während diese Anwendung zunächst die einzige ist, die auf dem Server gehostet wird, gehe ich lieber davon aus, dass sie in Zukunft möglicherweise auf einem Server mit anderen Datenbanken gehostet wird, anstatt später verschlüsselt zu werden, wenn dies in erforderlich wird die Zukunft.
Ich würde denken, dass dies ein ziemlich häufiger Satz von Anforderungen ist, aber ich habe Probleme, ein einfaches Tutorial zu finden, in dem erklärt wird, wie eine neue Datenbank in PostgreSQL mit dieser Art der Trennung von Benutzern und Berechtigungen eingerichtet wird. Die Referenzen beziehen sich ausführlich auf Gruppen, Benutzer, Rollen, Datenbanken, Schemata und Domänen. aber ich finde sie verwirrend.
psql
Folgendes habe ich bisher ausprobiert (von innen als 'postgres'):
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;
\connect hostdb
CREATE SCHEMA hostdb;
CREATE USER hostdb_admin WITH PASSWORD 'youwish';
CREATE USER hostdb_mgr WITH PASSWORD 'youwish2';
CREATE USER hostdb_usr WITH PASSWORD 'youwish3';
GRANT ALL PRIVILEGES ON DATABASE hostdb TO hostdb_admin;
GRANT CONNECT ON DATABASE hostdb TO hostdb_mgr, hostdb_usr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO hostdb_mgr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT ON TABLES TO hostdb_usr;
Aber ich bekomme nicht die beabsichtigte Semantik. 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 ich das versuchte, stellte ich fest, dass ich Tabellen in hostdb
jedem dieser Benutzer erstellen konnte . Ich konnte jedoch für jeden Benutzer nur die von diesem Benutzer erstellten Tabellen lesen oder ändern - es sei denn, ich verwende eine explizite GRANT
.
Ich vermute, dass zwischen CREATE DATABASE
und etwas fehlt CREATE SCHEMA
, um das SCHEMA
auf das anzuwenden DATABASE
?
(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 .)
Wo finde ich eine anständige Anleitung, ein Tutorial oder eine Videoserie dazu?
quelle
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.public
mit Berechtigungen für vorPUBLIC
. Ansonsten gibt es keine Standardberechtigungen für neue Schemas. Dies hat also keinen Einfluss auf den demonstrierten Anwendungsfall. Siehe das Kapitel in meiner Antwort.Antworten:
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
Als Superuser
postgres
: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):
Ich benenne das Schema
schma
(hostdb
was nicht verwirrend wäre). Wähle einen beliebigen Namen. Optional machtschma_admin
den Besitzer des Schemas:Für
and drop and alter
siehe Hinweise unten.Ansichten sind etwas Besonderes. Für einen:
Und für aktualisierbare Ansichten :
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:Oder erstellen Sie zunächst alle Objekte mit der Rolle
schma_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 zpostgres
. B. der Superuser . Umhängen Eigentumschma_admin
und Set Privilegien manuell - oder SetDEFAULT PRIVILEGES
fürpostgres
als auch (während auf der rechten Seite DB verbunden!):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:
Möglicherweise möchten Sie auch Standardberechtigungen für
FUNCTIONS
und festlegenTYPES
(nicht nurTABLES
undSEQUENCES
), 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:Meine kühne Betonung. Normalerweise reicht der obige Befehl aus, um alles abzudecken:
Insbesondere werden keine Standardberechtigungen
PUBLIC
für neue Schemas erteilt . Es kann verwirrend sein, dass das Standardschema mit dem Namen "public" mitALL
Berechtigungen für beginntPUBLIC
. 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:Das Privileg
TEMP
Da wir alle Berechtigungen
hostdb
von aufgehoben habenPUBLIC
, 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:search_path
Vergessen Sie nicht, das einzustellen
search_path
. Wenn Sie nur eine Datenbank im Cluster haben, können Sie einfach die globale Standardeinstellung festlegenpostgresql.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 SiePUBLIC
in diesem Fall daran, die Berechtigungen für zu widerrufen .verbunden
quelle
this
sieht aus wie Anweisung für Raumschiff ...