5.2 ユーザ管理

以下を確認します。

  • ユーザの作成
  • 権限の付与と取り消し

ユーザの作成

createuserコマンドとCREATE ROLE文で新しいユーザを作成します。

[postgres@host1 ~]$ createuser -d -P sato
新しいロールのためのパスワード: ※パスワードを入力
もう一度入力してください: ※パスワードを再入力
[postgres@host1 ~]$ createuser -g sato suzuki
[postgres@host1 ~]$ psql ossdb
psql (13.14)
"help"でヘルプを表示します。

ossdb=# CREATE ROLE takahashi WITH LOGIN PASSWORD 'secret';
CREATE ROLE
ossdb=# \du
                                             ロール一覧
 ロール名  |                                   属性                                   | 所属グループ

-----------+--------------------------------------------------------------------------+-------------
-
 postgres  | スーパユーザ, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス | {}
 sato      | DB作成可                                                                 | {}
 suzuki    |                                                                          | {sato}
 takahashi |                                                                          | {}

ossdb=#

createuserコマンドで、satoユーザとsuzukiユーザを新たに作成しています。satoユーザはデータベース作成可能で、suzukiユーザはsatoユーザ(グループ)のメンバーになっています。次にpsqlコマンドでossdbデータベースに接続して、CREATE ROLE文でtakahashiユーザを作成しています。作成したユーザは、psqlの\duサブコマンドで確認できます。

権限の付与と取り消し

上記で作成したsatoユーザに対するprod表の権限の付与と取り消しを行います。

ossdb=# GRANT SELECT ON prod TO sato;
GRANT
ossdb=# SET ROLE sato;
SET
ossdb=> SELECT CURRENT_USER, SESSION_USER;
 current_user | session_user
--------------+--------------
 sato         | postgres
(1 行)

ossdb=> SELECT * FROM prod WHERE prod_id = 1;
 prod_id | prod_name | price
---------+-----------+-------
       1 | みかん    |    52
(1 行)

ossdb=> SET ROLE suzuki;
SET
ossdb=> SELECT CURRENT_USER, SESSION_USER;
 current_user | session_user
--------------+--------------
 suzuki       | postgres
(1 行)

ossdb=> SELECT * FROM prod WHERE prod_id = 1;
 prod_id | prod_name | price
---------+-----------+-------
       1 | みかん    |    52
(1 行)

ossdb=> SET ROLE takahashi;
SET
ossdb=> SELECT CURRENT_USER, SESSION_USER;
 current_user | session_user
--------------+--------------
 takahashi    | postgres
(1 行)

ossdb=> SELECT * FROM prod WHERE prod_id = 1; --エラー
ERROR:  テーブル prod へのアクセスが拒否されました
ossdb=> RESET ROLE;
RESET
ossdb=# REVOKE SELECT ON prod FROM sato;
REVOKE
ossdb=# SET ROLE suzuki;
SET
ossdb=> SELECT * FROM prod WHERE prod_id = 1; --エラー
ERROR:  テーブル prod へのアクセスが拒否されました
ossdb=> RESET ROLE;
RESET
ossdb=# DROP ROLE takahashi;
DROP ROLE
ossdb=# \q
[postgres@host1 ~]$ dropuser suzuki
[postgres@host1 ~]$

GRANT文でprod表に対するSELECT権限をsatoユーザに付与します。次にSET ROLE文でsatoユーザでログインします。SELECT文で現在のユーザ(CURRENT_USER) がsatoになっていることを確認した後、実際にprod表を検索してみます。
続いてsatoのメンバーであるsuzukiユーザはprod表を検索できること、takahashiユーザは検索できないことを確認しています。次にREVOKE文でsatoユーザの権限を取り消すと、suzukiユーザもprod表を検索できなくなります。最後にDROP ROLE文とdropuserコマンドで作成したtakahashiユーザとsuzukiユーザを削除します。