このトピックでは、Hologres で標準の PostgreSQL 認可モデルに基づいて権限を付与するためのベストプラクティスについて説明します。これは、認可を簡素化し、権限をきめ細かく管理するのに役立ちます。
背景情報
Hologres は PostgreSQL と互換性があり、標準の PostgreSQL 認可モデルをサポートしています。Hologres は、簡易権限モデル (SPM) も提供しています。詳細については、「概要」をご参照ください。
ただし、SPM は権限を粗く管理します。標準の PostgreSQL 認可モデルは、権限をきめ細かく管理します。権限をきめ細かく管理する必要がある場合は、このトピックの「ベストプラクティス 1」セクションと「ベストプラクティス 2」セクションを参照してください。
概要
標準の PostgreSQL 認可モデルには、詳細な権限管理システムがあります。詳細については、「PostgreSQL 認可」をご参照ください。
標準の PostgreSQL 認可モデルには、次の制限があります。
PostgreSQL の権限は、既存のオブジェクトにのみ適用され、新しいオブジェクトには適用されません。 例:
User1 は、
GRANT SELECT ON ALL TABLES IN SCHEMA public TO User2;ステートメントを実行して、public スキーマ内のすべてのテーブルを選択する権限を User2 に付与します。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 は、ユーザーまたは権限グループにすることができます。
\ddpコマンドを実行して、ALTER DEFAULT PRIVILEGESステートメントが有効になっているかどうかを確認できます。デフォルトの権限は、pg_catalog.pg_default_aclカタログに格納されます。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 に変更すると、比較中に一致するものが見つかります。その後、権限がテーブルに自動的に付与されます。
テーブルの所有者のみがテーブルを削除できます。
現在のロールに基づいて、テーブルを削除できるかどうかを決定できます。次のロールのみが DELETE 権限を持っています。
テーブルの所有者
テーブルが属するスキーマの所有者
スーパーユーザー
デフォルトでは、テーブルを作成したユーザーがテーブルの所有者になります。ユーザーは、DELETE 権限を含む、テーブルに対するすべての権限を持っています。
次のステートメントの例は、テーブルを新しい所有者に割り当てるために使用されます。
ALTER TABLE <tablename> OWNER TO user2; // テーブルの所有者を User1 から User2 に変更します。 ALTER TABLE <tablename> OWNER TO group1;// テーブルの所有者を Group1 に変更します。テーブルを新しい所有者に割り当てるときは、次の制限が適用されます。
User1 がテーブルの所有者である。
User1 が Group1 に直接的または間接的に属している。
たとえば、User1 が Group1 のメンバーであるか、User1 が Group1 内のグループのメンバーである。
Group1 がスキーマにテーブルを作成する権限を持っている。
スーパーユーザーは、テーブルを新しい所有者に割り当てることができる。
計画
標準の PostgreSQL 認可モデルを使用して権限を管理する前に、次の項目を計画する必要があります。
権限グループの総数
権限グループの権限
各権限グループ内のユーザー
テーブルを削除できるロールとテーブルを削除できるタイミング
権限グループが属するスキーマ
権限を管理する前に、次の操作を実行することをお勧めします。
権限グループを作成し、権限を付与する。
権限グループは、次のタイプに分けられます。
XX_DEV_GROUP:テーブルの所有者。所有者は、テーブルに対するすべての権限を持っています。
XX_WRITE_GROUP:テーブルにデータを書き込む権限。
XX_VIEW_GROUP:テーブル内のデータを表示する権限。
XX はプロジェクトを示します。たとえば、PROJ1 プロジェクトの権限グループには、PROJ1_DEV_GROUP、PROJ1_WRITE_GROUP、PROJ1_VIEW_GROUP が含まれます。
説明上記の命名形式は参考用です。
権限グループにスキーマを割り当てる。
プロジェクトの権限グループにスキーマを割り当てることをお勧めします。
各 DEV_GROUP 権限グループは複数のテーブルを所有できます。ただし、各テーブルは 1 つの DEV_GROUP 権限グループにのみ属することができます。たとえば、TABLE1 は PROJ1_DEV_GROUP にのみ属することができます。
各ユーザーは複数の権限グループに属することができます。たとえば、User1 は PROJ1_DEV_GROUP と PROJ2_DEV_GROUP に属することができます。
ベストプラクティス 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 に属しているとします。次のステートメントを例として使用します。
schema1 に対するすべての権限を PROJ1 に付与します。 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;説明各プロジェクトは複数のスキーマに属することができます。各スキーマは複数のプロジェクトを持つことができます。
デフォルトでは、public スキーマのすべてのユーザーは、CREATE 権限と USAGE 権限を持っています。
ユーザーを作成し、権限グループを管理します。
スーパーユーザーとして権限グループに権限を付与した後、ユーザーを作成して権限グループに追加する必要があります。次のステートメントを例として使用します。
CREATE USER "USER1"; GRANT PROJ1_DEV_GROUP TO "USER1"; CREATE USER "USER2"; GRANT PROJ1_VIEW_GROUP TO "USER2";テーブルを作成し、テーブルに対する権限をユーザーに付与します。
テーブルを作成するときは、所有者またはスーパーユーザーがテーブルに対する権限をユーザーに付与する必要があります。所有者は PROJ1_DEVE_GROUP のメンバーである必要があることに注意してください。この例では、テーブルは 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 に割り当てます。
ベストプラクティス 2
この例では、ALTER DEFAULT PRIVILEGES ステートメントを使用します。
作成したテーブルが属するプロジェクトを事前に決定する必要があります。次の手順を実行します。
権限グループを作成します。
ニーズに応じて、スーパーユーザーとして権限グループを作成できます。プロジェクト名が PROJ1 であるとします。次のステートメントを例として使用します。
CREATE ROLE PROJ1_DEV_GROUP; テーブルの所有者。所有者は、テーブルに対するすべての権限を持っています。 CREATE ROLE PROJ1_WRITE_GROUP; // テーブルにデータを書き込む権限。 CREATE ROLE PROJ1_VIEW_GROUP; // テーブル内のデータを表示する権限。スキーマに対する権限を権限グループに付与します。
作成した権限グループにスキーマに対する権限を付与する必要があります。PROJ1 が schema1 に属しているとします。次のステートメントを例として使用します。
schema1 に対するすべての権限を PROJ1 に付与します。 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;説明各プロジェクトは複数のスキーマに属することができます。各スキーマは複数のプロジェクトを持つことができます。
デフォルトでは、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 に追加します。テーブルを新しい所有者に割り当てます。
PROJ1_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ステートメントを再度実行してデフォルトの権限を付与する必要があります。プロジェクトが変更されても、テーブルは影響を受けません。ステートメントの例:
現在のプロジェクトに付与されているデフォルトの権限を取り消します。 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;