Amazon Web Services ブログ

New – Amazon Aurora と Amazon RDS での PostgreSQL 用の信頼できる言語拡張機能

PostgreSQLは、開発者向けの拡張可能な設計により、多くの企業や新興企業に好まれるオープンソースのリレーショナルデータベースとなっています。開発者がPostgreSQLを使用する理由の1つは、好みのプログラミング言語で拡張を構築することでデータベース機能を追加できることです。

Amazon Aurora PostgreSQL 互換エディションおよび PostgreSQL 用 Amazon リレーショナルデータベースサービスでは、すでに PostgreSQL 拡張機能をインストールして使用できます。Amazon Aurora と Amazon RDS では 85 以上の PostgreSQL エクステンションをサポートしています。たとえば、データベースアクティビティを記録するための PGAudit エクステンションなどです。多くのワークロードがこれらの拡張機能を使用していますが、お客様がPostgreSQLデータベースインスタンス用に選択した拡張機能を柔軟に構築して実行することを求めているという声を聞きました。

本日、PostgreSQL 拡張を構築するための新しいオープンソース開発キットである PostgreSQL 向けトラステッド言語拡張モジュール (pg_tle) の一般提供についてお知らせします。PostgreSQL 用の信頼できる言語拡張機能を使用すると、開発者は PostgreSQL 上で安全に動作する高性能な拡張を構築できます。

Trusted Language Extensions for PostgreSQL では、データベース管理者が拡張機能をインストールできるユーザーとその実行権限モデルを制御できるため、アプリケーション開発者は拡張機能が自分のニーズに合っていると判断したらすぐに新しい機能を提供できます。

信頼できる言語拡張を使用して構築を開始するには、JavaScript、Perl、PL/pgSQL などの信頼できる言語を使用できます。これらの信頼できる言語には、ファイルシステムへの直接アクセスを制限したり、望ましくない権限昇格を防止したりするなどの安全性があります。Amazon Aurora PostgreSQL 互換エディション 14.5 および Amazon RDS for PostgreSQL 14.5 以降のバージョンには、信頼できる言語で記述された拡張機能を簡単にインストールできます。

PostgreSQL 用の信頼できる言語拡張は、GitHub の Apache ライセンス 2.0 に基づいてライセンスされているオープンソースプロジェクトです。PostgreSQL の信頼できる言語拡張ロードマップに関するコメントや提案をしていただければ、このプロジェクトを複数のプログラミング言語でサポートすることなどにご協力ください。これをコミュニティとして行うことで、開発者がPostgreSQLの優れた部分を利用して拡張機能を構築しやすくなります。

それでは、PostgreSQL 用の信頼できる言語拡張を使用して、Amazon Aurora と Amazon RDS 用の新しい PostgreSQL 拡張を構築する方法を見てみましょう。

PostgreSQL 用の信頼できる言語拡張のセットアップ
pg_tle を Amazon Aurora または Amazon RDS for PostgreSQL で使用するには、PostgreSQL shared_preload_libraries 設定でpg_tle をロードするパラメータグループを設定する必要があります。Amazon RDS コンソールの左側のナビゲーションペインで [パラメータグループ] を選択し、[パラメータグループを作成] を選択して新しいパラメータグループを作成します。

パラメータグループファミリーで Amazon RDS for PostgreSQLでpostgres14 を選択し、グループ名で pg_tle を選択した後、作成を選択します。Amazon Aurora PostgreSQL と互換性のあるクラスターには aurora-postgresql14 を選択できます。

作成したpgtleパラメータグループを選択し、パラメータグループアクションドロップボックスメニューで編集します。検索ボックスで shared_preload_library を検索し、[パラメーターの編集] を選択できます。pg_tle などの任意の値を追加し、[変更を保存] を選択できます。

AWS コマンドラインインターフェイス (AWS CLI) でも同じジョブを実行できます。

$ aws rds create-db-parameter-group \
  --region us-east-1 \
  --db-parameter-group-name pgtle \
  --db-parameter-group-family aurora-postgresql14 \
  --description "pgtle group"

$ aws rds modify-db-parameter-group \
  --region us-east-1 \
  --db-parameter-group-name pgtle \
  --parameters "ParameterName=shared_preload_libraries,ParameterValue=pg_tle,ApplyMethod=pending-reboot"

これで、 pgtle パラメータグループを Amazon Aurora または Amazon RDS for PostgreSQL データベースに追加できるようになりました。testing-pgtle という名前のデータベースインスタンスがある場合は、以下のコマンドを使用して pgtle パラメータグループをデータベースインスタンスに追加できます。これにより、アクティブなインスタンスが再起動することに注意してください。

$ aws rds modify-db-instance\
  --region us-east-1 \
  --db-instance-identifier testing-pgtle \
  --db-parameter-group-name pgtle-pg \
  --apply-immediately

pg_tle ライブラリが Amazon Aurora または Amazon RDS for PostgreSQL インスタンスで使用できることを確認します。PostgreSQL インスタンスで以下のコマンドを実行します:

 SHOW shared_preload_libraries

出力には pg_tle が表示されるはずです。

次に、コマンドを実行するために、現在のデータベースに pg_tle 拡張を作成する必要があります:

 CREATE EXTENSION pg_tle;

PostgreSQL 用の信頼できる言語拡張を作成して、現在のデータベースにインストールできるようになりました。新しいエクステンションを作成する場合は、以下のコマンドを使用して pgtle_admin ロールをプライマリユーザー (例:postgres) に付与する必要があります:

 GRANT pgtle_admin TO postgres;

それでは、最初の pg_tle 拡張の作成方法を見てみましょう!

PostgreSQL 用の信頼できる言語エクステンションの構築
この例では、pg_tle 拡張モジュールを作成して、ユーザーが一般的なパスワード辞書にあるパスワードを設定していないことを検証します。多くのチームが、特にデータベースユーザーのパスワードの複雑さに関するルールを設けています。PostgreSQLでは、開発者はcheck_password_hookを使用してパスワードの複雑さを強制することができます。

この例では、PL/pgSQL を使用してパスワードチェックフックを作成します。フックでは、ユーザーが入力したパスワードが、最も一般的な 10 個のパスワード値の辞書に含まれているかどうかを確認できます:

SELECT pgtle.install_extension (
'my_password_check_rules',
'1.0',
'Do not let users use the 10 most commonly used passwords',
$_pgtle_$
CREATE SCHEMA password_check;
REVOKE ALL ON SCHEMA password_check FROM PUBLIC;
GRANT USAGE ON SCHEMA password_check TO PUBLIC;

CREATE TABLE password_check.bad_passwords (plaintext) AS
VALUES
('123456'),
('password'),
('12345678'),
('qwerty'),
('123456789'),
('12345'),
('1234'),
('111111'),
('1234567'),
('dragon');
CREATE UNIQUE INDEX ON password_check.bad_passwords (plaintext);

CREATE FUNCTION password_check.passcheck_hook(username text, password text, password_type pgtle.password_types, valid_until timestamptz, valid_null boolean)
RETURNS void AS $$
DECLARE
invalid bool := false;
BEGIN
IF password_type = 'PASSWORD_TYPE_MD5' THEN
SELECT EXISTS(
SELECT 1
FROM password_check.bad_passwords bp
WHERE ('md5' || md5(bp.plaintext || username)) = password
) INTO invalid;
IF invalid THEN
RAISE EXCEPTION 'password must not be found on a common password dictionary';
END IF;
ELSIF password_type = 'PASSWORD_TYPE_PLAINTEXT' THEN
SELECT EXISTS(
SELECT 1
FROM password_check.bad_passwords bp
WHERE bp.plaintext = password
) INTO invalid;
IF invalid THEN
RAISE EXCEPTION 'password must not be found on a common password dictionary';
END IF;
END IF;
END
$$ LANGUAGE plpgsql SECURITY DEFINER;

GRANT EXECUTE ON FUNCTION password_check.passcheck_hook TO PUBLIC;

SELECT pgtle.register_feature('password_check.passcheck_hook', 'passcheck');
$_pgtle_$
);

pgtle.enable_password_check 構成パラメーターを使用してフックを有効にする必要があります。Amazon Aurora と Amazon RDS for PostgreSQL では、以下のコマンドを使用してこれを行うことができます:

$ aws rds modify-db-parameter-group \
    --region us-east-1 \
    --db-parameter-group-name pgtle \
    --parameters "ParameterName=pgtle.enable_password_check,ParameterValue=on,ApplyMethod=immediate"

これらの変更が反映されるまでに数分かかる場合があります。SHOW コマンドを使用して値が設定されていることを確認できます:

SHOW Pgtle.Enable_password_check;

値がオンの場合、次の出力が表示されます:

pgtle.enable_password_check
-----------------------------
 on

これで、現在のデータベースにこの拡張機能を作成し、パスワードを辞書パスワードのいずれかに設定して、フックがそれをどのように拒否するかを確認できます:

CREATE EXTENSION my_password_check_rules;

CREATE ROLE test_role PASSWORD '123456';
ERROR: password must not be found on a common password dictionary

CREATE ROLE test_role;
SET SESSION AUTHORIZATION test_role;
SET password_encryption TO 'md5';
\password
-- set to "password"
ERROR: password must not be found on a common password dictionary

フックを無効にするには、 pgtle.enable_password_check の値を off に設定します:

$ aws rds modify-db-parameter-group \
    --region us-east-1 \
    --db-parameter-group-name pgtle \
    --parameters "ParameterName=pgtle.enable_password_check,ParameterValue=off,ApplyMethod=immediate"

次のコマンドを使用して、この pg_tle 拡張機能をデータベースからアンインストールし、他のユーザーが my_password_check_rules CREATE EXTENSION を実行できないようにすることができます:

DROP EXTENSION my_password_check_rules;
SELECT pgtle.uninstall_extension('my_password_check_rules');

その他のサンプル拡張機能を見つけて試してみてください。ローカルのPostgreSQLデータベースで信頼できる言語拡張をビルドしてテストするには、リポジトリをクローンした後でソースコードからビルドできます。

私たちのコミュニティに参加してください!
PostgreSQL の信頼できる言語拡張コミュニティは誰でも参加できます。ぜひお試しいただき、今後のリリースで期待される内容についてフィードバックをお寄せください。新機能、拡張例、追加ドキュメント、GitHub のバグレポートなど、どんな貢献も歓迎します。

AWS クラウドで PostgreSQL 用の信頼できる言語拡張を使用する方法の詳細については、 Amazon Aurora PostgreSQL 互換エディションと Amazon RDS for PostgreSQL のドキュメントを参照してください。

ぜひお試しいただいて、Amazon RDSのAWS re:Post または通常のAWS サポートの連絡先を通してフィードバックをお寄せください。

Channy

原文はこちらです。