V mém předchozím blogu jsme prozkoumali nové možnosti logické replikace s tabulkami oddílů v PostgreSQL 13. Netřeba dodávat, že ve zmíněné verzi existuje velké množství takových funkcí, které brzy rozšíří možnosti pro DBA a aplikace vývojáři podobně.
Při prohlížení PostgreSQL 13 jsem si všiml záznamu, který upoutal mou pozornost:
PostgreSQL 13 zavádí koncept "důvěryhodného rozšíření", které umožňuje superuživateli specifikovat rozšíření, která si uživatel může nainstalovat do své databáze, pokud má oprávnění CREATE.
Přetočíme se zpět
Víme, že PostgreSQL má rozšiřující schopnost přidat pírka k jeho čepici, aniž by narušil většinu jeho jádra. Jinými slovy, rozšíření zlepšují funkční schopnosti PostgreSQL Serveru nerušivým způsobem.
Ve skutečnosti existuje mnoho organizací třetích stran, které používají mechanismus rozšíření k vytvoření úžasných sad funkcí. TimescaleDB je jedním z takových rozšíření, kde určitým způsobem mění osobnost PostgreSQL Serveru, aby byl vhodnější pro zátěž IOT.
Pojďme se podívat na to, co bylo před PostgreSQL 13 a proč to byla skutečná bolest. Zvažte hostovanou instanci PostgreSQL obsahující dvě role:
- postgres (super uživatel)
- johnsmith (normální uživatel)
A databáze wooliesdb.
John Smith by rád přidal rozšíření postgres hstore do wooliedb, protože jeho aplikační kód na tom spoléhá. Zkusme to udělat.
psql -U johnsmith -d wooliesdb
wooliesdb=>CREATE EXTENSION hstore;
ERROR: permission denied to create extension "hstore"
HINT: Must be superuser to create this extension.
Chyba jasně naznačuje, že rozšíření může vytvořit pouze super uživatel, tj. postgres. Přestože rozšíření jako hstore nemají v souvislosti s jejich používáním žádné bezpečnostní obavy, toto rozšíření mohou v databázi vytvořit pouze super uživatelé.
Co kdyby databázi vlastnil nebo vytvořil johnsmith – to můžeme také zkusit. V následujícím úryvku postgres superuser umožňuje johnsmithovi vytvořit úplně novou vlastní databázi, aby si mohl hrát:
$ 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.
Ach! Nedělá to žádný rozdíl. I když je johnsmith vlastníkem jsDB, stále nemůže nainstalovat relevantní jednoduchá rozšíření do své databáze.
To je ale vše na serveru PostgreSQL 12 (a níže); to se změní s PostgreSQL verze 13. V době psaní tohoto blogu - PostgreSQL verze 13 je ve fázi Beta2 a tým již píše oznámení o vydání. Vyzkouším „důvěryhodná rozšíření“ s binárními soubory Beta2.
Tady přichází PostgreSQL 13
Očekávejte jiné chování s konceptem důvěryhodných rozšíření (alespoň pro moduly contrib nebo předem zabalená rozšíření). Pojďme zkontrolovat chování s PostgreSQL13 pro stejné příkazy, které jsme udělali pro 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.
Což je v podstatě to samé, tj. johnsmith stále nemůže rozšíření vytvořit. Ale stále je tu jemný rozdíl - HINT, který naznačuje, že chybí oprávnění CREATE. Naše druhá sada příkazů by se o to měla postarat:
$ 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)
Tentokrát to opravdu fungovalo. Superuser může povolit stejná oprávnění na postgres db provedením následujícího příkazu:
postgres=# GRANT CREATE ON DATABASE postgres FOR johnsmith;
Důvěryhodné rozšíření však obsahuje více než toto, zkusme vytvořit další rozšíření:
jsDB=> create extension file_fdw;
ERROR: permission denied to create extension "file_fdw"
HINT: Must be superuser to create this extension.
Rozdíl pochází ze skutečnosti, že zatímco hstore je označen jako důvěryhodný, file_fdw NENÍ označen jako důvěryhodný. Kde je to označeno? Nachází se v řídicím souboru přípon.
$ cd /usr/pgsql-13/share/extension
$ grep -l trusted hstore.control file_fdw.control;
hstore.control
Ve skutečnosti existuje 24 důvěryhodných a 24 méně důvěryhodných rozšíření, která přicházejí s postgreSQL13.
Stručně řečeno, superuživatelé se mohou vzdát kontroly nad takovými důvěryhodnými rozšířeními; a každý uživatel s oprávněním CREATE k databázi může povolit důvěryhodná rozšíření, aniž by se obrátil na svého správce databáze.
Závěr
Za scénou je chování řízeno dvěma parametry v řídicím souboru rozšíření:
- superuser, jehož výchozí hodnota je true
- důvěryhodné, výchozí hodnota je false
Rozšíření může vytvořit uživatel, který není superuživatelem, pouze pokud jsou oba pravdivé. Důvěryhodné rozšíření je ve skutečnosti instalační nebo aktualizační skript spuštěný jako superuživatel bootstrap, nikoli jako volající uživatel. Pamatujte, že rozšíření mohou být napsána v jazyce, který sám o sobě není důvěryhodný – proto je potřeba.