I min förra blogg utforskade vi nya funktioner för logisk replikering med partitionstabeller i PostgreSQL 13. Det behöver inte sägas att det finns många sådana funktioner i den nämnda versionen som snart kommer att förbättra upplevelsen för DBA och applikationer utvecklare likadana.
När jag tittade på PostgreSQL 13 såg jag ett inlägg som fångade min uppmärksamhet:
PostgreSQL 13 introducerar konceptet med en "betrodd tillägg", som gör det möjligt för en superanvändare att specificera tillägg som en användare kan installera i sin databas så länge de har en CREATE-behörighet.
Låt oss spola tillbaka
Vi vet att PostgreSQL har förlängningskraft för att lägga till fjädrar till locket utan att störa mycket av dess kärna. Med andra ord, tillägg förbättrar funktionella möjligheter till PostgreSQL Server på ett icke-påträngande sätt.
Det finns faktiskt många tredjepartsorganisationer som har använt tilläggsmekanismer för att skapa fantastiska funktioner. TimescaleDB är en sådan förlängning där den på ett sätt förändrar personligheten hos PostgreSQL Server för att göra den mer lämpad för IOT-arbetsbelastning.
Låt oss ta en titt på vad som fanns före PostgreSQL 13 och varför det var jobbigt. Överväg en värd PostgreSQL-instans som innehåller två roller:
- postgres (superanvändaren)
- johnsmith (en normal användare)
Och databasen wooliesdb.
John Smith skulle vilja lägga till postgres-tillägget hstore till wooliedb, eftersom hans applikationskod förlitar sig på det. Låt oss försöka göra det.
psql -U johnsmith -d wooliesdb
wooliesdb=>CREATE EXTENSION hstore;
ERROR: permission denied to create extension "hstore"
HINT: Must be superuser to create this extension.
Felet indikerar tydligt att tillägget endast kan skapas av superanvändare, dvs postgres. Även om tillägg som hstore inte har några säkerhetsproblem när det gäller användningen, är det fortfarande bara superanvändare som kan skapa detta tillägg i databasen.
Tänk om databasen ägdes eller skapades av johnsmith - det kan vi också prova. I följande utdrag låter postgres superuser johnsmith skapa en helt ny egen databas att leka med:
$ 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.
Ahh! Det gör ingen skillnad. Även om johnsmith är ägare till jsDB, kan han fortfarande inte installera relevanta, enkla tillägg till sin databas.
Men det är allt i PostgreSQL-server 12 (och nedan); det kommer att förändras med PostgreSQL version 13. När denna blogg skrivs - PostgreSQL version 13 är i Beta2-stadiet och teamet skriver redan ett releasemeddelande. Jag ska prova "trusted extensions" med Beta2-binärer.
Här kommer PostgreSQL 13
Förvänta ett annat beteende med konceptet betrodda tillägg (åtminstone för bidragsmoduler eller färdigpaketerade tillägg). Låt oss kontrollera beteendet med PostgreSQL13 för samma kommandon som vi gjorde för PostgreSQL12.
$ 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.
Vilket är ungefär detsamma, dvs. johnsmith kan fortfarande inte skapa tillägget. Men det finns fortfarande en subtil skillnad - TIPS som tyder på att CREATE-privilegiet saknas. Vår andra uppsättning kommandon bör ta hand om det:
$ 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)
Saker och ting fungerade verkligen den här gången. Superanvändare kan tillåta samma privilegier på postgres db genom att utföra följande kommando:
postgres=# GRANT CREATE ON DATABASE postgres FOR johnsmith;
Men det finns mer med betrodd tillägg än detta, låt oss försöka skapa ett annat tillägg:
jsDB=> create extension file_fdw;
ERROR: permission denied to create extension "file_fdw"
HINT: Must be superuser to create this extension.
Skillnaden kommer från det faktum att medan hstore är markerat som pålitligt, så är file_fdw INTE markerat som pålitligt. Var är det markerat? Det finns i kontrollfilen för tilläggen.
$ cd /usr/pgsql-13/share/extension
$ grep -l trusted hstore.control file_fdw.control;
hstore.control
Faktum är att det finns 24 betrodda och 24 inte så betrodda tillägg som kommer med postgreSQL13.
I ett nötskal, superanvändare kan avstå från kontrollen över sådana betrodda tillägg; och alla användare med CREATE-behörigheterna på en databas kan aktivera betrodda tillägg utan att kontakta sin databasadministratör.
Slutsats
Bakom kulisserna styrs beteendet av två parametrar i tilläggskontrollfilen:
- superanvändare, som som standard är sant
- tillförlitlig, vilket som standard är falskt
En tillägg kan endast skapas av en icke-superanvändare om båda är sanna. Faktum är att ett pålitligt tillägg är att installations- eller uppdateringsskriptet körs som bootstraps superanvändare, inte som den anropande användaren. Kom ihåg att tillägg kan vara skrivna på ett språk som i sig inte är betrodd - därav behovet.