Postgresqlデータベース権限機能の概要

5034 ワード

Postgresqlデータベース権限機能の概要
Postgresqlデータベースは柔軟な権限管理をサポートし、あるテーブルに対するロール(グループ、ユーザー)の読み取り、書き込み、更新、削除などの操作権限、ある関数を実行する権限、および操作(使用、更新など)ビュー、シーケンスの権限を制御できます.
PGの権限管理機能は比較的強力で、1枚の表の各フィールドに細分化することができ、例えばユーザーが1枚の表のパスワードフィールドにアクセスすることを禁止するなど、後で詳細な説明を与えることができる.
PGデータベースではユーザー、ロールをロールと統一し、文を作成することもcreate role XXXと呼ばれていますが、ユーザーとロールの間には一定の違いがあります.ここでは,登録権限を持つものをユーザと呼び,登録権限を持たないものをロールと呼び,この方式で区別する.
実際,PgAdmin管理ツールでは,ユーザとロールの違いが見られ,ログイン権限のないものはグループロールの下に置かれ,ログイン権限のあるものはログインロールの下に置かれる.
基本権限
データベースの作成、スーパーユーザーの作成、ロールの作成など、ユーザーとロールに基本的な権限を付与できます.たとえば、ユーザーを作成する文は次のとおりです.
CREATE ROLE guest LOGIN
  NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

上記のRole guestはLOGINの権限を持っているので、ユーザーと呼ばれます.
ロールを作成する文は次のとおりです.
CREATE ROLE "group"
  NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

ここはLOGIN権限がないのでキャラクターです.
上記のロールとユーザーの作成文には、スーパーユーザー、データベースの作成などの権限が付与されていません.
データベース・オブジェクト権限の操作
データベース・オブジェクトの操作権限には、ログイン権限のないロールのみが付与され、ログイン権限を持つユーザーには直接付与されません.
では、ログインユーザーがデータベース・オブジェクトを操作する権限をどのように制御するかという問題があります.
答えは、ユーザーをロールのメンバーにすることです.この場合、ユーザーはロールの権限を持つことができ、ログインユーザーがデータベース・オブジェクトを操作する権限をさらに制限します.
上記のロールグループをguestユーザーに付与すると、
GRANT "group" TO guest;

その後guestユーザはgroupロールが持つデータベースオブジェクト権限を持つ.
たとえばgroupロールを制御するにはclassテーブルに対してのみInsert操作を実行できます.
GRANT INSERT ON TABLE class TO "group";

この場合guestユーザを使用してデータをログインすると、テーブルclassに対してinsert操作しか実行できず、delete、updateなどの操作は実行できません.サンプルコードは、guestユーザーを使用してログインし、TESTデータベースの下のclassテーブルにアクセスします.
Server [localhost]:
Database [postgres]:
Port [5433]:
Username [postgres]: guest
   guest    :
psql (9.4.5)
   "help"        .

postgres=> \c TEST
            "TEST",   "guest".
TEST=> select * from class;
ERROR:  permission denied for relation class
TEST=> insert into class values(2,'class1');
INSERT 0 1

上記の結果からguestユーザはclassテーブルをクエリーする権限がありませんが、データベースを挿入できます.なぜならgroupロールにclassテーブルのinsert権限のみが付与され、guestユーザーはclassテーブルのinsert権限のみが付与されるからです.
前述したPGの権限管理はテーブルのフィールドに細分化でき,classテーブルとguestユーザで実験を継続する.
TEST=> \c postgres postgres;
            "postgres",   "postgres".
postgres=# \c TEST;
            "TEST",   "postgres".
TEST=# grant select(num) on class to "group";
GRANT
TEST=# \echo    postgres    TEST   , class  num   select    group  
   postgres    TEST   , class  num   select    group  

TEST=# \c TEST guest
   guest    :
            "TEST",   "guest".
TEST=> \echo    guest    TEST   
   guest    TEST   

TEST=> select * from class;
ERROR:  permission denied for relation class
TEST=> select num from class;
 num
-----
   1
   2
(2    )

上記の結果からguestユーザは依然としてclassテーブルをクエリーする権限を持っていないが,classテーブルのnumフィールドをクエリーする権限を持っていることがわかる.
PGデータベースでは単に操作テーブルの権限を制御するだけでなく、シーケンス、関数、ビューなどの他のデータベースオブジェクトも制御できます.従ってPGの権限制御機能は非常に強力である.