Wie kann ich in PostgreSQL schreibgeschützte Benutzer für Backups erstellen?

15

Stimmt es, dass es UNMÖGLICH ist, einen schreibgeschützten Sicherungsbenutzer in PostgreSQL zu erstellen?

Ich wurde in einem IRC-Kanal darauf hingewiesen, dass Sie einfach keinen Benutzer haben können, der nur Sicherungskopien erstellt und keine Eigentumsrechte besitzt. Ich finde es sehr seltsam, deshalb möchte ich sicherstellen, dass mir nichts entgeht.

Im Folgenden habe ich versucht, aber es gibt mir nicht die Ergebnisse, die ich suche. Wenn ich pg_dumpan einem bestimmten Tisch tue, bekomme ich Permission denied for relation...:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup; 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO backup;

Jede Hilfe wäre sehr dankbar!

gyre
quelle

Antworten:

9

Nein, es ist einfach (jetzt sowieso).

  1. Erteilen Sie die Verbindungsberechtigung für einen neuen Benutzer

    GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
  2. Gewähren Sie die Berechtigungen für alle aktuellen Datenbankobjekte. Dies ist schemaspezifisch und Sie müssen eine Kopie für jedes Schema ausführen, das Ihr Benutzer verwenden soll.

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;

    Von der Dokumentation , ALL TABLESenthält alles , was man sich wünschen kann .

    Es besteht auch die Möglichkeit, Berechtigungen für alle Objekte desselben Typs innerhalb eines oder mehrerer Schemas zu erteilen. Diese Funktionalität wird derzeit nur für Tabellen, Sequenzen und Funktionen unterstützt (beachten Sie jedoch, dass ALLE TABELLEN Sichten und fremde Tabellen enthalten.

  3. Dann ALTER DEFAULT PRIVLEGESzu gewähren Zukunft SELECT Privilegien für Objekte noch nicht erstellt.

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;
Evan Carroll
quelle
Ich bemerkte , dass beim Laufen ALTER DEFAULT PRIVILEGES ... myReadonlyUser, 2 zusätzliche Leitungen zur Deponie hinzugefügt werden: ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM root;. Klingt so, bedeutet dies, dass root an neuen Tabellen nichts mehr tun kann. Ist das wahr?
Donnerstag,
Wenn Ihre Tabellen bigintschreibgeschützt sind, wird dies wahrscheinlich auch erforderlich seinGRANT SELECT ON ALL SEQUENCES
am
6

Die einfache und nützliche Möglichkeit besteht darin, einen Superuser mit Leseberechtigung zu erstellen.

  • Einloggen psqlals Postgres oder andere Super - User.
  • Erstellen Sie die neue Superuser-Rolle, und legen Sie sie als schreibgeschützt fest:

    CREATE USER backadm SUPERUSER  password '<PASS>';
    ALTER USER backadm set default_transaction_read_only = on;
    • Ersetzen Sie <PASS>durch Ihr gewähltes Passwort.
    • Sie können backadmdurch den gewählten Benutzernamen ersetzen . (Ich stelle backadmfür Backup Administrator).
    • Vergessen Sie NICHT die einfachen Anführungszeichen für das Passwort.

Sie können diese Rolle jetzt zum Sichern verwenden.

Rémi B.
quelle
6
Ewww. Ein Superuser zum Sichern? Er bat ausdrücklich nur um Lesen. Dieser Benutzer ist ein SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITEoder ALTER USER backadm set default_transaction_read_only = off;weg uneingeschränkten Zugriff auf die Datenbank von mit.
Evan Carroll
Dieser Benutzer kann weiterhin Tabellen / Schemas / Datenbanken löschen, unabhängig davon, ob die Transaktionen schreibgeschützt sind.
Igor Mukhin
4

Beachten Sie, dass das Blog, auf das in der Antwort von @Gyre verwiesen wird, nicht zum Erstellen eines schreibgeschützten Benutzers "application" (dh zum Erstellen einer schreibgeschützten Rolle für eine Webanwendung zum Herstellen einer Verbindung mit der Datenbank) geeignet ist und möglicherweise ein ernstes Problem darstellt Sicherheitslücke, da sie leicht zu umgehen ist, wie in dieser Antwort auf die Postgresql-Liste erläutert . Zum Nachschlagen, indem der Client die Sitzungseinstellungen überschreibt:

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

Siehe ‚Verwalten Rechte in postgresql‘ Präsentation in dem Postgres verknüpft Wiki für ein detailliertere Verfahren, ähnlich der in der Frage gepostet.

Sundar
quelle
Dies ist nicht wirklich eine Antwort, es ist eine Kritik an den anderen Antworten für Unsicherheit, die ich als Kommentar kopiert habe. Ich habe diese Frage jetzt richtig beantwortet.
Evan Carroll
3

Nach dem Testen eines Backups mit der Lösung von Evan Caroll bin ich auf folgenden Fehler gestoßen:

FEHLER: Berechtigung für Relation 'Tabelle' verweigert

Es fehlt eine weitere Berechtigung:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser

Durch das Hinzufügen dieser Berechtigung konnte ich mit meinem schreibgeschützten Benutzer eine Sicherungskopie erstellen.

Jean-François Godbout
quelle
2

Ich habe ordentlich recherchiert und es scheint eine Lösung dafür zu geben. Ich bin auf diesen Blog-Beitrag gestoßen, der perfekt erklärt, was getan werden muss. Ich hoffe, das hilft Leuten, die nach der gleichen Antwort suchen wie ich. Offensichtlich ist das Wiederherstellen der Backups auf diese Weise eine andere Frage.

gyre
quelle
Anstatt einfach auf den Blog-Post zu verlinken, sollten Sie Ihrer Antwort einige Details hinzufügen, falls der Blog-Post unter Link-Rot leidet (siehe de.wikipedia.org/wiki/Link_rot )
Max Vernon
Die Grundidee des Blogposts ist ALTER USER set default_transaction_read_only = on;, dass der Benutzer nicht daran gehindert wird , ihn zu ändern.
blueyed
Ewww. Ein Superuser zum Sichern? Er bat ausdrücklich nur um Lesen. Dieser Benutzer ist ein SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE oder ALTER USER. Backadm set default_transaction_read_only = off; keinen uneingeschränkten Zugriff auf die Datenbank haben.
Evan Carroll