SlideShare a Scribd company logo
1 of 35
Download to read offline
10th PostgreSQL Unconference10th PostgreSQL Unconference
(2019-02-02)(2019-02-02)
Access Privilege InquiryAccess Privilege Inquiry
FunctionsFunctions
(( アクセス権限照会関数アクセス権限照会関数 ))
ぬこ@横浜ぬこ@横浜 (@nuko_yokohama)(@nuko_yokohama)
2
自己紹介
「 PostgreSQL ラーメン」
でググってください
3
今日は少しだけ
役立つかもしれない
話をします
4
この本には書いてない
テーマです。
(書こうとしたけど、
紙面の都合で割愛)
5
アンケート 1
PostgreSQL ロールを
ちゃんと使ってますか?
6
アンケート 2
細かい権限制御って
やってますか?
7
実は私も普段は
使ってませんw
postgres ユーザで
作業してることが多い
8
とはいえ
たまにお仕事で
ロールや権限のことを
聞かれることもある。
9
ロールって?
10
これはロース
11
ロール (ROLE) は名前のとおり、
データベースシステムにおける役割を示す概念
従来はグループとユーザという概念に分かれていたが
PostgreSQL 8.1 から「ロール」に統合された。
ユーザ=ログインできるロール
12
デフォルト
ロール
13
権限分掌の考えから
PostgreSQL 9.6 から
追加されたしくみ
14
PostgreSQL の操作の中
には、特権 (postgres)
ユーザでないとできない
ものがある。
15
postgres ユーザ
なんでもできちゃう問題
16
なので、特定の操作を
可能とし、かつ特権を
もたないロールが
作成された。
17
デフォルトロール名 バージョン 内容
pg_read_all_settings 10 ~ 全てのサーバ設定情報を読み取り可能なロール
pg_read_all_stats 10 ~ 全ての活動統計情報を読み取り可能なロール
pg_stat_scan_tables 10 ~ 強いロックをかけ、かつテーブルをフルスキャ
ンする操作を許容するロール。(例:
pgstatuple など )
pg_signal_backend 9.6 ~ バックエンドプロセスにシグナルを送信可能な
ロール。
pg_read_server_files 11 ~ サーバ側のファイルを読み取り可能なロール
pg_write_server_files 11 ~ サーバ側のファイルへ書き込み可能なロール
pg_execute_server_program 11 ~ サーバ側でプログラムの実行が可能なロール。
pg_monitor 10 ~ pg_read_all_settings, pg_read_all_stats,
pg_stat_scan_tables を合わせたロール。
18
GRANT による
ロールの継承
19
GRANT 文を使って、
あるロール X の機能を、
別のロール Y に
含めることができる。
GRANT ロール X TO ロール Y
20
町田で例えると
テーブル T
テーブル K
tokyo ロール
kanagawa ロール
machida ロール
GRANT
GRANT
アクセス可能
アクセス可能
アクセス可能
アクセス可能
早く machida ロールから
tokyo ロールを
REVOKE せねば・・・
21
GRANT によるロール継承の
設定を確認するには?
22
ロールとロール間の関係例
-- ロールの作成
CREATE ROLE dbowner CREATEDB LOGIN;
CREATE ROLE user_a LOGIN;
CREATE ROLE user_a_w LOGIN;
CREATE ROLE user_a_t LOGIN;
CREATE ROLE user_b LOGIN;
CREATE ROLE user_b_w LOGIN;
CREATE ROLE user_c LOGIN;
CREATE ROLE monitor LOGIN;
-- ロール間の関係
GRANT user_a TO user_a_w;
GRANT user_b TO user_b_w;
GRANT user_a TO user_c;
GRANT user_b TO user_c;
GRANT pg_monitor TO monitor;
23
GRANT によるロール継承の
設定を確認するには?
WITH RECURSIVE t AS (
SELECT oid as roleid, 0 as level, oid::text as sortkey
FROM pg_roles
WHERE rolname IN (SELECT rolname FROM pg_roles)
UNION ALL
SELECT member as roleid, t.level + 1 , ((sortkey || '.' || pam.member)::text) AS sortkey
FROM pg_auth_members pam JOIN t ON (pam.roleid= t.roleid)
) SELECT (repeat(' ', level) || pr.rolname) as rolename
FROM t JOIN pg_roles pr ON (t.roleid = pr.oid)
ORDER BY sortkey ;
$ psql -U postgres postgres -f roles.sql
rolename
---------------------------
postgres
monitor_user
dbowner
user_a
user_a_w
user_c
user_a_w
user_b
user_b_w
user_c
24
GRANT による
権限設定
25
PostgreSQL の場合、 GRANT 対象となる
オブジェクトの種類は非常に多い。
テーブル、列、シーケンス
データベース
ドメイン
Forein Data Wrapper
Foreign Server
関数
言語
ラージオブジェクト
スキーマ
テーブルスペース
型
26
pg_class 等で
権限設定が
わからない問題
27
細かく GRANT/REVOKE で
DB オブジェクトに対する
権限を設定
↓
設定を確認したくなる
28
例えば、テーブルに対する
アクセス権限は
pg_class にあるのだが、
実はこれだけ見ても
権限設定の全体はわからない。
29
ロールと DB オブジェクト
-- ロールの作成
CREATE ROLE dbowner CREATEDB LOGIN;
CREATE ROLE user_a LOGIN;
CREATE ROLE user_a_w LOGIN;
CREATE ROLE user_a_t LOGIN;
CREATE ROLE user_b LOGIN;
CREATE ROLE user_b_w LOGIN;
CREATE ROLE user_c LOGIN;
CREATE ROLE monitor LOGIN;
-- ロール間の関係
GRANT user_a TO user_a_w;
GRANT user_b TO user_b_w;
GRANT user_a TO user_c;
GRANT user_b TO user_c;
GRANT pg_monitor TO monitor;
-- テーブル作成
CREATE TABLE table_a (id int, data text);
CREATE TABLE table_b (id int, data text);
-- GRANT TABLES
GRANT SELECT ON table_a TO user_a;
GRANT INSERT, UPDATE, DELETE ON table_a TO user_a_w;
REVOKE SELECT ON table_a FROM user_a_t;
GRANT TRUNCATE ON table_a TO user_a_t;
GRANT SELECT ON table_b TO user_b;
GRANT INSERT, UPDATE, DELETE ON table_a TO user_a_w;
30
pg_class だけでは権限は不明
priv=# SELECT relname, relacl FROM pg_class WHERE relname IN ('table_a', 'table_b');
relname | relacl
---------+-----------------------------------------------------------------------------------------
table_a | {postgres=arwdDxt/postgres,user_a=r/postgres,user_a_w=awd/postgres,user_a_t=D/postgres}
table_b | {postgres=arwdDxt/postgres,user_b=r/postgres}
(2 rows)
user_c ( user_a, user_b を継承)
のように継承されたロールが、
明示的に GRANT 等を発行しないと
→ pg_class の relacl には書かれない!
31
Access Privilege Inquiry
Functions
32
ロールと DB オブジェクト
-- ロールの作成
CREATE ROLE dbowner CREATEDB LOGIN;
CREATE ROLE user_a LOGIN;
CREATE ROLE user_a_w LOGIN;
CREATE ROLE user_a_t LOGIN;
CREATE ROLE user_b LOGIN;
CREATE ROLE user_b_w LOGIN;
CREATE ROLE user_c LOGIN;
CREATE ROLE monitor LOGIN;
-- ロール間の関係
GRANT user_a TO user_a_w;
GRANT user_b TO user_b_w;
GRANT user_a TO user_c;
GRANT user_b TO user_c;
GRANT pg_monitor TO monitor;
-- テーブル作成
CREATE TABLE table_a (id int, data text);
CREATE TABLE table_b (id int, data text);
-- GRANT TABLES
GRANT SELECT ON table_a TO user_a;
GRANT INSERT, UPDATE, DELETE ON table_a TO user_a_w;
REVOKE SELECT ON table_a FROM user_a_t;
GRANT TRUNCATE ON table_a TO user_a_t;
GRANT SELECT ON table_b TO user_b;
GRANT INSERT, UPDATE, DELETE ON table_a TO user_a_w;
33
アクセス権限照会関数の例
o /dev/null
SELECT rolname, relname, crud
FROM (SELECT r.oid, r.rolname, c.relname,
((CASE WHEN has_table_privilege(r.oid, c.oid, 'INSERT') THEN 'C' ELSE ' ' END) ||
(CASE WHEN has_table_privilege(r.oid, c.oid, 'SELECT') THEN 'R' ELSE ' ' END) ||
(CASE WHEN has_table_privilege(r.oid, c.oid, 'UPDATE') THEN 'U' ELSE ' ' END) ||
(CASE WHEN has_table_privilege(r.oid, c.oid, 'DELETE') THEN 'D' ELSE ' ' END) ||
(CASE WHEN has_table_privilege(r.oid, c.oid, 'TRUNCATE') THEN 'T' ELSE ' ' END)) AS crud
FROM pg_roles r, pg_class c
WHERE c.relkind = 'r'
AND r.rolcanlogin = true
AND relnamespace IN
(SELECT oid
FROM pg_namespace
WHERE nspname NOT IN ('pg_catalog','information_schema','pg_toast'))
) t
ORDER BY rolname, relname;
o
crosstabview rolname relname
$ psql priv -U postgres -f priv.sql
rolname | table_a | table_b
----------+---------+---------
monitor | |
postgres | CRUDT | CRUDT
user_a | R |
user_a_t | T |
user_a_w | CRUD |
user_b | | R
user_b_w | | R
user_c | R | R
(9 rows)
34
PostgreSQL の
権限管理は、
きちんと調べると
なかなか面白い
35
おしまい

More Related Content

What's hot

System select hint_for_h2
System select hint_for_h2System select hint_for_h2
System select hint_for_h2
Jun Chiba
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11
Takashi Kawachi
 
10分で分かるRパッケージの作り方
10分で分かるRパッケージの作り方10分で分かるRパッケージの作り方
10分で分かるRパッケージの作り方
Yohei Sato
 
もにかじ2 lt @studio3104
もにかじ2 lt @studio3104もにかじ2 lt @studio3104
もにかじ2 lt @studio3104
Satoshi Suzuki
 
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)
karupanerura
 

What's hot (20)

2015年度 第1回バイオインフォマティクス実習
2015年度 第1回バイオインフォマティクス実習2015年度 第1回バイオインフォマティクス実習
2015年度 第1回バイオインフォマティクス実習
 
Learn fromalphageeks
Learn fromalphageeksLearn fromalphageeks
Learn fromalphageeks
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方
 
01 php7
01   php701   php7
01 php7
 
Rパッケージ recipes の紹介 「うまい飯を作る」
Rパッケージ recipes の紹介 「うまい飯を作る」Rパッケージ recipes の紹介 「うまい飯を作る」
Rパッケージ recipes の紹介 「うまい飯を作る」
 
System select hint_for_h2
System select hint_for_h2System select hint_for_h2
System select hint_for_h2
 
Perl 6 Object-Oliented Programming
Perl 6 Object-Oliented ProgrammingPerl 6 Object-Oliented Programming
Perl 6 Object-Oliented Programming
 
Elixirだ 第1回強化版 後半
Elixirだ 第1回強化版 後半Elixirだ 第1回強化版 後半
Elixirだ 第1回強化版 後半
 
objective-c propertyの属性について
objective-c propertyの属性についてobjective-c propertyの属性について
objective-c propertyの属性について
 
菩薩でもわかる!Rで動かすExcelアドインの作り方
 菩薩でもわかる!Rで動かすExcelアドインの作り方  菩薩でもわかる!Rで動かすExcelアドインの作り方
菩薩でもわかる!Rで動かすExcelアドインの作り方
 
PCさえあればいい。
PCさえあればいい。PCさえあればいい。
PCさえあればいい。
 
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11
 
10分で分かるRパッケージの作り方
10分で分かるRパッケージの作り方10分で分かるRパッケージの作り方
10分で分かるRパッケージの作り方
 
Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半
 
もにかじ2 lt @studio3104
もにかじ2 lt @studio3104もにかじ2 lt @studio3104
もにかじ2 lt @studio3104
 
Gasとスプレッドシートで簡易DB
Gasとスプレッドシートで簡易DBGasとスプレッドシートで簡易DB
Gasとスプレッドシートで簡易DB
 
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)
Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)
 
nioで作ったBufferedWriterに変えたら例外になった
nioで作ったBufferedWriterに変えたら例外になったnioで作ったBufferedWriterに変えたら例外になった
nioで作ったBufferedWriterに変えたら例外になった
 
New Generation Build System "Fly"
New Generation Build System "Fly"New Generation Build System "Fly"
New Generation Build System "Fly"
 

Similar to 20190202-pgunconf-Access-Privilege-Inquiry-Functions

Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
Akio Ishida
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料
kasaharatt
 
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
kasaharatt
 

Similar to 20190202-pgunconf-Access-Privilege-Inquiry-Functions (20)

PostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQLPostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQL
 
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
 
Pgunconf14 pg13-psql
Pgunconf14 pg13-psqlPgunconf14 pg13-psql
Pgunconf14 pg13-psql
 
Chugoku db 20th-postgresql-10-pub
Chugoku db 20th-postgresql-10-pubChugoku db 20th-postgresql-10-pub
Chugoku db 20th-postgresql-10-pub
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
 
Pgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdwPgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdw
 
外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張
 
20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extension
 
PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)PostgreSQLレプリケーション(pgcon17j_t4)
PostgreSQLレプリケーション(pgcon17j_t4)
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extension
 
A Tour of PostgreSQL
A Tour of PostgreSQLA Tour of PostgreSQL
A Tour of PostgreSQL
 
Chugokudb18_2
Chugokudb18_2Chugokudb18_2
Chugokudb18_2
 
MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理
 
20190518 27th-chugoku db-lt-pg12
20190518 27th-chugoku db-lt-pg1220190518 27th-chugoku db-lt-pg12
20190518 27th-chugoku db-lt-pg12
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料
 
PostgreSQL9.3新機能紹介
PostgreSQL9.3新機能紹介PostgreSQL9.3新機能紹介
PostgreSQL9.3新機能紹介
 
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
 

More from Toshi Harada

More from Toshi Harada (20)

無駄にNeo4jを使っている日々
無駄にNeo4jを使っている日々無駄にNeo4jを使っている日々
無駄にNeo4jを使っている日々
 
Pgunconf16 toast
Pgunconf16 toastPgunconf16 toast
Pgunconf16 toast
 
20181122 pg con-jp-lt-logrep
20181122 pg con-jp-lt-logrep20181122 pg con-jp-lt-logrep
20181122 pg con-jp-lt-logrep
 
20171106 ntt-tx-postgre sql-10
20171106 ntt-tx-postgre sql-1020171106 ntt-tx-postgre sql-10
20171106 ntt-tx-postgre sql-10
 
20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsql20171103 pg con-jp-lt-plpgsql
20171103 pg con-jp-lt-plpgsql
 
20171028 osc-nagaoka-postgre sql-10
20171028 osc-nagaoka-postgre sql-1020171028 osc-nagaoka-postgre sql-10
20171028 osc-nagaoka-postgre sql-10
 
20170819 ocd-l tthon-pgdev
20170819 ocd-l tthon-pgdev20170819 ocd-l tthon-pgdev
20170819 ocd-l tthon-pgdev
 
Ntt tx-study-postgre sql-10
Ntt tx-study-postgre sql-10Ntt tx-study-postgre sql-10
Ntt tx-study-postgre sql-10
 
Jpug study-postgre sql-10-pub
Jpug study-postgre sql-10-pubJpug study-postgre sql-10-pub
Jpug study-postgre sql-10-pub
 
Pgconf asia-201612203-pg reversi-ja
Pgconf asia-201612203-pg reversi-jaPgconf asia-201612203-pg reversi-ja
Pgconf asia-201612203-pg reversi-ja
 
Pgconf asia-201612203-pg reversi
Pgconf asia-201612203-pg reversiPgconf asia-201612203-pg reversi
Pgconf asia-201612203-pg reversi
 
Kof2016 postgresql-9.6
Kof2016 postgresql-9.6Kof2016 postgresql-9.6
Kof2016 postgresql-9.6
 
Chugoku db 17th-lt-kly
Chugoku db 17th-lt-klyChugoku db 17th-lt-kly
Chugoku db 17th-lt-kly
 
Chugoku db 17th-postgresql-9.6
Chugoku db 17th-postgresql-9.6Chugoku db 17th-postgresql-9.6
Chugoku db 17th-postgresql-9.6
 
Osc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseOsc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-database
 
Dblt#2 do-postgres-dream-of-graph-database
Dblt#2 do-postgres-dream-of-graph-databaseDblt#2 do-postgres-dream-of-graph-database
Dblt#2 do-postgres-dream-of-graph-database
 
Do postgres-dream-of-graph-database
Do postgres-dream-of-graph-databaseDo postgres-dream-of-graph-database
Do postgres-dream-of-graph-database
 
Hackers Champloo 2016 postgresql-9.6
Hackers Champloo 2016 postgresql-9.6Hackers Champloo 2016 postgresql-9.6
Hackers Champloo 2016 postgresql-9.6
 
MyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatypeMyNA JPUG study 20160220-postgresql-json-datatype
MyNA JPUG study 20160220-postgresql-json-datatype
 
KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5KOF2015 PostgreSQL 9.5
KOF2015 PostgreSQL 9.5
 

20190202-pgunconf-Access-Privilege-Inquiry-Functions