© 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.