Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kompira データベースに pgcrypto エクステンションを有効化するための要件について補足説明を加える #49

Open
tichi73 opened this issue Aug 23, 2024 · 0 comments

Comments

@tichi73
Copy link
Contributor

tichi73 commented Aug 23, 2024

パスワードフィールドの暗号化に必要な pgcrypto について、「拡張モジュール pgcrypto がインストールされていること」という記載があるが、この説明では不十分な場合がある。

正確には、以下の2段階が必要になります。

  • 拡張モジュール pgcrypto がインストールされていること(サーバに postgresql-contrib パッケージがインストールされていること)
  • kompira データベースで pgcrypto エクステンションが読み込まれていること(CREATE EXTENSION pgcrypto されていること)

このうち、後者については、kengine 起動時のデータベース初期化(manage.py migrate)に内部で自動的に試行されますが、この成否が postgresql のバージョン(および拡張モジュールの設定)に依存するようです。

pgsql-13 以降ではエクステンションに trusted マークというのが導入されていて、trusted=true とマークされたエクステンションについては、スーパーユーザでなくてもデータベースの所有者であれば当該エクステンションを読み込むことができます。

https://www.postgresql.jp/document/13/html/sql-createextension.html

拡張の読み込みでは、通常その要素オブジェクトを作成するために必要となるいくつかの権限が必要です。 多くの拡張では、これはスーパーユーザの権限が必要であることを意味します。 しかしながら、制御ファイルでtrustedと印付けされた拡張は、現在のデータベースに対してCREATE権限を持つユーザであれば誰でもインストールできます。

postgresql13-contrib-13.16 でインストールされた pgcrypto については tusted=true となっているようです。

# grep trusted /usr/pgsql-13/share/extension/*.control
/usr/pgsql-13/share/extension/btree_gin.control:trusted = true
/usr/pgsql-13/share/extension/btree_gist.control:trusted = true
/usr/pgsql-13/share/extension/citext.control:trusted = true
/usr/pgsql-13/share/extension/cube.control:trusted = true
/usr/pgsql-13/share/extension/dict_int.control:trusted = true
/usr/pgsql-13/share/extension/fuzzystrmatch.control:trusted = true
/usr/pgsql-13/share/extension/hstore.control:trusted = true
/usr/pgsql-13/share/extension/intarray.control:trusted = true
/usr/pgsql-13/share/extension/isn.control:trusted = true
/usr/pgsql-13/share/extension/jsonb_plperl.control:trusted = true
/usr/pgsql-13/share/extension/lo.control:trusted = true
/usr/pgsql-13/share/extension/ltree.control:trusted = true
/usr/pgsql-13/share/extension/pg_trgm.control:trusted = true
/usr/pgsql-13/share/extension/pgcrypto.control:trusted = true  ★
/usr/pgsql-13/share/extension/plpgsql.control:trusted = true
/usr/pgsql-13/share/extension/seg.control:trusted = true
/usr/pgsql-13/share/extension/tablefunc.control:trusted = true
/usr/pgsql-13/share/extension/tcn.control:trusted = true
/usr/pgsql-13/share/extension/tsm_system_rows.control:trusted = true
/usr/pgsql-13/share/extension/tsm_system_time.control:trusted = true
/usr/pgsql-13/share/extension/unaccent.control:trusted = true
/usr/pgsql-13/share/extension/uuid-ossp.control:trusted = true

pgsql-13 では実際にスーパユーザでなくても、データベースの所有者であれば pgcrypto の読み込みができることを確認しています。

しかし、pgsql-12 には、この trusted という仕組みはまだ導入されていないようで、また、マニュアルには「ほとんどの拡張で、これはスーパーユーザもしくはデータベース所有者の権限が必要であることを意味します。」という記載がありますが、実際に試すとスーパユーザでないとエラーになることが確認されています。

[root@localhost ~]# psql -U kompira test_db -c "CREATE EXTENSION pgcrypto;"
ERROR:  permission denied to create extension "pgcrypto"
HINT:  Must be superuser to create this extension.

このように pgsql-12 の場合を想定すると、「拡張モジュール pgcrypto がインストールされていること」という表現だけでは pgcrypto の読み込みでエラーになり、kengine の起動失敗に繋がる可能性があります。

すこし冗長ですが、以下のような補足説明が必要かと思われます。

  • pgsql-12 の場合、以下のいずれかを満たすように準備してください。
    • kompira 用ユーザにスーパユーザ権限を与えておいてください
    • スーパユーザ権限をもつユーザで kompira 用データベースに事前に pgcrypto エクステンションを読み込んでおいてください
  • pgsql-13 以上の場合、以下のいずれかを満たすように準備してください。
    • kompira 用ユーザにスーパユーザ権限を与えておいてください
    • kompira 用データベースを、所有者を kompira ユーザとして作成しておいてください
    • 必要な権限をもつユーザで kompira 用データベースに事前に pgcrypto エクステンションを読み込んでおいてください

※ pgsql-13 以上であってもインストールされている pgcrypto 拡張モジュールが trusted マークされていない場合は、pgsql-12 と同じ準備が必要になると考えられます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant