[pgsql-jp: 41096] Re: postgresユーザーのREVOKEについて

Tomoaki Sato sato @ sraoss.co.jp
2012年 4月 26日 (木) 12:59:36 JST


佐藤です。

> はじめまして。山村と申します。
> postgresユーザーのREVOKEの使い方について質問させてください。
> 
> スーパーユーザーのpostgresが、ほかのアカウントで作成した別ユーザーの
> テーブルアクセス権限を取り上げたいのですが、そのような事はできますで
> しょうか?
> 
> http://www.postgresql.jp/document/9.1/html/sql-revoke.htmlには「スー
> パーユーザがGRANTやREVOKEコマンドを発行した場合、そのコマンドは、対
> 象のオブジェクトの所有者によって発行されたものであるかのように動作し
> ます。・・・・ただし、この場合は上述のCASCADEを使用する必要がありま
> す。」とあったので、できると仮定して以下の手順を試してみましたがダメ
> でした。
> 
> 確認してみた手順(各ステップはpgAdmin1.14.2で接続しなおして実行してい
> ます。Postgresは9.1.3):
> 
> 1. postgresアカウントで実行
>     CREATE SCHEMA scm;
>     CREATE TABLE scm.tblA(v integer);
> 
>     -- dbaccount_operator 追加
>     CREATE ROLE dbaccount_operator WITH PASSWORD 'abc' CREATEROLE LOGIN;
>     GRANT USAGE ON SCHEMA scm TO dbaccount_operator WITH GRANT OPTION;
>     GRANT SELECT ON ALL TABLES IN SCHEMA scm TO dbaccount_operator
> WITH GRANT OPTION;
> 
> 2. dbaccount_operatorアカウントで実行
>     -- zzz_test_user 追加
>     CREATE ROLE zzz_test_user WITH PASSWORD '123' LOGIN;
>     GRANT USAGE ON SCHEMA scm TO zzz_test_user;
>     GRANT SELECT ON ALL TABLES IN SCHEMA scm TO zzz_test_user;
> 
> 3. postgresアカウントで実行
>     -- zzz_test_user からscmにある全テーブルからSELECT権限を取り上げ。
>     REVOKE SELECT ON ALL TABLES IN SCHEMA scm FROM zzz_test_user CASCADE;
> 
> 3番目の手順で"クエリーは、21 ミリ秒で結果なしでうまく帰りました。"と
> でるのですが、\dpコマンド確認してみると取り上げられていませんでした。
> 念のため、dbaccount_operator アカウントで3)を実行すれば取り上げるこ
> とはできたことは確認しました。

dbaccount_operator ユーザによって zzz_test_user ユーザに与えられた権限
は、dbaccount_operator ユーザにしか取り上げられません。 zzz_test_user
ユーザの権限を dbaccount_operator 以外のユーザによって取り上げるには、
dbaccount_operator ユーザの権限を含めて取り上げる必要があります。

  REVOKE SELECT ON ALL TABLES IN SCHEMA scm FROM dbaccount_operator CASCADE;

CASCADE オプションは間接的に与えられた権限を含めて取り上げる場合に指定
するものです。

つまり、dbaccount_operator 以外のユーザが dbaccount_operator ユーザの
権限を残したまま dbaccount_operator ユーザによって与えられた権限を取り
上げることはできません。マニュアルにも以下の説明があります。

  取り消すことができるのは、ユーザが直接付与した権限のみです。


----
Tomoaki Sato <sato @ sraoss.co.jp>
SRA OSS, Inc. Japan


pgsql-jp メーリングリストの案内