Hologres は PostgreSQL と互換があり、標準 PostgreSQL の文と同じ権限付与システムを採用しています。これは「標準権限モデル」とも呼ばれます。本トピックでは、このモデルを用いて Hologres でユーザー権限を付与および取り消す方法について説明します。
標準権限モデルによる権限付与
開発ツールを使用して Hologres インスタンスに接続した後、SQL 文を実行して標準権限モデルに基づき権限を付与し、ユーザーがそのインスタンスで必要な操作を行うための権限を付与できます。
-
ユーザーを作成します。
アカウントが Hologres へのアクセスおよび開発を行うには、事前に Hologres ユーザーとして登録する必要があります。
ユーザー作成の構文は以下のとおりです。
-- Hologres インスタンスへのログイン権限を持つユーザーを作成します。RAM ユーザーに権限を付与する場合は、RAM ユーザー形式のアカウントを指定します。 CREATE USER "Alibaba Cloud アカウント ID/メールアドレス"; -- ユーザーを作成し、Superuser 権限を付与します。 CREATE USER "Alibaba Cloud アカウント ID/メールアドレス" SUPERUSER;以下の例に基づいてユーザーを作成できます。Alibaba Cloud アカウントと RAM ユーザーのフォーマットに関する詳細については、「アカウントの概要」をご参照ください。
-- Alibaba Cloud アカウント ID を使用してユーザーを作成します。 CREATE USER "11822780xxx"; -- RAM ユーザーに Superuser 権限を付与します。 CREATE USER "p4_1822780xxx" SUPERUSER;ロールの作成に関する詳細については、「CREATE ROLE」をご参照ください。
-
権限を付与します。
Hologres ユーザーとしてアカウントを作成した後、ユーザーがその権限範囲内で Hologres を利用できるよう、適切な権限を付与する必要があります。標準権限モデルでは、データベース、テーブル、ビュー、列レベルでの権限制御が可能です。以下の表に、Hologres における代表的な権限付与操作を示します。
説明標準権限モデルでは、既存のインスタンスオブジェクトに対する権限のみを付与します。権限付与後に新規に作成されたオブジェクトには自動的に適用されません。たとえば、ユーザー A がユーザー B に対して public スキーマ 内のすべてのテーブルを閲覧する権限を付与した場合、その後ユーザー A が新しいテーブルを作成しても、ユーザー B はその新規テーブルを閲覧できません。再度権限を付与する必要があります。
権限の説明
構文の例
必須
Hologres インスタンスへのログイン権限を持つユーザーを作成する
CREATE USER "Alibaba Cloud アカウント ID/メールアドレス";はい
ユーザーを作成し、Superuser 権限を付与する
CREATE USER "Alibaba Cloud アカウント ID/メールアドレス" SUPERUSER ;任意
スキーマ内でのテーブル作成権限を付与する
GRANT CREATE ON SCHEMA schema_name TO "Alibaba Cloud アカウント ID/メールアドレス";任意
スキーマに対する USAGE 権限を付与する
GRANT USAGE ON SCHEMA schema_name TO "Alibaba Cloud アカウント ID/メールアドレス";必須
説明テーブルに対するクエリ権限を付与するには、事前にそのスキーマに対する USAGE 権限を付与する必要があります。
public スキーマ 内のすべてのテーブルを、すべてのユーザーが閲覧・書き込み・変更できるようにする
GRANT SELECT,INSERT,UPDATE ON ALL TABLES IN SCHEMA public to PUBLIC;任意
テーブルに対する SELECT 権限をユーザーに付与する
GRANT SELECT ON TABLE <tablename> TO "Alibaba Cloud アカウント ID/メールアドレス";任意
テーブルに対する SELECT 権限をユーザーに付与し、そのユーザーが他のユーザーにもこの権限を付与できるようにする
GRANT SELECT ON TABLE <tablename> TO "Alibaba Cloud アカウント ID/メールアドレス" WITH GRANT OPTION;任意
[public スキーマ] 内のすべてのテーブルに対する SELECT 権限をユーザーに付与する
GRANT SELECT ON ALL TABLES IN SCHEMA public TO "Alibaba Cloud アカウント ID/メールアドレス";任意
今後
publicスキーマ内に作成されるテーブルを、すべてのユーザーが読み取れるようにするALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC;任意
一般ユーザを Superuser に変更する
ALTER USER "Alibaba Cloud アカウント ID/メールアドレス" SUPERUSER;任意
Superuser を一般ユーザに変更する
ALTER USER "Alibaba Cloud アカウント ID/メールアドレス" NOSUPERUSER;任意
テーブルの Owner 権限を別のユーザーに付与する
ALTER TABLE <tablename> OWNER TO "Alibaba Cloud アカウント ID/メールアドレス";任意
Hologres インスタンスにログオンする権限を持たないロールを作成する
CREATE ROLE "Alibaba Cloud アカウント/メールボックス";任意
ユーザーに特定のロールの権限を付与する
GRANT <rolename> TO "Alibaba Cloud アカウント ID/メールアドレス" ;任意
テーブルの特定の列に対するクエリ権限をユーザーに付与する
GRANT SELECT (<column1>,<column2>,<column3>,...) ON TABLE <tablename> TO "Alibaba Cloud アカウント ID/メールアドレス" ;任意
ビューに対するクエリ権限をユーザーに付与する
説明-
標準権限モデルでビューにアクセスするには、ビューに対するクエリ権限を付与する必要があります。
-
SPM/SLPM 権限モデルでビューにアクセスするには、ユーザーが viewer ユーザーグループまたはそれより上位のユーザーグループの権限を持っている必要があります。
-- 標準権限モデルでビューに対するクエリ権限をユーザーに付与します。 GRANT SELECT ON <viewname> TO "Alibaba Cloud アカウント ID/メールアドレス" ;任意
標準モデルでは、以下の例のように、新規ユーザーにテーブルに対するクエリ権限を付与できます。
CREATE USER "Alibaba Cloud アカウント ID/メールアドレス"; GRANT USAGE ON SCHEMA <schema_name> TO "Alibaba Cloud アカウント ID/メールアドレス"; GRANT SELECT ON TABLE <tablename> TO "Alibaba Cloud アカウント ID/メールアドレス";CREATE ROLE は、Hologres インスタンスへのログイン権限を持たないロールを作成します。これには、特定のユーザークラスを表すユーザーグループや仮想ロールなどが含まれます。権限付与の詳細については、「GRANT」をご参照ください。
-
-
テーブルを削除します。
テーブルの削除は、Superuser またはテーブルの Owner のみが実行できます。以下のいずれかの方法で、1 名以上のユーザーにテーブル削除権限を付与できます。
-
テーブルの Owner を新しいユーザーに置き換えます。
ALTER TABLE TABLENAME OWNER TO "Alibaba Cloud アカウント ID/メールアドレス"; -
新しいユーザーに Superuser 権限を付与します。
ALTER USER "Alibaba Cloud アカウント ID/メールアドレス" SUPERUSER; -
複数のユーザーをユーザーグループに追加し、そのグループにテーブルの Owner 権限を付与します。
CREATE USER "Alibaba Cloud アカウント ID/メールアドレス"; CREATE ROLE <rolename>; GRANT <rolename> TO "Alibaba Cloud アカウント ID/メールアドレス"; ALTER TABLE <tablename> OWNER TO <rolename>;
-
将来作成されるテーブルへの権限付与
標準権限モデルでは、将来作成されるテーブルに対する権限は自動的に付与されません。将来作成されるテーブルへの権限を付与するには、「ALTER DEFAULT PRIVILEGES」文を使用します。手順は以下のとおりです。
-
このコマンドは、既存の論理オブジェクトには影響しません。
-
このコマンドでは、TABLE、SCHEMA、FUNCTION、SEQUENCE、TYPE のデフォルト権限のみを設定できます。
-
権限を付与します。
-
デフォルト権限を付与すると、特定のユーザーが特定のスキーマ内で今後作成するテーブルを、指定されたユーザーまたはすべてのユーザーがクエリできるようになります。以下に例を示します。
-
ユーザー p4_id1 が public スキーマ 内で今後作成するテーブルを、すべてのユーザーがクエリできるようになります。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC; -
ユーザー p4_id1 が public スキーマ 内で今後作成するテーブルを、ユーザー p4_id2 がクエリできるようになります。
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 スキーマ 内で今後作成するテーブルをすべてのユーザーがクエリできるというデフォルト権限を取り消します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public REVOKE SELECT ON TABLES FROM PUBLIC; -
ユーザー p4_id2 がユーザー p4_id1 が public スキーマ 内で今後作成するテーブルをクエリできるというデフォルト権限を取り消します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public REVOKE SELECT ON TABLES FROM "p4_id2"; -
ユーザー p4_id1 が test スキーマ 内で今後作成するテーブルをすべてのユーザーがクエリできるというデフォルト権限を取り消します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA test REVOKE SELECT ON TABLES FROM PUBLIC;
-
-
-
デフォルト権限が正しく設定されたことを確認します。
-
psql クライアントで \ddp コマンドを実行し、ALTER DEFAULT PRIVILEGES が正常に適用されたかを確認します。
-
以下の SQL コマンドを Hologres で直接実行して確認します。
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 項目が見つかると、Hologres はその項目からルールをユーザーに適用します。現在のユーザーは以下のとおりに決定されます。
-
現在のユーザーが User の場合、テーブル作成時にその User が一致判定に使用されます。
-
User という名前のユーザーがテーブル作成前に
SET SESSION ROLE GROUP1;文を実行した場合、現在のユーザーは GROUP1 となります。この場合、テーブル作成時には GROUP1 が一致判定に使用されます。
一致ルールは、テーブル作成時のみ実行されます。テーブル作成後に
ALTER TABLE SET OWNER TO文を実行してテーブルの Owner を変更しても、対応する一致ルールはトリガーされません。 -
Expert Mode における権限の取り消し
以下の例は、REVOKE 文を使用してユーザー権限を取り消す方法を示しています。権限の取り消しに関する詳細については、「REVOKE」をご参照ください。
-- RAM ユーザーから権限を取り消す場合は、RAM ユーザー形式のアカウントを指定します。
REVOKE SELECT ON TABLE tablename FROM "Alibaba Cloud アカウント ID/メールアドレス" ;
システムテーブルの権限
Hologres V3.0 以降、Postgres でデータベースに接続したユーザーは、pg_class、pg_attribute、pg_namespace の各システムテーブルを通じて、インスタンス内のすべてのスキーマおよびテーブルに関する情報を閲覧できます。特に BI ツールや開発ツールを使用して接続した場合に該当します。これらのツールは、自動的にこれらの 3 つのシステムテーブルからスキーマ一覧、テーブル一覧、テーブルの列情報などを取得します。ユーザーは、対象テーブルへのアクセス権限の有無にかかわらず、これらのシステムテーブルからメタデータ情報を取得できます。この課題に対処するため、Hologres V3.0.23 以降では、pg_class、pg_attribute、pg_namespace の各システムテーブルに対して行レベルの権限がサポートされています。これにより、アクセス権限を持つユーザーのみが対応するメタデータを閲覧できるようになります。以下の Grand Unified Configuration (GUC) パラメーターを使用して、行レベルの権限を有効化します。
-
この GUC パラメーターは、pg_class、pg_attribute、pg_namespace の各システムテーブルのみを制御します。
-
このパラメーターは Superuser が設定する必要があります。各データベースごとに 1 回実行します。
-
この設定を有効化すると、Superuser、オブジェクト(テーブルまたはスキーマ)の Owner 権限を持つユーザー、またはオブジェクト(テーブルまたはスキーマ)に対する任意の権限を持つユーザーのみが、対応するメタデータを閲覧できます。その他のユーザーは、メタデータの閲覧権限を持ちません。
-- Superuser によって設定されます。
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 文を使用して RAM ユーザーを削除できます。以下の 2 つのシナリオがあります。
-
一般ユーザの削除
一般ユーザを削除する場合、そのアカウントがテーブル、ビュー、拡張機能などの他のオブジェクトを作成していない場合は、以下のコマンドを実行するか、HoloWeb から直接ユーザーを削除できます。
drop user "Alibaba Cloud アカウント ID/メールアドレス"; -
Superuser またはその他の管理者の削除
Superuser、Admin、またはその他の管理者を削除する場合、そのアカウントがインスタンス内でテーブル、ビュー、拡張機能などのオブジェクトを作成しており、それらのオブジェクトの Owner である場合(特に標準権限モデルにおいて)、直接削除すると失敗します。まず、そのアカウントが所有するオブジェクトの所有権を移転する必要があります。以下のコマンドを実行します。
-- アカウント A のオブジェクトをアカウント B に転送します。 reassign owned by "A Alibaba Cloud アカウント ID" to "B Alibaba Cloud アカウント ID"; -- アカウント A を削除します。 drop user "A Alibaba Cloud アカウント ID";
RAM ユーザーをインスタンスから削除する方法は以下のとおりです。
DROP USER "Alibaba Cloud アカウント ID/メールアドレス";
RAM ユーザーを削除すると、そのユーザーはインスタンスへの接続およびインスタンス内の任意のオブジェクトへのアクセスができなくなります。実行には十分ご注意ください。
標準 PostgreSQL では、権限の分割が非常に厳格です。お客様のビジネスニーズに応じて選択・参照可能なベストプラクティスを提供しています。詳細については、「標準 PostgreSQL 権限モデルに基づく権限付与」をご参照ください。