以前のブログでは、PostgreSQL 13のパーティションテーブルを使用した論理レプリケーションの新機能について説明しました。言うまでもなく、前述のリリースには、DBAとアプリケーションのエクスペリエンスをすぐに強化する機能が多数あります。開発者も同様です。
PostgreSQL 13を見ていると、注意を引いたエントリが見つかりました:
PostgreSQL 13では、「信頼できる拡張機能」の概念が導入されています。これにより、スーパーユーザーは、CREATE特権を持っている限り、ユーザーがデータベースにインストールできる拡張機能を指定できます。
PostgreSQLには、コアの多くを乱すことなく、キャップにフェザーを追加する拡張機能があることを私たちは知っています。言い換えると、拡張機能は、煩わしくない方法でPostgreSQLサーバーの機能を強化します。
実際、拡張メカニズムを使用してすばらしい機能セットを生成しているサードパーティ組織はたくさんあります。 TimescaleDBは、そのような拡張機能の1つであり、PostgreSQLサーバーのペルソナを変更してIOTワークロードにより適したものにします。
PostgreSQL 13の前に何があったのか、そしてなぜそれが本当に苦痛だったのかを見てみましょう。 2つの役割を含むホストされたPostgreSQLインスタンスについて考えてみます。
- postgres(スーパーユーザー)
- johnsmith(通常のユーザー)
John Smithは、postgres拡張機能hstoreをwooliedbに追加したいと考えています。これは、彼のアプリケーションコードがそれに依存しているためです。それをやってみましょう。
psql -U johnsmith -d wooliesdb
wooliesdb=>CREATE EXTENSION hstore;
ERROR: permission denied to create extension "hstore"
HINT: Must be superuser to create this extension.
エラーは、拡張機能がスーパーユーザー、つまりpostgresによってのみ作成できることを明確に示しています。 hstoreのような拡張機能は、その使用法に関してセキュリティ上の懸念はありませんが、データベースにこの拡張機能を作成できるのはスーパーユーザーだけです。
データベースがjohnsmithによって所有または作成された場合はどうなりますか?それも試すことができます。次のスニペットでは、postgresスーパーユーザーがjohnsmithに、自分で作成するまったく新しいデータベースを作成して遊んでもらうことを許可しています。
$ 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.
ああ!違いはありません。 johnsmithはjsDBの所有者ですが、データベースに関連する単純な拡張機能をインストールすることはできません。
しかし、それはすべてPostgreSQLサーバー12(およびそれ以下)にあります。 PostgreSQLバージョン13で変更される予定です。このブログを書いている時点で-PostgreSQLバージョン13はBeta2ステージにあり、チームはすでにリリースアナウンスを書いています。 Beta2バイナリで「信頼できる拡張機能」を試してみます。
PostgreSQL13が登場
信頼できる拡張機能(少なくともcontribモジュールまたは事前にパッケージ化された拡張機能)の概念で異なる動作を期待します。 PostgreSQL12で行ったのと同じコマンドについて、PostgreSQL13での動作を確認しましょう。
$ 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.
これはほとんど同じです。つまり、johnsmithはまだ拡張機能を作成できません。しかし、それでも微妙な違いがあります。CREATE特権が欠落していることを示唆するHINTです。 2番目のコマンドセットはそれを処理する必要があります:
$ 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)
postgres=# GRANT CREATE ON DATABASE postgres FOR johnsmith;
しかし、信頼できる拡張機能にはこれ以上のものがあります。別の拡張機能を作成してみましょう:
jsDB=> create extension file_fdw;
ERROR: permission denied to create extension "file_fdw"
HINT: Must be superuser to create this extension.
違いは、hstoreが信頼できるものとしてマークされているのに、file_fdwが信頼できるものとしてマークされていないという事実にあります。それはどこにマークされていますか?拡張機能の制御ファイルにあります。
$ cd /usr/pgsql-13/share/extension
$ grep -l trusted hstore.control file_fdw.control;
hstore.control
実際、postgreSQL13には24の信頼できる拡張機能と24のそれほど信頼できない拡張機能があります。
簡単に言うと、スーパーユーザーはそのような信頼できる拡張機能の制御を放棄できます。また、データベースに対するCREATE権限を持つユーザーは、データベース管理者に連絡することなく、信頼できる拡張機能を有効にできます。
舞台裏では、動作は拡張機能制御ファイルの2つのパラメータによって制御されます。
- スーパーユーザー、デフォルトはtrue
- トラステッド、デフォルトはfalse
拡張機能は、両方がtrueの場合にのみ、スーパーユーザー以外が作成できます。実際、信頼できる拡張機能とは、インストールまたは更新スクリプトが、呼び出し元のユーザーとしてではなく、ブートストラップのスーパーユーザーとして実行されることです。拡張機能は、それ自体が信頼されていない言語で記述されている可能性があることを忘れないでください。