© 2023 NTT DATA Group Corporation
© 2023 NTT DATA Group Corporation
マネージドPostgreSQLの実現に向けた
PostgreSQL機能向上
2023年11月24日 PostgreSQL Conference Japan 2023
株式会社NTTデータグループ 技術開発本部
加藤 慎也
© 2023 NTT DATA Group Corporation 2
自己紹介
• 名前
• 加藤 慎也 @ShinyaKato_
• 所属
• 株式会社NTTデータグループ 技術開発本部
• 業務
• PostgreSQLコミュニティでの開発
• PostgreSQLの研究開発やサポート業務
© 2023 NTT DATA Group Corporation 3
本講演について
• 講演資料は、NTTデータグループのSlideShareアカウント上で公開中
• https://www.slideshare.net/nttdata-tech
• 検証環境
製品名 バージョン
Amazon RDS for PostgreSQL PostgreSQL 14.7
on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.3.1
20180712 (Red Hat 7.3.1-12), 64-bit
Azure Database for PostgreSQL
(フレキシブル サーバー)
PostgreSQL 14.7
on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-
3ubuntu1~18.04) 7.5.0, 64-bit
Cloud SQL for PostgreSQL PostgreSQL 14.7
on x86_64-pc-linux-gnu, compiled by Debian clang
version 12.0.1, 64-bit
オープンソース版PostgreSQL PostgreSQL 16.1
© 2023 NTT DATA Group Corporation 4
マネージドサービスを使用していて、
権限が足りなくてやりたいことができない、
と困ったことはありませんか?
スーパーユーザ使えないのか…?
ということはCHECKPOINTコマンド
実行できないな…
必要な権限を付与できない…
あれ、何故かこのパラメータは
変更できないぞ…
© 2023 NTT DATA Group Corporation 5
PostgreSQLの機能が向上することで
これらの課題が解決しつつあります!
スーパーユーザ使えないのか…?
ということはCHECKPOINTコマンド
実行できないな…
必要な権限を付与できない…
あれ、何故かこのパラメータは
変更できないぞ…
v15~
CHECKPOINTコマンドの権限を付与可能に!
v16~
権限付与のルールが変更
v15~
パラメータ毎にSET権限を設定可能
© 2023 NTT DATA Group Corporation 6
マネージドPostgreSQLの主な制約
スーパーユーザを使用できない OSにログインできない
• 一部のSQLコマンドを実行できない
• 一部の権限を付与できない
• 一部のパラメータを設定できない
• スーパーユーザの所有するリレーション
に対する任意の操作を実行できない
• サーバのファイルを読み書きできない
• サーバプログラムを実行できない
• 拡張機能をインストールできない
© 2023 NTT DATA Group Corporation 7
© 2023 NTT DATA Group Corporation
01
スーパーユーザを
使用できない問題
© 2023 NTT DATA Group Corporation 8
ポイント
権限をより細やかに管理できる
ような機能が充実
© 2023 NTT DATA Group Corporation 9
CHECKPOINTコマンド
• v14まではスーパーユーザしかCHECKPOINTコマンドを実行できなかった
• v15で実装されたpg_checkpoint事前定義ロールを付与することで、
一般ユーザでもCHECKPOINTコマンドを実行できるようになった
v15
=# CREATE ROLE not_have_pg_checkpoint ;
=# SET ROLE not_have_pg_checkpoint ;
=> CHECKPOINT ;
ERROR: 42501: permission denied to execute CHECKPOINT command
DETAIL: Only roles with privileges of the "pg_checkpoint" role may execute this
command.
=> RESET ROLE ;
=# CREATE ROLE has_pg_checkpoint IN ROLE pg_checkpoint ;
=# SET ROLE has_pg_checkpoint ;
=> CHECKPOINT ;
CHECKPOINT
pg_checkpointをもたないロールで
CHECKPOINTコマンドを実行するとエラー
pg_checkpointをもつロールで
CHECKPOINTコマンドを実行すると成功
© 2023 NTT DATA Group Corporation 10
CHECKPOINTコマンド
• Amazon RDS for PostgreSQL
• v14時点で独自に対応済み
• Azure Database for PostgreSQL
• v14時点で独自に対応済み
• Cloud SQL for PostgreSQL
• 未対応
=> CHECKPOINT ;
CHECKPOINT
v15
=> CHECKPOINT ;
ERROR: 42501: must be superuser to do
CHECKPOINT
つまりソースコードを変更している!
Cloud SQL for PostgreSQL
Amazon RDS for PostgreSQL, Azure Database for PostgreSQL
© 2023 NTT DATA Group Corporation 11
VACUUM、ANALYZE、CLUSTER、
REFRESH MATERIALIZED VIEW、REINDEX、LOCK TABLEコマンド
• リレーションを所有するなどの適切な権限をもつロールしか
これらのSQLコマンドを実行できなかった
• 例)スーパーユーザの所有するシステムカタログのVACUUMを一般ユーザは実行できない
• pg_maintain事前定義ロールを付与することで、
全リレーションに対してこれらのSQLコマンドを実行できるようになった
• v16で導入予定だったが、権限昇格のバグによりRevertされた
v16で実装されたが最終的にはRevert
© 2023 NTT DATA Group Corporation 12
VACUUM、ANALYZE、CLUSTER、
REFRESH MATERIALIZED VIEW、REINDEX、LOCK TABLEコマンド
• Amazon RDS for PostgreSQL
• v14時点で独自に対応済み
• Azure Database for PostgreSQL
• 未対応
• Cloud SQL for PostgreSQL
• 未対応
=> VACUUM pg_db_role_setting ;
VACUUM
=> VACUUM pg_db_role_setting ;
WARNING: skipping
"pg_db_role_setting" --- only
superuser can vacuum it
VACUUM
v16で実装されたが最終的にはRevert
Azure Database for PostgreSQL, Cloud SQL for PostgreSQL
Amazon RDS for PostgreSQL
© 2023 NTT DATA Group Corporation 13
CREATE EVENT TRIGGERコマンド
• CREATE EVENT TRIGGERコマンドはスーパーユーザしか実行できない
• PostgreSQL本体には実行権限を制御する機能はないが、
調査対象のクラウドでは独自に対応している
未対応
=> CREATE EVENT TRIGGER trgr ON ddl_command_start EXECUTE FUNCTION any_func() ;
ERROR: 42501: permission denied to create event trigger "abort_ddl"
HINT: Must be superuser to create an event trigger.
PostgreSQL 16
=> CREATE EVENT TRIGGER trgr ON ddl_command_start EXECUTE FUNCTION any_func() ;
CREATE EVENT TRIGGER
Amazon RDS for PostgreSQL, Azure Database for PostgreSQL, Cloud SQL for PostgreSQL
© 2023 NTT DATA Group Corporation 14
BYPASSRLS属性の付与
• v15まではスーパーユーザしかBYPASSRLS属性の付与ができなかった
• v16では自身がCREATEROLE属性とBYPASSRLS属性を
もっていれば付与できるようになった
=> ¥du shinya
List of roles
Role name | Attributes
-----------+-------------------------
shinya | Create role, Bypass RLS
=> CREATE ROLE has_bypassrls BYPASSRLS ;
CREATE ROLE
PostgreSQL 16
v16
© 2023 NTT DATA Group Corporation 15
BYPASSRLS属性の付与
• Amazon RDS for PostgreSQL
• v14時点で独自に対応済み
• Azure Database for PostgreSQL
• 未対応
• Cloud SQL for PostgreSQL
• v14時点で独自に対応済み
=> CREATE ROLE
has_bypassrls BYPASSRLS ;
CREATE ROLE
=> CREATE ROLE
has_replication REPLICATION ;
ERROR: must be superuser to create
bypassrls users
=> CREATE ROLE
has_bypassrls BYPASSRLS ;
CREATE ROLE
v16
Cloud SQL for PostgreSQL
Azure Database for PostgreSQL
Amazon RDS for PostgreSQL
© 2023 NTT DATA Group Corporation 16
REPLICATION属性の付与
• v15まではスーパーユーザしかREPLICATION属性の付与ができなかった
• v16では自身がCREATEROLE属性とREPLICATION属性を
もっていれば付与できるようになった
=> ¥du shinya
List of roles
Role name | Attributes
-----------+--------------------------
shinya | Create role, Replication
=> CREATE ROLE has_replication REPLICATION ;
CREATE ROLE
PostgreSQL 16
v16
© 2023 NTT DATA Group Corporation 17
REPLICATION属性の付与
• Amazon RDS for PostgreSQL
• 未対応
• Azure Database for PostgreSQL
• v14時点で独自に対応済み
• Cloud SQL for PostgreSQL
• v14時点で独自に対応済み
=> CREATE ROLE
has_replication REPLICATION ;
ERROR: 42501: must be superuser to
create replication users
=> CREATE ROLE
has_replication REPLICATION ;
CREATE ROLE
v16
Azure Database for PostgreSQL, Cloud SQL for PostgreSQL
Amazon RDS for PostgreSQL
© 2023 NTT DATA Group Corporation 18
任意のロールの付与
• v15まではCREATEROLE属性をもつロールは、
スーパーユーザ以外の任意のロールの付与・剥奪ができた
• v16ではADMIN OPTION付きで自身がもつロールの付与・剥奪のみ実行可能に
なった
=> ¥drg shinya
List of role grants
Role name | Member of | Options | Grantor
-----------+---------------+---------------------+---------
shinya | pg_checkpoint | ADMIN, INHERIT, SET | rocky
=> GRANT pg_checkpoint TO role_a ;
GRANT ROLE
=> GRANT pg_execute_server_program TO role_a ;
ERROR: 42501: permission denied to grant role "pg_execute_server_program"
DETAIL: Only roles with the ADMIN option on role "pg_execute_server_program" may grant
this role.
PostgreSQL 16
v16
ADMIN OPTIONつきでpg_checkpoint
をもつのでGRANT可能
もたないpg_execute_server_programはGRANT不可
© 2023 NTT DATA Group Corporation 19
任意のロールの付与
• Amazon RDS for PostgreSQL
• v14時点で独自に対応済み
• Azure Database for PostgreSQL
• v14時点で独自に対応済み
• Cloud SQL for PostgreSQL
• v14時点で独自に対応済み
=> GRANT pg_execute_server_program
TO role_a ;
ERROR: 42501: cannot alter members of
"pg_execute_server_program"
DETAIL: "pg_execute_server_program"
is a protected role.
LOCATION: check_granted_role,
rdsutils.c:1711
v16
rdsutils.cというファイルに
実装されている
Amazon RDS for PostgreSQL
© 2023 NTT DATA Group Corporation 20
【参考】 pg_execute_server_programロールによる権限昇格
https://www.slideshare.net/slideshow/embed_code/key/rscjGQhRUduPIL
© 2023 NTT DATA Group Corporation 21
設定パラメータのSET、ALTER SYSTEM SET権限
• v15から、設定パラメータの
SET、ALTER SYSTEM SET権限をGRANTコマンドで付与可能となった
v15
=> SELECT name, context FROM pg_settings
WHERE name IN ('deadlock_timeout', 'commit_delay') ;
name | context
------------------+-----------
commit_delay | superuser
deadlock_timeout | superuser
=# GRANT SET ON PARAMETER deadlock_timeout TO shinya ;
=# SET ROLE shinya ;
=> SET deadlock_timeout TO '5s’ ;
SET
=> SET commit_delay TO '5s' ;
ERROR: 42501: permission denied to set parameter "commit_delay"
deadlock_timeout
のSET権限を付与
deadlock_timeoutのSET成功
commit_delayのSET失敗
PostgreSQL 16
© 2023 NTT DATA Group Corporation 22
設定パラメータのSET、ALTER SYSTEM SET権限
• Amazon RDS for PostgreSQL
• v14時点で一部のパラメータのみ
SETできるように対応済み
• Azure Database for PostgreSQL
• v14時点で
session_replication_roleのみ
SETできるように対応済み
• Cloud SQL for PostgreSQL
• 未対応
=> SET deadlock_timeout TO '5s' ;
SET
=> SET session_replication_role
TO 'replica' ;
SET
=> SET deadlock_timeout TO '5s' ;
ERROR: permission denied to set
parameter "deadlock_timeout"
v15
Cloud SQL for PostgreSQL
Azure Database for PostgreSQL
Amazon RDS for PostgreSQL
© 2023 NTT DATA Group Corporation 23
(スーパーユーザ以外の)任意のロールのコネクションの予約
• スーパーユーザのコネクションは
superuser_reserved_connectionsパラメータで予約できた
• v16から、 pg_use_reserved_connectionsロールを付与したロールの
コネクションをreserved_connectionsパラメータで予約可能になった
v16
superuser_
reserved_connections
reserved_connections その他の接続
max_connections
同時接続可能な最大数
スーパーユーザのために
予約するコネクション数
pg_use_reserved_connections
ロールをもつロールのために
予約するコネクション数
© 2023 NTT DATA Group Corporation 24
(スーパーユーザ以外の)任意のロールのコネクションの予約
• Amazon RDS for PostgreSQL
• v14時点で独自にrds.rds_superuser_reserved_connectionsというパラメータで
RDS管理者ロールのコネクションを予約可能
• Azure Database for PostgreSQL
• 未対応
• Cloud SQL for PostgreSQL
• 未対応
=> SHOW rds.rds_superuser_reserved_connections ;
rds.rds_superuser_reserved_connections
----------------------------------------
2
v16
Amazon RDS for PostgreSQL
© 2023 NTT DATA Group Corporation 25
© 2023 NTT DATA Group Corporation
02
OSにログインできない問題
© 2023 NTT DATA Group Corporation 26
ポイント
ファイル操作を
SQLインターフェースで実行可能に
© 2023 NTT DATA Group Corporation 27
pg_ident_file_mappingsビュー
• v15から、pg_ident.confファイルの中身を
pg_ident_file_mappingsビューで確認できるようになった
• postgresql.confはpg_settingsビュー、
pg_hba.confはpg_hba_file_rulesビューで確認可能
• ただし、デフォルトではスーパーユーザのみSELECT可能なので
マネージドサービス利用者は使えない可能性が高い
v15
=# SELECT * FROM pg_ident_file_mappings ;
-[ RECORD 1 ]----------------------------------------
map_number | 1
file_name | /home/rocky/pgsql/16/data/pg_ident.conf
line_number | 73
map_name | mymap
sys_name | /^(.*)@mydomain¥.com$
pg_username | ¥1
error | [NULL]
PostgreSQL 16
© 2023 NTT DATA Group Corporation 28
pg_hba_file_rulesビュー
• デフォルトではスーパーユーザのみSELECT可能
• Amazon RDS for PostgreSQL
• SELECT権限が付与された状態でPostgreSQLが作成される
• Azure Database for PostgreSQL
• 未対応
• Cloud SQL for PostgreSQL
• 未対応
補足
=> SELECT * FROM pg_hba_file_rules LIMIT 3 ;
line_number | type | database | user_name | address | netmask | auth_method | options | error
-------------+-------+----------+------------+---------+---------+---------------+-----------+-------
2 | local | {all} | {rdsadmin} | [NULL] | [NULL] | peer | {map=rds} | [NULL]
6 | local | {all} | {all} | [NULL] | [NULL] | scram-sha-256 | [NULL] | [NULL]
12 | host | {all} | {rdsadmin} | all | [NULL] | reject | [NULL] | [NULL]
Amazon RDS for PostgreSQL
© 2023 NTT DATA Group Corporation 29
pg_walinspect拡張機能
• v15でcontribモジュールに追加された拡張機能
• マネージドサービスではOSにログインできずpg_waldumpを実行できないため、
SQLコマンドでWALの情報を確認できるようにと開発
• ただし、クラウド側でサポートされるまでは使用できない
• Amazon RDS for PostgreSQLはサポート済み
v15
=# SELECT start_lsn, end_lsn, prev_lsn, block_ref FROM
pg_get_wal_record_info('0/E419E28');
-[ RECORD 1 ]----+-------------------------------------------------
start_lsn | 0/E419E28
end_lsn | 0/E419E68
prev_lsn | 0/E419D78
block_ref | blkref #0: rel 1663/16385/1249 fork main blk 364
PostgreSQL 16
© 2023 NTT DATA Group Corporation 30
Trusted Language Extensions for PostgreSQL(pg_tle)
• AWSがOSSとして公開している、”安全な”拡張機能を開発するためのツール
• ファイルシステムアクセスやネットワーク設定を制限し、
安全性を備えた信頼性のある言語を提供
• JavaScript、Perl、PL/pgSQL、SQLでの拡張機能の作成をサポート
• Amazon RDS for PostgreSQLでは
pg_tleを使用して開発した拡張機能を自由にインストール可能
補足
© 2023 NTT DATA Group Corporation 31
まとめ
• マネージドPostgreSQLを実現するための
PostgreSQLの機能向上について説明しました
• クラウドにより対応状況は様々ですが、
利用者の利便性を向上させたり、危険な操作を防止するために、
PostgreSQLのソースコードを変更して独自に対応していることがわかりました
• マネージドPostgreSQLとオープンソース版PostgreSQLの違いを理解しつつ、
PostgreSQLのアップデートを楽しみましょう
© 2023 NTT DATA Group Corporation 32
参考文献
• https://www.postgresql.org/docs/15/release-15.html
• https://www.postgresql.org/docs/16/release-16.html
• https://www.slideshare.net/slideshow/embed_code/key/rscjGQhRUduPIL
• https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/PostgreSQL_trusted_
language_extension.html
• https://github.com/aws/pg_tle
その他、記載されている会社名、商品名、又はサービス名は、
各社の登録商標又は商標です。

マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)

  • 1.
    © 2023 NTTDATA Group Corporation © 2023 NTT DATA Group Corporation マネージドPostgreSQLの実現に向けた PostgreSQL機能向上 2023年11月24日 PostgreSQL Conference Japan 2023 株式会社NTTデータグループ 技術開発本部 加藤 慎也
  • 2.
    © 2023 NTTDATA Group Corporation 2 自己紹介 • 名前 • 加藤 慎也 @ShinyaKato_ • 所属 • 株式会社NTTデータグループ 技術開発本部 • 業務 • PostgreSQLコミュニティでの開発 • PostgreSQLの研究開発やサポート業務
  • 3.
    © 2023 NTTDATA Group Corporation 3 本講演について • 講演資料は、NTTデータグループのSlideShareアカウント上で公開中 • https://www.slideshare.net/nttdata-tech • 検証環境 製品名 バージョン Amazon RDS for PostgreSQL PostgreSQL 14.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-12), 64-bit Azure Database for PostgreSQL (フレキシブル サーバー) PostgreSQL 14.7 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0- 3ubuntu1~18.04) 7.5.0, 64-bit Cloud SQL for PostgreSQL PostgreSQL 14.7 on x86_64-pc-linux-gnu, compiled by Debian clang version 12.0.1, 64-bit オープンソース版PostgreSQL PostgreSQL 16.1
  • 4.
    © 2023 NTTDATA Group Corporation 4 マネージドサービスを使用していて、 権限が足りなくてやりたいことができない、 と困ったことはありませんか? スーパーユーザ使えないのか…? ということはCHECKPOINTコマンド 実行できないな… 必要な権限を付与できない… あれ、何故かこのパラメータは 変更できないぞ…
  • 5.
    © 2023 NTTDATA Group Corporation 5 PostgreSQLの機能が向上することで これらの課題が解決しつつあります! スーパーユーザ使えないのか…? ということはCHECKPOINTコマンド 実行できないな… 必要な権限を付与できない… あれ、何故かこのパラメータは 変更できないぞ… v15~ CHECKPOINTコマンドの権限を付与可能に! v16~ 権限付与のルールが変更 v15~ パラメータ毎にSET権限を設定可能
  • 6.
    © 2023 NTTDATA Group Corporation 6 マネージドPostgreSQLの主な制約 スーパーユーザを使用できない OSにログインできない • 一部のSQLコマンドを実行できない • 一部の権限を付与できない • 一部のパラメータを設定できない • スーパーユーザの所有するリレーション に対する任意の操作を実行できない • サーバのファイルを読み書きできない • サーバプログラムを実行できない • 拡張機能をインストールできない
  • 7.
    © 2023 NTTDATA Group Corporation 7 © 2023 NTT DATA Group Corporation 01 スーパーユーザを 使用できない問題
  • 8.
    © 2023 NTTDATA Group Corporation 8 ポイント 権限をより細やかに管理できる ような機能が充実
  • 9.
    © 2023 NTTDATA Group Corporation 9 CHECKPOINTコマンド • v14まではスーパーユーザしかCHECKPOINTコマンドを実行できなかった • v15で実装されたpg_checkpoint事前定義ロールを付与することで、 一般ユーザでもCHECKPOINTコマンドを実行できるようになった v15 =# CREATE ROLE not_have_pg_checkpoint ; =# SET ROLE not_have_pg_checkpoint ; => CHECKPOINT ; ERROR: 42501: permission denied to execute CHECKPOINT command DETAIL: Only roles with privileges of the "pg_checkpoint" role may execute this command. => RESET ROLE ; =# CREATE ROLE has_pg_checkpoint IN ROLE pg_checkpoint ; =# SET ROLE has_pg_checkpoint ; => CHECKPOINT ; CHECKPOINT pg_checkpointをもたないロールで CHECKPOINTコマンドを実行するとエラー pg_checkpointをもつロールで CHECKPOINTコマンドを実行すると成功
  • 10.
    © 2023 NTTDATA Group Corporation 10 CHECKPOINTコマンド • Amazon RDS for PostgreSQL • v14時点で独自に対応済み • Azure Database for PostgreSQL • v14時点で独自に対応済み • Cloud SQL for PostgreSQL • 未対応 => CHECKPOINT ; CHECKPOINT v15 => CHECKPOINT ; ERROR: 42501: must be superuser to do CHECKPOINT つまりソースコードを変更している! Cloud SQL for PostgreSQL Amazon RDS for PostgreSQL, Azure Database for PostgreSQL
  • 11.
    © 2023 NTTDATA Group Corporation 11 VACUUM、ANALYZE、CLUSTER、 REFRESH MATERIALIZED VIEW、REINDEX、LOCK TABLEコマンド • リレーションを所有するなどの適切な権限をもつロールしか これらのSQLコマンドを実行できなかった • 例)スーパーユーザの所有するシステムカタログのVACUUMを一般ユーザは実行できない • pg_maintain事前定義ロールを付与することで、 全リレーションに対してこれらのSQLコマンドを実行できるようになった • v16で導入予定だったが、権限昇格のバグによりRevertされた v16で実装されたが最終的にはRevert
  • 12.
    © 2023 NTTDATA Group Corporation 12 VACUUM、ANALYZE、CLUSTER、 REFRESH MATERIALIZED VIEW、REINDEX、LOCK TABLEコマンド • Amazon RDS for PostgreSQL • v14時点で独自に対応済み • Azure Database for PostgreSQL • 未対応 • Cloud SQL for PostgreSQL • 未対応 => VACUUM pg_db_role_setting ; VACUUM => VACUUM pg_db_role_setting ; WARNING: skipping "pg_db_role_setting" --- only superuser can vacuum it VACUUM v16で実装されたが最終的にはRevert Azure Database for PostgreSQL, Cloud SQL for PostgreSQL Amazon RDS for PostgreSQL
  • 13.
    © 2023 NTTDATA Group Corporation 13 CREATE EVENT TRIGGERコマンド • CREATE EVENT TRIGGERコマンドはスーパーユーザしか実行できない • PostgreSQL本体には実行権限を制御する機能はないが、 調査対象のクラウドでは独自に対応している 未対応 => CREATE EVENT TRIGGER trgr ON ddl_command_start EXECUTE FUNCTION any_func() ; ERROR: 42501: permission denied to create event trigger "abort_ddl" HINT: Must be superuser to create an event trigger. PostgreSQL 16 => CREATE EVENT TRIGGER trgr ON ddl_command_start EXECUTE FUNCTION any_func() ; CREATE EVENT TRIGGER Amazon RDS for PostgreSQL, Azure Database for PostgreSQL, Cloud SQL for PostgreSQL
  • 14.
    © 2023 NTTDATA Group Corporation 14 BYPASSRLS属性の付与 • v15まではスーパーユーザしかBYPASSRLS属性の付与ができなかった • v16では自身がCREATEROLE属性とBYPASSRLS属性を もっていれば付与できるようになった => ¥du shinya List of roles Role name | Attributes -----------+------------------------- shinya | Create role, Bypass RLS => CREATE ROLE has_bypassrls BYPASSRLS ; CREATE ROLE PostgreSQL 16 v16
  • 15.
    © 2023 NTTDATA Group Corporation 15 BYPASSRLS属性の付与 • Amazon RDS for PostgreSQL • v14時点で独自に対応済み • Azure Database for PostgreSQL • 未対応 • Cloud SQL for PostgreSQL • v14時点で独自に対応済み => CREATE ROLE has_bypassrls BYPASSRLS ; CREATE ROLE => CREATE ROLE has_replication REPLICATION ; ERROR: must be superuser to create bypassrls users => CREATE ROLE has_bypassrls BYPASSRLS ; CREATE ROLE v16 Cloud SQL for PostgreSQL Azure Database for PostgreSQL Amazon RDS for PostgreSQL
  • 16.
    © 2023 NTTDATA Group Corporation 16 REPLICATION属性の付与 • v15まではスーパーユーザしかREPLICATION属性の付与ができなかった • v16では自身がCREATEROLE属性とREPLICATION属性を もっていれば付与できるようになった => ¥du shinya List of roles Role name | Attributes -----------+-------------------------- shinya | Create role, Replication => CREATE ROLE has_replication REPLICATION ; CREATE ROLE PostgreSQL 16 v16
  • 17.
    © 2023 NTTDATA Group Corporation 17 REPLICATION属性の付与 • Amazon RDS for PostgreSQL • 未対応 • Azure Database for PostgreSQL • v14時点で独自に対応済み • Cloud SQL for PostgreSQL • v14時点で独自に対応済み => CREATE ROLE has_replication REPLICATION ; ERROR: 42501: must be superuser to create replication users => CREATE ROLE has_replication REPLICATION ; CREATE ROLE v16 Azure Database for PostgreSQL, Cloud SQL for PostgreSQL Amazon RDS for PostgreSQL
  • 18.
    © 2023 NTTDATA Group Corporation 18 任意のロールの付与 • v15まではCREATEROLE属性をもつロールは、 スーパーユーザ以外の任意のロールの付与・剥奪ができた • v16ではADMIN OPTION付きで自身がもつロールの付与・剥奪のみ実行可能に なった => ¥drg shinya List of role grants Role name | Member of | Options | Grantor -----------+---------------+---------------------+--------- shinya | pg_checkpoint | ADMIN, INHERIT, SET | rocky => GRANT pg_checkpoint TO role_a ; GRANT ROLE => GRANT pg_execute_server_program TO role_a ; ERROR: 42501: permission denied to grant role "pg_execute_server_program" DETAIL: Only roles with the ADMIN option on role "pg_execute_server_program" may grant this role. PostgreSQL 16 v16 ADMIN OPTIONつきでpg_checkpoint をもつのでGRANT可能 もたないpg_execute_server_programはGRANT不可
  • 19.
    © 2023 NTTDATA Group Corporation 19 任意のロールの付与 • Amazon RDS for PostgreSQL • v14時点で独自に対応済み • Azure Database for PostgreSQL • v14時点で独自に対応済み • Cloud SQL for PostgreSQL • v14時点で独自に対応済み => GRANT pg_execute_server_program TO role_a ; ERROR: 42501: cannot alter members of "pg_execute_server_program" DETAIL: "pg_execute_server_program" is a protected role. LOCATION: check_granted_role, rdsutils.c:1711 v16 rdsutils.cというファイルに 実装されている Amazon RDS for PostgreSQL
  • 20.
    © 2023 NTTDATA Group Corporation 20 【参考】 pg_execute_server_programロールによる権限昇格 https://www.slideshare.net/slideshow/embed_code/key/rscjGQhRUduPIL
  • 21.
    © 2023 NTTDATA Group Corporation 21 設定パラメータのSET、ALTER SYSTEM SET権限 • v15から、設定パラメータの SET、ALTER SYSTEM SET権限をGRANTコマンドで付与可能となった v15 => SELECT name, context FROM pg_settings WHERE name IN ('deadlock_timeout', 'commit_delay') ; name | context ------------------+----------- commit_delay | superuser deadlock_timeout | superuser =# GRANT SET ON PARAMETER deadlock_timeout TO shinya ; =# SET ROLE shinya ; => SET deadlock_timeout TO '5s’ ; SET => SET commit_delay TO '5s' ; ERROR: 42501: permission denied to set parameter "commit_delay" deadlock_timeout のSET権限を付与 deadlock_timeoutのSET成功 commit_delayのSET失敗 PostgreSQL 16
  • 22.
    © 2023 NTTDATA Group Corporation 22 設定パラメータのSET、ALTER SYSTEM SET権限 • Amazon RDS for PostgreSQL • v14時点で一部のパラメータのみ SETできるように対応済み • Azure Database for PostgreSQL • v14時点で session_replication_roleのみ SETできるように対応済み • Cloud SQL for PostgreSQL • 未対応 => SET deadlock_timeout TO '5s' ; SET => SET session_replication_role TO 'replica' ; SET => SET deadlock_timeout TO '5s' ; ERROR: permission denied to set parameter "deadlock_timeout" v15 Cloud SQL for PostgreSQL Azure Database for PostgreSQL Amazon RDS for PostgreSQL
  • 23.
    © 2023 NTTDATA Group Corporation 23 (スーパーユーザ以外の)任意のロールのコネクションの予約 • スーパーユーザのコネクションは superuser_reserved_connectionsパラメータで予約できた • v16から、 pg_use_reserved_connectionsロールを付与したロールの コネクションをreserved_connectionsパラメータで予約可能になった v16 superuser_ reserved_connections reserved_connections その他の接続 max_connections 同時接続可能な最大数 スーパーユーザのために 予約するコネクション数 pg_use_reserved_connections ロールをもつロールのために 予約するコネクション数
  • 24.
    © 2023 NTTDATA Group Corporation 24 (スーパーユーザ以外の)任意のロールのコネクションの予約 • Amazon RDS for PostgreSQL • v14時点で独自にrds.rds_superuser_reserved_connectionsというパラメータで RDS管理者ロールのコネクションを予約可能 • Azure Database for PostgreSQL • 未対応 • Cloud SQL for PostgreSQL • 未対応 => SHOW rds.rds_superuser_reserved_connections ; rds.rds_superuser_reserved_connections ---------------------------------------- 2 v16 Amazon RDS for PostgreSQL
  • 25.
    © 2023 NTTDATA Group Corporation 25 © 2023 NTT DATA Group Corporation 02 OSにログインできない問題
  • 26.
    © 2023 NTTDATA Group Corporation 26 ポイント ファイル操作を SQLインターフェースで実行可能に
  • 27.
    © 2023 NTTDATA Group Corporation 27 pg_ident_file_mappingsビュー • v15から、pg_ident.confファイルの中身を pg_ident_file_mappingsビューで確認できるようになった • postgresql.confはpg_settingsビュー、 pg_hba.confはpg_hba_file_rulesビューで確認可能 • ただし、デフォルトではスーパーユーザのみSELECT可能なので マネージドサービス利用者は使えない可能性が高い v15 =# SELECT * FROM pg_ident_file_mappings ; -[ RECORD 1 ]---------------------------------------- map_number | 1 file_name | /home/rocky/pgsql/16/data/pg_ident.conf line_number | 73 map_name | mymap sys_name | /^(.*)@mydomain¥.com$ pg_username | ¥1 error | [NULL] PostgreSQL 16
  • 28.
    © 2023 NTTDATA Group Corporation 28 pg_hba_file_rulesビュー • デフォルトではスーパーユーザのみSELECT可能 • Amazon RDS for PostgreSQL • SELECT権限が付与された状態でPostgreSQLが作成される • Azure Database for PostgreSQL • 未対応 • Cloud SQL for PostgreSQL • 未対応 補足 => SELECT * FROM pg_hba_file_rules LIMIT 3 ; line_number | type | database | user_name | address | netmask | auth_method | options | error -------------+-------+----------+------------+---------+---------+---------------+-----------+------- 2 | local | {all} | {rdsadmin} | [NULL] | [NULL] | peer | {map=rds} | [NULL] 6 | local | {all} | {all} | [NULL] | [NULL] | scram-sha-256 | [NULL] | [NULL] 12 | host | {all} | {rdsadmin} | all | [NULL] | reject | [NULL] | [NULL] Amazon RDS for PostgreSQL
  • 29.
    © 2023 NTTDATA Group Corporation 29 pg_walinspect拡張機能 • v15でcontribモジュールに追加された拡張機能 • マネージドサービスではOSにログインできずpg_waldumpを実行できないため、 SQLコマンドでWALの情報を確認できるようにと開発 • ただし、クラウド側でサポートされるまでは使用できない • Amazon RDS for PostgreSQLはサポート済み v15 =# SELECT start_lsn, end_lsn, prev_lsn, block_ref FROM pg_get_wal_record_info('0/E419E28'); -[ RECORD 1 ]----+------------------------------------------------- start_lsn | 0/E419E28 end_lsn | 0/E419E68 prev_lsn | 0/E419D78 block_ref | blkref #0: rel 1663/16385/1249 fork main blk 364 PostgreSQL 16
  • 30.
    © 2023 NTTDATA Group Corporation 30 Trusted Language Extensions for PostgreSQL(pg_tle) • AWSがOSSとして公開している、”安全な”拡張機能を開発するためのツール • ファイルシステムアクセスやネットワーク設定を制限し、 安全性を備えた信頼性のある言語を提供 • JavaScript、Perl、PL/pgSQL、SQLでの拡張機能の作成をサポート • Amazon RDS for PostgreSQLでは pg_tleを使用して開発した拡張機能を自由にインストール可能 補足
  • 31.
    © 2023 NTTDATA Group Corporation 31 まとめ • マネージドPostgreSQLを実現するための PostgreSQLの機能向上について説明しました • クラウドにより対応状況は様々ですが、 利用者の利便性を向上させたり、危険な操作を防止するために、 PostgreSQLのソースコードを変更して独自に対応していることがわかりました • マネージドPostgreSQLとオープンソース版PostgreSQLの違いを理解しつつ、 PostgreSQLのアップデートを楽しみましょう
  • 32.
    © 2023 NTTDATA Group Corporation 32 参考文献 • https://www.postgresql.org/docs/15/release-15.html • https://www.postgresql.org/docs/16/release-16.html • https://www.slideshare.net/slideshow/embed_code/key/rscjGQhRUduPIL • https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/PostgreSQL_trusted_ language_extension.html • https://github.com/aws/pg_tle
  • 33.