グループとして使用するロールのメンバ資格を他のロールへ付与または削除する

PostgreSQL におけるロールはユーザーとしての利用だけではなくグループとしても利用できるようになっています。グループとしてのロールには、他のロールにメンバ資格を付与することで、グループとしてのロールが持つ権限を継承することができます。ここでは PostgreSQL でロールをグループとして利用する目的で作成し、ロールのメンバ資格を他のロールに付与したり削除したりする方法について解説します。

(Last modified: )

グループとしてのロールを作成する

最初にグループとしてのロールの作成方法です。 PostgreSQL ではロールをユーザーとして利用する場合もグループとして利用する場合も区別をしていないので、グループとしてのロールの作成方法は通常のロールと同じ CREATE ROLE コマンドを使用します。

CREATE ROLE name [ [ WITH ] option [ ... ] ]

※ CREATE ROLE コマンドの詳細については「ロールを作成する(CREATE ROLE)」を参照されてください。

通常グループとしてロールを利用する場合、そのロールで直接 PostgreSQL に接続することはないので NOLOGIN を指定します(デフォルトが NOLOGIN なので何も指定しなくても同じです)。また認証に使用されないのでパスワードに関する設定も不要です。

それでは例として admin という名前のロールを作成します。次のように実行してください。

create role admin;

グループとしてのロールを作成する(1)

admin ロールが作成されました。グループとして利用する予定のロールですが、ユーザーとしてのロールと特別違う点はありません。

ロールのメンバ資格を指定のロールに付与する

GRANT コマンドを使ってグループとして利用するロールのメンバ資格を別のロールに付与することができます。書式は次のとおりです。

GRANT role_name_g [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]

グループととして利用しているロール( role_name_g )のメンバ資格をロール( role_name )に与えます。

メンバ資格をあたえるロールは別のグループとして利用しているロールでも構いません。例えば animal ロールが cat ロールにメンバ資格を与えていて、 creatures ロールが animal ロールにメンバ資格を与えた場合、 cat ロールは animal ロールの直接的なメンバですが、 creatures ロールの間接的なメンバでもあります。

この GRANT コマンドを実行するには、スーパーユーザーはどのロールに対しても実行でき、 CREATEROLE 権限を持つロールは、スーパーユーザー以外のロールに対して実行できます。またメンバとしてロールに追加されるときに WITH ADMIN OPTION が付けられていた場合には、他のロールに対してメンバ資格を付与する権限が与えられます。

-- --

それでは実際に試してみます。まずスーパーユーザーのロールを使って admin ロールのメンバ資格を kuma ロールに付与します。次のように実行してください。

grant admin to kuma with admin option;

ロールのメンバ資格を指定のロールに付与する(1)

admin ロールのメンバ資格を kuma ロールへ付与しました。

kuma ロールは WITH ADMIN OPTION 付きでメンバ資格を付与されましたので、他のロールに対して admin ロールのメンバ資格を付与することができます。

それでは実際に試してみます。 kuma ロールで PostgreSQL に接続後、 admin ロールのメンバ資格を neko ロールに付与します。次のように実行してください。

grant admin to neko with admin option;

ロールのメンバ資格を指定のロールに付与する(2)

admin ロールのメンバ資格を neko ロールへ付与しました。

-- --

それでは pg_auth_members カタログからロール間のメンバシップ関係を取得してみます( pg_auth_members カタログについては次のページで詳しく解説します)。

ロールのメンバ資格を指定のロールに付与する(3)

admin ロールのメンバ資格が kuma ロールと neko ロールに付与されていることが確認できました。

ロールのメンバ資格を指定のロールから削除する

REVOKE コマンドを使って付与されているロールのメンバ資格を削除することができます。書式は次のとおりです。

REVOKE [ ADMIN OPTION FOR ]
    role_name_g [, ...] FROM role_name [, ...]
    [ CASCADE | RESTRICT ]

グループととして利用しているロール( role_name_g )のメンバ資格をロール( role_name )から削除します。 ADMIN OPTION FOR が付けて実行した場合にはメンバ資格ではなく他のロールにメンバ資格を付与したり削除したりする権限だけが削除されます。

この REVOKE コマンドを実行するには、スーパーユーザーはどのロールに対しても実行でき、 CREATEROLE 権限を持つロールは、スーパーユーザー以外のロールに対して実行できます。またメンバとしてロールに追加されるときに WITH ADMIN OPTION が付けられていた場合には、他のロールに対してメンバ資格を削除する権限が与えられます。

-- --

それでは実際に試してみます。まず WITH ADMIN OPTION をつけてメンバ資格を付与された kuma ロールを使って admin ロールのメンバ資格を neko ロールから削除します。次のように実行してください。

revoke admin from neko;

ロールのメンバ資格を指定のロールから削除する(1)

neko ロールから admin ロールのメンバ資格を削除しました。

次にスーパーユーザーである postgres ロールを使って kuma ロールに付与されている WITH ADMIN OPTION の権限だけを削除してみます。次のように実行してください。

revoke admin option for admin from kuma;

ロールのメンバ資格を指定のロールから削除する(2)

kuma ロールから WITH ADMIN OPTION の権限だけが削除されました。 kuma ロールは admin ロールのメンバ資格を付与されたままです。

-- --

それでは pg_auth_members カタログからロール間のメンバシップ関係を取得してみます( pg_auth_members カタログについては次のページで詳しく解説します)。

ロールのメンバ資格を指定のロールから削除する(3)

前回実行したときから neko ロールから admin ロールのメンバ資格が削除され、 kuma ロールから WITH ADMIN OPTION の権限が削除されていることが確認できました。

-- --

グループとして利用するロールのメンバ資格を他のロールに付与したり削除したりする方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。