Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PostgreSQLの権限管理 ~ アカウントの操作とRow Level Securityの活...

soudai sone
October 19, 2022

PostgreSQLの権限管理 ~ アカウントの操作とRow Level Securityの活用 ~ / pgcon2022-tutorial

# PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
https://www.slideshare.net/nttdata-tech/postgresql-roles-osc2022-online-osaka-nttdata
# マルチテナントにおけるRow Level Securityの具体的な実装と注意点
https://soudai.hatenablog.com/entry/2022/11/11/110825

soudai sone

October 19, 2022
Tweet

More Decks by soudai sone

Other Decks in Technology

Transcript

  1. 自己紹介
 曽根 壮大(38歳)
 Have Fun Tech LLC 代表社員
 株式会社リンケージ CTO


    
 そ  ね   たけ とも
 • 日本PostgreSQLユーザ会 勉強会分科会 担当
 • 3人の子供がいます(長女、次女、長男)
 • 技術的にはWeb/LL言語/RDBMSが好きです
 • コミュニティが好き
  2. • 9.6 デフォルトロールが追加
 • 10 デフォルトロールから
 定義済みロールに変更
 • 14 定義済みロールが更に追加


    • 15 publicスキーマの権限が変更
 アカウント作成と権限の基本 互換性を壊すような変更は少ないが、 
 新機能の追加や細かい調整は多く入っている 

  3. -- ログイン可能なロールを作成します。 -- ただし、パスワードはありません。 CREATE ROLE jonathan LOGIN; -- パスワード付きのロールを作成します。

    -- CREATE USERはLOGINを意味する点を除き、 -- CREATE ROLEと同一です。 CREATE USER davide WITH PASSWORD 'jw8s0F4'; -- 2004年まで有効なパスワードを持つロールを作成します。 -- 2005年に1秒でも入った時点でパスワードは無効になります。 CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01' ; -- データベースを作成でき、かつ、 -- ロールを管理できるロールを作成します。 CREATE ROLE admin WITH CREATEDB CREATEROLE ; CREATE ROLE name [ [ WITH ] option [ ... ] ]
 
 ここでoptionは以下の通りです。
 
 SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMIT connlimit | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL | VALID UNTIL 'timestamp' | IN ROLE role_name [, ...] | IN GROUP role_name [, ...] | ROLE role_name [, ...] | ADMIN role_name [, ...] | USER role_name [, ...] | SYSID uid 
 
 公式ドキュメントを読もう https://www.postgresql.jp/document/14/html/sql-createrole.html
  4. -- 現在の設定を確認します SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- peter

    | peter -- 一時的にロールをセットします SET ROLE 'paul'; SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- peter | paul • ロールは一時的に設定することも可能
 • SET ROLE {name} で設定
 • RESET ROLEで元のロールに戻る
 • セッションユーザがメンバ資格を持つロールのみ使用できる 
 • セッションユーザとは、セッションを開始したユーザ
 • スーパーユーザは任意のロールを使用可
 • NONEおよびRESET形式は、現在のユーザ識別子を現在のセッ ションユーザ識別子に戻します。 
 この形式はすべてのユーザが実行することができます。
 公式ドキュメントを読もう https://www.postgresql.jp/document/14/html/sql-set-role.html
  5. -- 現在の設定を確認します SELECT * FROM pg_roles; • ロールの一覧は専用のVIEWが用意されている
 • psqlのメタコマンドでも参照可能


    • 詳細は公式ドキュメントを読みましょう
 公式ドキュメントを読もう https://www.postgresql.jp/document/14/html/view-pg-roles.html
  6. RLSの概要と実際の活用方法 ID NAME ROLE email 1 test admin [email protected] 2

    hoge user [email protected] 3 fuga user [email protected] 4 foo admin [email protected] 5 bar user [email protected] Viewで列を制限 ID NAME ROLE 1 test admin 2 hoge user 3 fuga user 4 foo admin 5 bar user SELECT id,name,role FROM hoge;
  7. RLSの概要と実際の活用方法 ID NAME ROLE email 1 test admin [email protected] 2

    hoge user [email protected] 3 fuga user [email protected] 4 foo admin [email protected] 5 bar user [email protected] RLSで行を制限 SELECT * FROM hoge; 例えばrole=userだけの結果を返す