Hologres は PostgreSQL と互換性があり、エキスパート権限モデルと呼ばれる同じ認可システムを使用します。標準の PostgreSQL ステートメントを実行することで、ユーザー権限を付与および取り消すことができます。
権限の付与
Hologres は、ロール管理のための OpenAPI 操作を提供していません。OpenAPI を介してロールを作成、変更、または削除することはできません。SQL ステートメントを実行してロールを管理します。JDBC や psql などのクライアントでインスタンスに接続するか、ExecuteStatement API を呼び出して OpenAPI 経由で SQL を実行します。この API は DDL ステートメントをサポートします。使用する前に、インスタンスの SQL 実行を有効にし、呼び出し元に必要な権限を付与する必要があります。
アカウントと権限については、Hologres OpenAPI は、ユーザー管理操作 (CreateUser および DropUser) と、データベース、スキーマ、テーブルの各レベルで権限を付与または取り消す操作 (GrantDatabasePermission、GrantSchemaPermission、GrantTablePermission、および対応する Revoke 操作) のみを提供します。すべての操作の一覧については、「API の概要」をご参照ください。
Hologres インスタンスを開発ツールに接続した後、SQL ステートメントを実行してユーザーに権限を付与できます。
-
ユーザーの作成
Hologres でのアクセスと開発を行うには、まずアカウントを Hologres ユーザーとして作成する必要があります。
ユーザーを作成するための構文は次のとおりです:
-- Hologres インスタンスにログインする権限を持つユーザーを作成します。RAM ユーザーに権限を付与する場合は、RAM ユーザーに必要な形式を使用します。 CREATE USER "Alibaba Cloud account ID/email address"; -- ユーザーを作成し、スーパーユーザー権限を付与します。 CREATE USER "Alibaba Cloud account ID/email address" SUPERUSER;以下の例を参考にしてユーザーを作成できます。Alibaba Cloud アカウントと RAM ユーザーの形式の詳細については、「アカウント概要」をご参照ください。
-- Alibaba Cloud アカウント ID を使用してユーザーを作成します。 CREATE USER "11822780xxx"; -- RAM ユーザーにスーパーユーザー権限を付与します。 CREATE USER "p4_1822780xxx" SUPERUSER;ロールの作成の詳細については、「CREATE ROLE」をご参照ください。
-
権限の付与
Hologres ユーザーを作成した後、権限を付与する必要があります。エキスパート権限モデルを使用すると、データベース、テーブル、ビュー、および列レベルで権限を制御できます。
説明標準的な PostgreSQL 権限モデルでは、既存のオブジェクトにのみ権限を付与できます。これらの権限は、付与後に作成されたオブジェクトには適用されません。たとえば、ユーザー A が [public スキーマ] 内のすべてのテーブルに対する SELECT 権限をユーザー B に付与した後に新しいテーブルを作成した場合、ユーザー B はその新しいテーブルに対する SELECT 権限を持ちません。ユーザー A は、新しいテーブルに対する権限を明示的に付与する必要があります。
説明
構文例
必須
Hologres インスタンスにログインする権限を持つユーザーを作成
CREATE USER "Alibaba Cloud account ID/email address";必須
ユーザーを作成し、スーパーユーザー権限を付与
CREATE USER "Alibaba Cloud account ID/email address" SUPERUSER ;オプション
スキーマに対する CREATE 権限を付与
GRANT CREATE ON SCHEMA schema_name TO "Alibaba Cloud account ID/email address";オプション
スキーマに対する USAGE 権限を付与
GRANT USAGE ON SCHEMA schema_name TO "Alibaba Cloud account ID/email address";必須
説明ユーザーがスキーマのテーブルをクエリするには、そのスキーマに対する USAGE 権限が必要です。
public スキーマ 内のすべてのテーブルに対する SELECT、INSERT、UPDATE 権限をすべてのユーザーに付与
GRANT SELECT,INSERT,UPDATE ON ALL TABLES IN SCHEMA public to PUBLIC;オプション
テーブルに対する SELECT 権限をユーザーに付与
GRANT SELECT ON TABLE <tablename> TO "Alibaba Cloud account ID/email address";オプション
grant option 付きで、テーブルに対する SELECT 権限をユーザーに付与
GRANT SELECT ON TABLE <tablename> TO "Alibaba Cloud account ID/email address" WITH GRANT OPTION;オプション
public スキーマ 内のすべてのテーブルに対する SELECT 権限をユーザーに付与
GRANT SELECT ON ALL TABLES IN SCHEMA public TO "Alibaba Cloud account ID/email address";オプション
publicスキーマ内で現在のロールによって今後作成されるテーブルに対する SELECT 権限をすべてのユーザーに付与。ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC;オプション
一般ユーザーをスーパーユーザーに変更
ALTER USER "Alibaba Cloud account ID/email address" SUPERUSER;オプション
スーパーユーザーを一般ユーザーに変更
ALTER USER "Alibaba Cloud account ID/email address" NOSUPERUSER;オプション
テーブルの所有権を別のユーザーに譲渡
ALTER TABLE <tablename> OWNER TO "Alibaba Cloud account ID/email address";オプション
ログイン権限のないロールを作成
CREATE ROLE "Alibaba Cloud account ID/email address";オプション
ロールをユーザーに付与
GRANT <rolename> TO "Alibaba Cloud account ID/email address" ;オプション
テーブルの特定の列に対する SELECT 権限をユーザーに付与
GRANT SELECT (<column1>,<column2>,<column3>,...) ON TABLE <tablename> TO "Alibaba Cloud account ID/email address" ;オプション
ビューに対する SELECT 権限をユーザーに付与
説明-
標準 PostgreSQL 権限モデルでは、ビューにアクセスするには SELECT 権限を付与する必要があります。
-
簡易権限モデル (SPM) /スキーマレベル権限モデル (SLPM) では、ビューにアクセスするには、viewer ユーザーグループまたはそれより高い権限を持つユーザーグループのメンバーである必要があります。
-- 標準 PostgreSQL 権限モデルを使用して、ビューに対する SELECT 権限をユーザーに付与します。 GRANT SELECT ON <viewname> TO "Alibaba Cloud account ID/email address" ;オプション
新しいユーザーにテーブルに対する SELECT 権限を付与するには、次のステートメントを実行します:
CREATE USER "Alibaba Cloud account ID/email address"; GRANT USAGE ON SCHEMA <schema_name> TO "Alibaba Cloud account ID/email address"; GRANT SELECT ON TABLE <tablename> TO "Alibaba Cloud account ID/email address";CREATE ROLE ステートメントは、ユーザーグループや特定のタイプのユーザーを表す仮想ロールなど、ログイン権限のないロールを作成します。権限の付与に関する詳細については、「GRANT」をご参照ください。
-
-
テーブルの削除
テーブルを削除できるのは、スーパーユーザーまたはテーブルの所有者のみです。ユーザーにテーブルを削除する権限を付与するには、次のいずれかの方法を使用します:
-
テーブルの所有権を新しいユーザーに譲渡します。
ALTER TABLE TABLENAME OWNER TO "Alibaba Cloud account ID/email address"; -
新しいユーザーにスーパーユーザー権限を付与します。
ALTER USER "Alibaba Cloud account ID/email address" SUPERUSER; -
複数のユーザーをユーザーグループに追加し、テーブルの所有権をそのユーザーグループに譲渡します。
CREATE USER "Alibaba Cloud account ID/email address"; CREATE ROLE <rolename>; GRANT <rolename> TO "Alibaba Cloud account ID/email address"; ALTER TABLE <tablename> OWNER TO <rolename>;
-
今後作成されるテーブルのデフォルト権限
デフォルトでは、標準 PostgreSQL 権限モデルは今後作成されるテーブルに権限を付与しません。これを行うには、ALTER DEFAULT PRIVILEGES ステートメントを使用する必要があります。
-
このステートメントは、既存の論理オブジェクトには影響しません。
-
このステートメントは、テーブル、スキーマ、関数、シーケンス、または型に対してのみデフォルト権限を設定できます。
-
権限の付与
-
デフォルト権限を設定すると、特定のスキーマ内でユーザーが作成したテーブルを、指定されたユーザーまたはすべてのユーザーがクエリできるようになります。
-
このステートメントを実行すると、すべてのユーザーは、ユーザー p4_id1 が public スキーマで今後作成するテーブルをクエリできるようになります。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC; -
このステートメントを実行すると、ユーザー p4_id2 は、ユーザー p4_id1 が public スキーマで今後作成するテーブルをクエリできるようになります。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public GRANT SELECT ON TABLES TO "p4_id2"; -
このステートメントを実行すると、すべてのユーザーは、ユーザー p4_id1 が test スキーマで今後作成するテーブルをクエリできるようになります。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA test GRANT SELECT ON TABLES TO PUBLIC;
-
-
デフォルト権限を取り消すには、次の SQL ステートメントを実行します:
-
ユーザー p4_id1 が public スキーマで今後作成するテーブルに対するデフォルトの SELECT 権限を、すべてのユーザーから取り消します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public REVOKE SELECT ON TABLES FROM PUBLIC; -
ユーザー [p4_id2] から、[public スキーマ] 内でユーザー [p4_id1] が今後作成するテーブルに対するデフォルトの SELECT 権限を取り消します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public REVOKE SELECT ON TABLES FROM "p4_id2"; -
ユーザー p4_id1 が test スキーマで今後作成するテーブルに対するデフォルトの SELECT 権限を、すべてのユーザーから取り消します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA test REVOKE SELECT ON TABLES FROM PUBLIC;
-
-
-
デフォルト権限の設定確認
-
psql クライアントで、\ddp コマンドを実行して、ALTER DEFAULT PRIVILEGES ステートメントが成功したことを確認します。
-
Hologres で次の SQL ステートメントを実行して、結果を直接クエリします:
SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS "Owner", n.nspname AS "Schema", CASE d.defaclobjtype WHEN 'r' THEN 'table' WHEN 'S' THEN 'sequence' WHEN 'f' THEN 'function' WHEN 'T' THEN 'type' WHEN 'n' THEN 'schema' END AS "Type", pg_catalog.array_to_string(d.defaclacl, E'\n') AS "Access privileges" FROM pg_catalog.pg_default_acl d LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace ORDER BY 1, 2, 3;
新しいテーブルが作成されると、Hologres は現在のユーザーとスキーマを pg_catalog.pg_default_acl システムカタログと照合します。一致する ALTER DEFAULT PRIVILEGES ルールが見つかった場合、そのルールが新しいテーブルに適用されます。現在のユーザーは次のように決定されます:
-
現在のロールがユーザーである場合、テーブル作成時にそのユーザーが照合に使用されます。
-
ユーザーがテーブルを作成する前に
SET SESSION ROLE GROUP1;ステートメントを実行すると、現在のロールは GROUP1 に変更されます。この場合、 GROUP1 が照合に使用されます。
照合ルールは、テーブルが作成されたときにのみトリガーされます。テーブルの作成後に
ALTER TABLE SET OWNER TOステートメントを実行してテーブルの所有者を変更した場合、照合ルールはトリガーされません。 -
権限の取り消し
ユーザーから権限を取り消すには、REVOKE ステートメントを実行します。権限の取り消しの詳細については、「REVOKE」をご参照ください。
スキーマ権限を取り消す前に、そのアカウントが DataWorks でスケジュールされたジョブを所有しているかどうかを確認してください。所有している場合は、まず DataWorks 運用センターを介して、それらのジョブをアクティブで承認済みのアカウントに再割り当てしてください。そうしないと、ジョブは次回の実行時に permission denied for schema エラーで失敗します。
REVOKE SELECT ON TABLE tablename FROM "Alibaba Cloud account ID/email address" ; -- RAM ユーザーから権限を取り消す場合は、RAM ユーザーに必要な形式を使用します。
システムカタログの権限
Hologres V3.0 以降、データベースに接続したすべてのユーザーは、pg_class、pg_attribute、および pg_namespace システムカタログをクエリすることで、すべてのスキーマとテーブルに関する情報を表示できます。これは特に、これらのシステムカタログからスキーマ、テーブル、列のリストを自動的に取得する BI ツールや開発ツールで接続する場合に当てはまります。メタデータの可視性を認可されたユーザーのみに制限するため、Hologres V3.0.23 以降のバージョンでは、これら 3 つのシステムカタログに対する行レベルのセキュリティ (RLS) をサポートしています。次の GUC パラメーターを設定することで RLS を有効にできます。
-
この GUC パラメーターは、pg_class、pg_attribute、および pg_namespace システムカタログのみを制御します。
-
スーパーユーザーは、データベースごとにこのステートメントを 1 回実行する必要があります。
-
これを設定すると、スーパーユーザー、オブジェクトの所有者、またはオブジェクト (テーブルまたはスキーマ) に対するいずれかの権限を持つユーザーのみが、対応するメタデータを表示できます。他のユーザーはメタデータを表示できません。
-- スーパーユーザーによって設定されます。
ALTER DATABASE <database_name> SET hg_experimental_enable_catalog_rls = on;
システムカタログの詳細については、「システムカタログ」をご参照ください。
権限の表示
次の SQL ステートメントを実行して、ユーザーのロールと権限を表示します:
SELECT ROLNAME FROM pg_roles;
SELECT user_display_name(ROLNAME) FROM pg_roles;
ユーザーの削除
開発ツールに接続されたインスタンスからユーザーを削除するには、SQL ステートメントを実行します。手順はユーザーの種類によって異なります:
-
一般ユーザーの削除
テーブル、ビュー、拡張機能などのオブジェクトを作成していない一般ユーザーを削除するには、次のステートメントを実行するか、HoloWeb コンソールでユーザーを削除します:
drop user "Alibaba Cloud account ID/email address"; -
スーパーユーザーなどの管理者の削除
オブジェクトを所有する管理者 (スーパーユーザーなど) を削除するには、まずそれらのオブジェクトの所有権を譲渡する必要があります。そのようなユーザーを直接削除しようとすると、エラーが発生します。次のステートメントを実行します:
-- アカウント A が所有するオブジェクトをアカウント B に譲渡します。 reassign owned by "Alibaba Cloud account ID of A/email address" to "Alibaba Cloud account ID of B/email address"; -- アカウント A を削除します。 drop user "Alibaba Cloud account ID of A/email address";
次のいずれかの方法を使用して、インスタンスから RAM ユーザーを削除できます:
DROP USER "Alibaba Cloud account ID/email address";
RAM ユーザーが削除されると、そのユーザーはインスタンスに接続したり、そのオブジェクトにアクセスしたりできなくなります。操作は慎重に行ってください。
PostgreSQL には厳格な権限モデルがあります。ビジネス要件に基づいて認可アプローチを選択するためのベストプラクティスについては、「標準 PostgreSQL 権限モデルに基づく認可」をご参照ください。