In meinem vorherigen Blog haben wir neue Möglichkeiten der logischen Replikation mit Partitionstabellen in PostgreSQL 13 untersucht. Unnötig zu erwähnen, dass es in der erwähnten Version eine Vielzahl solcher Funktionen gibt, die bald die Erfahrung für DBA und Anwendung verbessern werden Entwickler gleichermaßen.
Beim Betrachten von PostgreSQL 13 ist mir ein Eintrag aufgefallen, der meine Aufmerksamkeit erregt hat:
PostgreSQL 13 führt das Konzept einer "vertrauenswürdigen Erweiterung" ein, die es einem Superuser ermöglicht, Erweiterungen anzugeben, die ein Benutzer in seiner Datenbank installieren kann, solange er über ein CREATE-Privileg verfügt.
Lassen Sie uns zurückspulen
Wir wissen, dass PostgreSQL über Erweiterungsmöglichkeiten verfügt, um seiner Kappe Federn hinzuzufügen, ohne viel von seinem Kern zu stören. Mit anderen Worten, Erweiterungen verbessern die funktionalen Fähigkeiten von PostgreSQL Server auf nicht-intrusive Weise.
Tatsächlich gibt es viele Drittorganisationen, die den Erweiterungsmechanismus verwendet haben, um erstaunliche Feature-Sets zu generieren. TimescaleDB ist eine solche Erweiterung, bei der die Persona von PostgreSQL Server verändert wird, um ihn besser für IoT-Workloads geeignet zu machen.
Lassen Sie uns einen Blick darauf werfen, was es vor PostgreSQL 13 gab und warum es wirklich mühsam war. Betrachten Sie eine gehostete PostgreSQL-Instanz mit zwei Rollen:
- postgres (der Superuser)
- johnsmith (ein normaler Benutzer)
Und die Datenbank wooliesdb.
John Smith würde gerne die Postgres-Erweiterung hstore zu wooliedb hinzufügen, da sein Anwendungscode darauf angewiesen ist. Versuchen wir das.
psql -U johnsmith -d wooliesdb
wooliesdb=>CREATE EXTENSION hstore;
ERROR: permission denied to create extension "hstore"
HINT: Must be superuser to create this extension.
Der Fehler weist eindeutig darauf hin, dass die Erweiterung nur vom Superuser, d. h. postgres, erstellt werden kann. Auch wenn Erweiterungen wie hstore im Zusammenhang mit ihrer Verwendung keine Sicherheitsbedenken haben, können immer noch nur Superuser diese Erweiterung in der Datenbank erstellen.
Was wäre, wenn die Datenbank Johnsmith gehörte oder von ihm erstellt wurde - wir können das auch versuchen. Im folgenden Snippet erlaubt der Postgres-Superuser Johnsmith, eine völlig neue eigene Datenbank zum Herumspielen zu erstellen:
$ psql -U postgres
postgres=# ALTER ROLE johnsmith CREATEDB;
postgres=# \q
$ psql -U johnsmith -d wooliesdb
wooliesdb=>CREATE DATABASE jsDB;
wooliesdb=>\c jsDB;
You are now connected to database "jsDB" as user "johnsmith".
jsDB=>CREATE EXTENSION hstore;
ERROR: permission denied to create extension "hstore"
HINT: Must be superuser to create this extension.
Aha! Es macht keinen Unterschied. Obwohl Johnsmith der Eigentümer von jsDB ist, kann er immer noch keine relevanten, einfachen Erweiterungen in seiner Datenbank installieren.
Aber das ist alles in PostgreSQL-Server 12 (und niedriger); es wird sich mit PostgreSQL Version 13 ändern. Zum Zeitpunkt der Erstellung dieses Blogs befindet sich PostgreSQL Version 13 in der Beta2-Phase und das Team schreibt bereits eine Release-Ankündigung. Ich werde „vertrauenswürdige Erweiterungen“ mit Beta2-Binärdateien ausprobieren.
Hier kommt PostgreSQL 13
Erwarten Sie ein anderes Verhalten mit dem Konzept der vertrauenswürdigen Erweiterungen (zumindest für Contrib-Module oder vorgefertigte Erweiterungen). Lassen Sie uns das Verhalten mit PostgreSQL13 für dieselben Befehle überprüfen, die wir für PostgreSQL12 ausgeführt haben.
$ psql -U johnsmith -d wooliesdb
wooliesdb=>CREATE EXTENSION hstore;
ERROR: permission denied to create extension "hstore"
HINT: Must have CREATE privilege on current database to create this extension.
Was ziemlich dasselbe ist, d.h. johnsmith kann die Erweiterung immer noch nicht erstellen. Aber es gibt immer noch einen feinen Unterschied - den Hinweis, der darauf hindeutet, dass das CREATE-Privileg fehlt. Unser zweiter Befehlssatz sollte sich darum kümmern:
$ psql -U postgres
postgres=# ALTER ROLE johnsmith CREATEDB;
postgres=# \q
$ psql -U johnsmith -d wooliesdb
wooliesdb=>CREATE DATABASE jsDB;
wooliesdb=>\c jsDB;
You are now connected to database "jsDB" as user "johnsmith".
jsDB=>CREATE EXTENSION hstore;
jsDB=>SELECT extname from pg_extension;
extname
---------
plpgsql
hstore
(2 rows)
Die Dinge haben diesmal wirklich funktioniert. Der Superuser kann dieselben Berechtigungen für die Postgres-Datenbank gewähren, indem er den folgenden Befehl ausführt:
postgres=# GRANT CREATE ON DATABASE postgres FOR johnsmith;
Aber eine vertrauenswürdige Erweiterung hat noch mehr zu bieten, versuchen wir, eine andere Erweiterung zu erstellen:
jsDB=> create extension file_fdw;
ERROR: permission denied to create extension "file_fdw"
HINT: Must be superuser to create this extension.
Der Unterschied ergibt sich aus der Tatsache, dass hstore zwar als vertrauenswürdig markiert ist, file_fdw jedoch NICHT als vertrauenswürdig markiert ist. Wo ist das markiert? Es befindet sich in der Steuerdatei der Erweiterungen.
$ cd /usr/pgsql-13/share/extension
$ grep -l trusted hstore.control file_fdw.control;
hstore.control
Tatsächlich gibt es 24 vertrauenswürdige und 24 nicht so vertrauenswürdige Erweiterungen, die mit postgreSQL13 geliefert werden.
Kurz gesagt, Superuser können die Kontrolle über solche vertrauenswürdigen Erweiterungen abgeben; und jeder Benutzer mit CREATE-Berechtigungen für eine Datenbank kann vertrauenswürdige Erweiterungen aktivieren, ohne sich an seinen Datenbankadministrator wenden zu müssen.
Fazit
Hinter den Kulissen wird das Verhalten durch zwei Parameter in der Erweiterungssteuerdatei gesteuert:
- Superuser, der standardmäßig auf „true“ gesetzt ist
- trusted, was standardmäßig false ist
Eine Erweiterung kann nur dann von einem Nicht-Superuser erstellt werden, wenn beide wahr sind. Tatsächlich ist eine vertrauenswürdige Erweiterung das Installations- oder Aktualisierungsskript, das als Bootstrap-Superuser und nicht als aufrufender Benutzer ausgeführt wird. Denken Sie daran, dass Erweiterungen möglicherweise in einer Sprache geschrieben sind, die selbst nicht vertrauenswürdig ist - daher die Notwendigkeit.