このトピックでは、Hologres で PostgreSQL の標準権限モデル (エキスパート権限モデルとも呼ばれます) を使用して権限を付与するためのベストプラクティスについて説明します。これらのプラクティスは、権限操作を簡素化し、きめ細かい権限管理を可能にするのに役立ちます。
背景情報
Hologres は PostgreSQL エコシステムと互換性があり、PostgreSQL の標準権限モデル (エキスパート権限モデルと呼ばれます) をサポートしています。Hologres は、権限付与のための簡易権限モデル (SPM) も提供しています。詳細については、「簡易権限モデル (SPM)」をご参照ください。
簡易権限モデルは粗い粒度の権限を使用するため、きめ細かい権限コントロールが必要なシナリオには適していません。PostgreSQL の標準権限モデルは、詳細な権限の粒度を提供します。きめ細かい権限管理が必要な場合は、このトピックのベストプラクティスに従ってください。
PostgreSQL 権限モデルの概要
PostgreSQL の標準権限モデルは、詳細な権限管理システムを提供します。詳細については、「PostgreSQL authorization」をご参照ください。
PostgreSQL の権限付与には、次の制限事項があります:
-
PostgreSQL の権限付与は既存のオブジェクトにのみ適用され、将来のオブジェクトには影響しません。この動作について、以下の例で説明します。
-
User1 は、
GRANT SELECT ON ALL TABLES IN SCHEMA public TO User2;文を実行して、User2 に [public] スキーマ内のすべてのテーブルに対する SELECT 権限を付与します。 -
User1 は [public] スキーマに新しいテーブル table_new を作成します。
-
User2 が文
SELECT * FROM table_newを実行すると、システムはエラーPermission deniedを返します。前述のエラーが発生するのは、User1 が User2 に SELECT 権限を付与した際、その権限の対象が、付与時点で [public] スキーマに存在していたテーブルに限定され、その後 [public] スキーマに作成されたテーブルは対象に含まれなかったためです。
-
-
ALTER DEFAULT PRIVILEGES文を使用して、将来のオブジェクトに対するデフォルトの権限を設定できます。詳細については、「ALTER DEFAULT PRIVILEGES」をご参照ください。これらの権限は、将来のオブジェクトにのみ適用されます。次の例は、この文の使用方法を示しています。ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC; -- 現在のユーザーに対し、public スキーマで新規作成されたテーブルの読み取り権限を付与します。ALTER DEFAULT PRIVILEGES FOR ROLE xxx文を使用して、他のロールに対するデフォルトの権限を作成することもできます。現在のユーザーと xxx が次の条件を満たしている場合にのみ、デフォルトの権限を正常に設定できます:-
現在のユーザーがグループ xxx のメンバーである。
-
現在のユーザーがスーパーユーザーであり、xxx がユーザーまたはグループである。
psql コマンド
\ddp(システムテーブルpg_catalog.pg_default_aclをクエリします) を使用して、ALTER DEFAULT PRIVILEGESが正しく設定されているかどうかを確認できます。ALTER DEFAULT PRIVILEGESはトリガーのように機能します。新しいテーブルが作成されると、Hologres は現在のユーザーとスキーマに基づいて、pg_catalog.pg_default_aclシステムテーブルで一致するルールをチェックします。一致するものが見つかった場合、システムは自動的にそのルールを適用します。説明-
照合には現在のユーザーのみが使用され、ユーザーのグループは使用されません。
-
alter default privilegesルールは、テーブルが作成されるときにのみ評価されます。後でテーブルの所有者を変更しても (alter table tablename owner toを使用)、alter default privilegesはトリガーされません。
たとえば、User1 が Group1 に属しており、将来のテーブルに対する完全な権限を Group1 に付与したいとします。次のケースを考えてみましょう:
-
現在のユーザーが User1 の場合、テーブル作成時に一致するルールはありません。
-
テーブルを作成する前に
set session role group1;を実行して現在のユーザーを Group1 に切り替えると、ルールが一致し、システムは新しいテーブルに自動的に権限を付与します。
-
-
テーブルの所有者のみがテーブルを削除できます。
PostgreSQL の標準権限付与では、ロールがテーブルを削除できるかどうかは所有権に基づいて判断されます。次のロールがテーブルを削除できます:
-
テーブルの所有者 (テーブルを作成したユーザー)。
-
スキーマの所有者。
-
スーパーユーザー。
-
-
PostgreSQL では、新しく作成されたテーブルの所有権は、作成したユーザーに自動的に割り当てられます。そのユーザーは、テーブルの削除権限を含むすべての権限を保持します。
テーブルの所有者を変更するには、次のような文を使用します:
ALTER TABLE <tablename> OWNER TO user2; // テーブルの所有者を User1 から User2 に変更します。 ALTER TABLE <tablename> OWNER TO group1;// テーブルの所有者を Group1 に変更します。テーブルの所有者の変更には、次の制限があります:
-
User1 が現在のテーブルの所有者である必要があります。
-
User1 が Group1 の直接または間接的なメンバーである必要があります。
たとえば、User1 は Group1 の直接のメンバーであるか、Group1 内のサブグループのメンバーです。
-
Group1 がテーブルを含むスキーマに対する CREATE 権限を持っている必要があります。
-
スーパーユーザーは、任意のテーブルの所有者を変更できます。
-
PostgreSQL 権限モデルの計画
PostgreSQL の標準権限モデル (エキスパート権限モデル) は、きめ細かい権限を提供します。使用する前に、ご利用のインスタンスのオブジェクトに対する権限を次のように計画してください:
-
権限グループは全部でいくつありますか?
-
各グループの目的は何ですか?
-
どのユーザーが各グループに属しますか?
-
どのロールがいつテーブルを削除できますか?
-
各グループはどのスキーマで作業しますか?
インスタンスオブジェクトを計画するには、次の手順を推奨します:
-
権限グループとその目的の定義
権限グループは次のタイプに分類されます:
-
XX_DEV_GROUP: テーブルに対する完全な権限を持つテーブルの所有者。
-
XX_WRITE_GROUP: 特定のテーブルにデータを挿入するための書き込み権限。
-
XX_VIEW_GROUP: 特定のテーブルのデータを表示するための読み取り権限。
XX はプロジェクトを表します。たとえば、PROJ1 プロジェクトには、PROJ1_DEV_GROUP、PROJ1_WRITE_GROUP、PROJ1_VIEW_GROUP グループが含まれます。
説明グループの命名規則は推奨事項であり、必須ではありません。
-
-
各権限グループのスキーマの決定
プロジェクトごとに 1 つのスキーマを割り当てることを推奨します。
DEV_GROUP は複数のテーブルを所有できますが、各テーブルは 1 つの DEV_GROUP にのみ属します。たとえば、TABLE1 が PROJ1_DEV_GROUP に属している場合、PROJ2_DEV_GROUP には属せません。
ユーザーは複数の DEV_GROUP に属することができます。たとえば、User1 は PROJ1_DEV_GROUP と PROJ2_DEV_GROUP の両方のメンバーになることができます。
Hologres エキスパート権限モデルのベストプラクティス 1
このプラクティスでは、テーブルを例として使用します。他のオブジェクトにも同じアプローチを適用できます。
テーブルの所有者は、対応する XXX_DEV_GROUP です。したがって、DEV_GROUP のどのメンバーでもテーブルを管理または削除できます。
たとえば、ユーザーが PROJ1_DEV_GROUP に追加されると、PROJ1 プロジェクト内のテーブルを管理または削除する権限を取得します。次の手順に従ってください:
-
ユーザーグループの作成
ビジネスニーズに基づいて権限を分割し、スーパーユーザーに必要なグループを作成させます。PROJ1 プロジェクトの場合、次の文を実行します:
CREATE ROLE PROJ1_DEV_GROUP; // テーブルに対する完全な権限を持つテーブルの所有者。 CREATE ROLE PROJ1_WRITE_GROUP; // 特定のテーブルにデータを挿入するための書き込み権限。 CREATE ROLE PROJ1_VIEW_GROUP; // 特定のテーブルのデータを表示するための読み取り権限。 -
ユーザーグループへのスキーマ権限の付与
新しく作成されたグループにスキーマの権限を付与します。たとえば、PROJ1 が SCHEMA1 で動作する場合、次の文を実行します:
-- PROJ1 に SCHEMA1 の関連権限を付与します。 GRANT CREATE,usage ON schema SCHEMA1 TO PROJ1_DEV_GROUP; GRANT usage ON schema SCHEMA1 TO PROJ1_WRITE_GROUP; GRANT usage ON schema SCHEMA1 TO PROJ1_VIEW_GROUP;説明-
1 つのプロジェクトが複数のスキーマに対応することも、1 つのスキーマが複数のプロジェクトに対応することもあります。
-
デフォルトでは、すべてのユーザーに [public] スキーマの CREATE および USAGE 権限が付与されています。
-
-
ユーザーの作成とユーザーグループの管理
スキーマ権限を付与した後、スーパーユーザーはユーザーを作成し、適切なグループに追加する必要があります。次の文を実行します:
CREATE USER "USER1"; GRANT PROJ1_DEV_GROUP TO "USER1"; CREATE USER "USER2"; GRANT PROJ1_VIEW_GROUP TO "USER2"; -
テーブルの作成と権限の付与
テーブルやその他のオブジェクトを作成するとき、作成者 (PROJ1_DEV_GROUP のメンバーである必要があります) またはスーパーユーザーが必要な grant 文を実行します。新しいテーブルの名前が TABLE1 であると仮定します。次の文を実行します:
GRANT ALL ON TABLE SCHEMA1.TABLE1 TO PROJ1_WRITE_GROUP; // TABLE1 に対する書き込み権限を PROJ1_WRITE_GROUP に付与します。 GRANT SELECT ON TABLE SCHEMA1.TABLE1 TO PROJ1_VIEW_GROUP; // TABLE1 に対する SELECT 権限を PROJ1_VIEW_GROUP に付与します。 ALTER TABLE SCHEMA1.TABLE1 owner TO PROJ1_DEV_GROUP; // TABLE1 の所有者を PROJ1_DEV_GROUP に変更します。
Hologres エキスパート権限モデルのベストプラクティス 2
このプラクティスでは、ALTER DEFAULT PRIVILEGES 文を使用して、テーブルごとの権限付与を簡素化します。
新しく作成されたテーブルがどのプロジェクトに属するかを事前に決定します。次の手順に従ってください:
-
ユーザーグループの作成
ビジネスニーズに基づいて権限を分割し、スーパーユーザーに必要なグループを作成させます。PROJ1 プロジェクトの場合、次の文を実行します:
CREATE ROLE PROJ1_DEV_GROUP; // テーブルに対する完全な権限を持つテーブルの所有者。 CREATE ROLE PROJ1_WRITE_GROUP; // 特定のテーブルにデータを挿入するための書き込み権限。 CREATE ROLE PROJ1_VIEW_GROUP; // 特定のテーブルのデータを表示するための読み取り権限。 -
ユーザーグループへのスキーマ権限の付与
新しく作成されたグループにスキーマの権限を付与します。たとえば、PROJ1 が SCHEMA1 で動作する場合、次の文を実行します:
-- PROJ1 に SCHEMA1 の関連権限を付与します。 GRANT CREATE,USAGE ON SCHEMA SCHEMA1 TO PROJ1_DEV_GROUP; GRANT USAGE ON SCHEMA SCHEMA1 TO PROJ1_WRITE_GROUP; GRANT USAGE ON SCHEMA SCHEMA1 TO PROJ1_VIEW_GROUP;説明-
1 つのプロジェクトが複数のスキーマに対応することも、1 つのスキーマが複数のプロジェクトに対応することもあります。
-
デフォルトでは、すべてのユーザーは [public] スキーマで CREATE および USAGE 権限を持ちます。
-
-
ユーザーの作成とデフォルト権限の設定
スキーマ権限を付与した後、スーパーユーザーはユーザーを作成し、適切なグループに追加し、彼らが作成するテーブルに対するデフォルトの権限を設定します。
USER1 によって作成されたテーブルは、デフォルトで PROJ1_DEV_GROUP に属し、USER1 は有効な Alibaba Cloud アカウントです。次の文を実行します:
CREATE USER "USER1"; ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT ALL ON TABLES TO PROJ1_DEV_GROUP; // USER1 が作成したテーブルに対する読み取りおよび書き込み権限を、デフォルトで PROJ1_DEV_GROUP に付与します。 ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT ALL ON TABLES TO PROJ1_WRITE_GROUP; // USER1 が作成したテーブルに対する読み取りおよび書き込み権限を、デフォルトで PROJ1_WRITE_GROUP に付与します。 ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT SELECT ON TABLES TO PROJ1_VIEW_GROUP; // USER1 が作成したテーブルに対する読み取り権限を、デフォルトで PROJ1_VIEW_GROUP に付与します。 GRANT PROJ1_DEV_GROUP TO "USER1"; // USER1 を PROJ1_DEV_GROUP に追加します。 -
テーブル所有者の変更
DEV_GROUP の他のメンバーがテーブルを管理または削除する必要がある場合は、テーブルの所有者をプロジェクトの DEV_GROUP (たとえば、PROJ1_DEV_GROUP) に変更します。
テーブルの作成者またはスーパーユーザーのみが、テーブルの所有者を変更する文を実行できます。この例では、作成者は PROJ1_DEV_GROUP のメンバーである必要があります。新しいテーブルの名前が TABLE1 であると仮定します。次の文を実行します:
ALTER TABLE SCHEMA1.TABLE1 OWNER TO PROJ1_DEV_GROUP; // TABLE1 の所有者を PROJ1_DEV_GROUP に変更します。次の状況でテーブルの所有者を変更できます:
-
スーパーユーザーが定期的に新しく作成されたテーブルの所有者を変更する。
-
テーブルを管理または削除する前に所有者を変更する。
説明テーブルの作成者またはスーパーユーザーのみがテーブルを管理または削除することがわかっている場合は、この手順をスキップできます。
-
-
ユーザーのデフォルトプロジェクトの変更
ユーザーのデフォルトプロジェクトを変更するには、スーパーユーザーまたはユーザーが
alter default privilegesコマンドを実行して既存のデフォルト権限を取り消し、新しいalter default privileges文を使用して新しいデフォルト権限を作成します。USER1 のデフォルトプロジェクトを PROJ1 から PROJ2 に変更する (既存のテーブルには影響しません) には、次の文を実行します:
-- 既存のデフォルト権限を取り消します。 ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" REVOKE ALL ON TABLES FROM PROJ1_DEV_GROUP; ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" REVOKE ALL ON TABLES FROM PROJ1_WRITE_GROUP; ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" REVOKE SELECT ON TABLES FROM PROJ1_VIEW_GROUP; -- 新しいデフォルト権限を作成します。 ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT ALL ON TABLES TO PROJ2_DEV_GROUP; ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT ALL ON TABLES TO PROJ2_WRITE_GROUP; ALTER DEFAULT PRIVILEGES FOR ROLE "USER1" GRANT SELECT ON TABLES TO PROJ2_VIEW_GROUP;