Postgresql ermöglicht Erweiterungen ohne Superuser

11

Ich habe einen PostgreSQL 9.5-Server, auf dem ich Skripte habe, die automatisch Rollen und Datenbanken für Benutzer erstellen. Innerhalb dieser Datenbanken wäre es hilfreich, bestimmte Erweiterungen (z. B. pgcrypto) zu aktivieren, aber so wie ich es verstehe, muss man ein Superuser sein, um ausgeführt zu werden CREATE EXTENSION. Gibt es eine Möglichkeit, solche Erweiterungen zu aktivieren, ohne sich manuell mit einem Superuser-Konto anzumelden?

beldaz
quelle
4
Haben Sie versucht , das Hinzufügen sie template1und dann jede Benutzerdatenbank Erstellen von template1wie CREATE DATABASE foo OWNER=userfoo TEMPLATE=template1?
Kassandry
1
@ Kassandry hatte nicht daran gedacht, ist aber ein guter Gedanke. Idealerweise möchte ich, dass die Eigentümer die Erweiterung hinzufügen können, wenn sie dies wünschen, aber dies ist immer noch eine akzeptable Möglichkeit.
Beldaz

Antworten:

10

Aus den Dokumenten zu Erweiterungen,

Superuser (boolean) Wenn dieser Parameter true ist (dies ist die Standardeinstellung), können nur Superuser die Erweiterung erstellen oder auf eine neue Version aktualisieren. Wenn false festgelegt ist, sind nur die Berechtigungen erforderlich, die zum Ausführen der Befehle im Installations- oder Aktualisierungsskript erforderlich sind.

Der Wert ist nicht festgelegt pgcrypto.control, daher ist er standardmäßig true, was einen SuperUser erfordert.

Dies bedeutet, dass Sie nicht CREATE EXTENSIONnur Eigentümer der Datenbank sein können, obwohl die Dokumente zu CREATE EXTENSION Sie zu der Annahme veranlassen.

Ich bemühte mich, es einzustellen false, und keine Freude. C ist eine nicht vertrauenswürdige Sprache und Sie werden bekommen

FEHLER: Erlaubnis für Sprache verweigert c

Aus den Dokumenten auf pg_language

Nur Superuser können Funktionen in nicht vertrauenswürdigen Sprachen erstellen.

... natürlich können Sie sich als Superuser cvertrauen lassen UPDATE pg_language set lanpltrusted = true where lanname = 'c';. Dann CREATE EXTENSION pgcryptofunktioniert es gut als Nicht-Superuser. Das klingt jedoch nach einer schlechten Idee, wenn Sie sich Sorgen machen müssen, dass Ihre Benutzer die Quelle in Ihr Erweiterungsverzeichnis hochladen und dann in der Datenbank installieren. Das heißt, ich würde nicht so weit gehen. Ich würde einen anderen Weg finden, diese Katze zu häuten.

Evan Carroll
quelle
Danke Evan, das ist eine so gründliche Antwort, wie ich sie mir nur wünschen kann. Ich werde mich wahrscheinlich für @ Kassandrys Vorschlag zum Enthäuten von Katzen entscheiden, um dies zu umgehen. Ich habe auch darüber nachgedacht, die CREATE EXTENSION in eine gespeicherte Prozedur zu verpacken, konnte aber keinen Weg finden, um dies in derselben Datenbank ohne Dblink-Authentifizierung zum Laufen zu bringen.
Beldaz
Was pg_dumpbringt es also, keine Option zu haben, um zu verhindern, dass Anweisungen zu Erweiterungen ausgegeben werden? Ich muss derzeit externe Textverarbeitungstools verwenden, um diese Anweisungen aus dem von ausgegebenen SQL zu entfernen pg_dump.
Claudix
@Evan Carroll: Ist es möglich, den Superuser über psql cli auf false zu setzen? Ich habe eine Instanz auf amazon aws rds und habe keinen Zugriff auf pgcrypto.control.
Ribamar
2
@ribamar nein, da dies bedeuten würde, dass jeder, der mit der Datenbank verbunden ist, eine wörtliche Ausführung von willkürlichem Code als DB-Postmaster ausführen könnte. das wäre eine schreckliche idee.
Evan Carroll
nicht jemand, der Superuser. Ich verstehe, dass Sie auf diese Weise das Betriebssystem super vom dbms super user unterscheiden, obwohl ich, wenn ich eine solche Entscheidung treffen würde, das Tool aktivieren würde und wenn ich wirklich einen weiteren leistungsstärkeren Benutzer erstellen müsste, würde ich es implementieren im Werkzeug.
Ribamar