Hologres は PostgreSQL と互換性があり、標準 PostgreSQL 認証モデルを使用できます。このトピックでは、標準 PostgreSQL 認証モデルを使用して権限を付与および取り消す方法について説明します。
標準 PostgreSQL 認証モデルを使用した権限の付与
Hologres インスタンスを開発ツールに接続した後、標準 PostgreSQL 認証モデルを使用して、SQL ステートメントを実行してインスタンスに対する権限をユーザーに付与できます。
ユーザーを作成します。
アカウントが Hologres にアクセスしてデータを開発するには、そのアカウントの Hologres ユーザーを作成する必要があります。
次の構文で SQL ステートメントを実行して、ユーザーを作成できます。
-- Hologres インスタンスにログオンする権限を持つユーザーを作成します。RAM ユーザーに権限を付与する場合、RAM ユーザーに必要な形式でアカウント ID を指定する必要があります。 CREATE USER "Alibaba Cloud account ID/Alibaba Cloud email address"; -- ユーザーを作成し、スーパーユーザーロールをユーザーに割り当てます。 CREATE USER "Alibaba Cloud account ID/Alibaba Cloud email address" SUPERUSER;次のサンプルステートメントは、ユーザーの作成方法を示しています。Hologres で Alibaba Cloud アカウントと RAM ユーザーを指定するために使用される形式の詳細については、概要をご参照ください。
-- Alibaba Cloud アカウントの ID を使用してユーザーを作成します。 CREATE USER "11822780xxx"; -- RAM ユーザーを作成し、スーパーユーザーロールを RAM ユーザーに割り当てます。 CREATE USER "p4_1822780xxx" SUPERUSER;ロールの作成方法の詳細については、CREATE ROLE をご参照ください。
ユーザーに権限を付与します。
Hologres ユーザーを作成した後、ユーザーに権限を付与する必要があります。この場合、ユーザーは Hologres で承認された操作を実行できます。標準 PostgreSQL 認証モデルを使用して、データベース、テーブル、ビュー、および列に対する権限をユーザーに付与できます。次の表は、Hologres で権限を付与するために一般的に使用されるステートメントを示しています。
説明標準 PostgreSQL 認証モデルを使用して、既存のオブジェクトに対してのみ権限を付与できます。権限が付与された後に作成されたオブジェクトに対しては、権限は有効になりません。たとえば、ユーザー A が [public スキーマ] 内のすべてのテーブルに対する SELECT 権限をユーザー B に付与するとします。その後、ユーザー A がスキーマに別のテーブルを作成した場合、ユーザー B はこのテーブルに対する SELECT 権限を持ちません。ユーザー B がこのテーブルを照会できるようにするには、ユーザー A はこのテーブルに対する SELECT 権限をユーザー B に付与する必要があります。
操作
ステートメント構文
必須
Hologres インスタンスにログオンする権限を持つユーザーを作成する
CREATE USER "Alibaba Cloud account ID/Alibaba Cloud email address";はい
ユーザーを作成し、スーパーユーザーロールをユーザーに割り当てる
CREATE USER "Alibaba Cloud account ID/Alibaba Cloud email address" SUPERUSER ;いいえ
スキーマにテーブルを作成する権限をユーザーに付与する
GRANT CREATE ON SCHEMA schema_name TO "Alibaba Cloud account ID/Alibaba Cloud email address";いいえ
スキーマにアクセスする権限をユーザーに付与する
GRANT USAGE ON SCHEMA schema_name TO "Alibaba Cloud account ID/Alibaba Cloud email address";はい
説明ユーザーは、スキーマにアクセスする権限が付与された後にのみ、スキーマ内のテーブルを照会できます。
[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/Alibaba Cloud email address";いいえ
テーブルに対する SELECT 権限をユーザーに付与し、その権限を他のユーザーに付与することを承認する
GRANT SELECT ON TABLE <tablename> TO "Alibaba Cloud account ID/Alibaba Cloud email address" WITH GRANT OPTION;いいえ
[public スキーマ] 内のすべてのテーブルに対する SELECT 権限をユーザーに付与する
GRANT SELECT ON ALL TABLES IN SCHEMA public TO "Alibaba Cloud account ID/Alibaba Cloud email address";いいえ
publicスキーマ内の現在の承認者によって作成されるテーブルに対する SELECT 権限をすべてのユーザーに付与するALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC;いいえ
ユーザーのロールを一般ユーザーからスーパーユーザーに変更する
ALTER USER "Alibaba Cloud account ID/Alibaba Cloud email address" SUPERUSER;いいえ
ユーザーのロールをスーパーユーザーから一般ユーザーに変更する
ALTER USER "Alibaba Cloud account ID/Alibaba Cloud email address" NOSUPERUSER;いいえ
別のユーザーによって作成されたテーブルの所有者としてユーザーを設定する
ALTER TABLE <tablename> OWNER TO "Alibaba Cloud account ID/Alibaba Cloud email address";いいえ
Hologres インスタンスにログオンする権限を持たないロールを作成する
CREATE ROLE "Alibaba Cloud account ID/Alibaba Cloud email address";いいえ
ユーザーにロールを割り当てる
GRANT <rolename> TO "Alibaba Cloud account ID/Alibaba Cloud email address" ;いいえ
テーブルの特定の列に対する SELECT 権限をユーザーに付与する
GRANT SELECT (<column1>,<column2>,<column3>,...) ON TABLE <tablename> TO "Alibaba Cloud account ID/Alibaba Cloud email address" ;いいえ
ビューに対する SELECT 権限をユーザーに付与する
説明標準 PostgreSQL 認証モデルを使用してビューにアクセスする場合、ビューに対する SELECT 権限が付与されている必要があります。
簡易権限モデル (SPM) またはスキーマレベル権限モデル (SLPM) を使用してビューにアクセスする場合、ビューアーユーザーグループまたは上位レベルのユーザーグループに追加されている必要があります。
-- 標準 PostgreSQL 認証モデルを使用して、ビューに対する SELECT 権限をユーザーに付与します。 GRANT SELECT ON <viewname> TO "Alibaba Cloud account ID/Alibaba Cloud email address" ;いいえ
たとえば、標準 PostgreSQL 認証モデルを使用して、次の SQL ステートメントを実行して、テーブルに対する SELECT 権限を新しいユーザーに付与できます。
CREATE USER "Alibaba Cloud account ID/Alibaba Cloud email address"; GRANT USAGE ON SCHEMA <schema_name> TO "Alibaba Cloud account ID/Alibaba Cloud email address"; GRANT SELECT ON TABLE <tablename> TO "Alibaba Cloud account ID/Alibaba Cloud email address";CREATE ROLE ステートメントは、Hologres インスタンスにログオンする権限を持たないロールを作成するために使用されます。たとえば、このステートメントを実行して、特定タイプのユーザーを表す仮想ロールまたはユーザーグループを作成できます。権限の付与方法の詳細については、GRANT をご参照ください。
1 人以上のユーザーにテーブルを削除する権限を付与します。
テーブルを削除できるのは、スーパーユーザーとテーブルの所有者だけです。次のいずれかの方法を使用して、1 人以上のユーザーにテーブルを削除する権限を付与できます。
新しいユーザーをテーブルの所有者として設定します。
ALTER TABLE TABLENAME OWNER TO "Alibaba Cloud account ID/Alibaba Cloud email address";スーパーユーザーロールを新しいユーザーに割り当てます。
ALTER USER "Alibaba Cloud account ID/Alibaba Cloud email address" SUPERUSER;複数のユーザーをユーザーグループに追加し、テーブルの所有権をユーザーグループに割り当てます。
CREATE USER "Alibaba Cloud account ID/Alibaba Cloud email address"; CREATE ROLE <rolename>; GRANT <rolename> TO "Alibaba Cloud account ID/Alibaba Cloud email address"; ALTER TABLE <tablename> OWNER TO <rolename>;
作成されるテーブルに対する権限の付与
デフォルトでは、標準 PostgreSQL 認証モデルを使用してユーザーに付与されたテーブルに対する権限には、作成されるテーブルに対する権限は含まれません。ALTER DEFAULT PRIVILEGES ステートメントを実行して、作成されるテーブルに対する権限をユーザーに付与できます。
このステートメントは、既存のオブジェクトの権限には影響しません。
このステートメントは、テーブル、スキーマ、関数、シーケンス、および型に対するデフォルトの権限のみを付与するために使用できます。
権限を付与します。
すべてのユーザーまたは特定のユーザーに、別のユーザーによって特定のスキーマに作成されるテーブルに対するデフォルトの権限として SELECT 権限を付与します。例:
[public スキーマ] 内に [p4_id1] ユーザーによって作成されるテーブルに対する SELECT 権限をすべてのユーザーに付与します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public GRANT SELECT ON TABLES TO PUBLIC;[p4_id2] ユーザーに、[p4_id1] ユーザーが [public スキーマ] に作成するテーブルに対する SELECT 権限を付与します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public GRANT SELECT ON TABLES TO "p4_id2";[test スキーマ] 内に [p4_id1] ユーザーによって作成されるテーブルに対する SELECT 権限をすべてのユーザーに付与します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA test GRANT SELECT ON TABLES TO PUBLIC;
付与したデフォルトの権限を取り消します。例:
[public スキーマ] 内に [p4_id1] ユーザーによって作成されるテーブルに対する SELECT 権限をすべてのユーザーから取り消します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public REVOKE SELECT ON TABLES FROM PUBLIC;[public スキーマ] 内に [p4_id1] ユーザーによって作成されるテーブルに対する SELECT 権限を [p4_id2] ユーザーから取り消します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA public REVOKE SELECT ON TABLES FROM "p4_id2";[test スキーマ] 内に [p4_id1] ユーザーによって作成されるテーブルに対する SELECT 権限をすべてのユーザーから取り消します。
ALTER DEFAULT PRIVILEGES FOR ROLE "p4_id1" IN SCHEMA test REVOKE SELECT ON TABLES FROM PUBLIC;
デフォルトの権限が付与されているかどうかを確認します。
PostgreSQL クライアントで \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 ステートメントが検出されると、Hologres は認証に関連する一致ルールを使用します。次の照合ルールに注意してください。
ユーザーとして操作を実行する場合、Hologres はユーザーがデフォルトの権限を持っているかどうかを確認します。
ユーザーとしてテーブルを作成する前に
SET SESSION ROLE GROUP1;文を実行すると、GROUP1 ロールがユーザーに割り当てられます。その後、Hologres は GROUP1 ロールがデフォルトの権限を持っているかどうかを確認します。
照合ルールは、テーブルを作成するときにのみ有効になります。テーブルを作成した後に
ALTER TABLE SET OWNER TO文を実行してテーブル所有者を変更した場合、照合ルールはトリガーされません。
標準 PostgreSQL 認証モデルを使用した権限の取り消し
ユーザーから特定の権限を取り消すには、次の REVOKE ステートメントを実行します。詳細については、REVOKE をご参照ください。
REVOKE SELECT ON TABLE tablename FROM "Alibaba Cloud account ID/Alibaba Cloud email address" ; -- RAM ユーザーの場合、RAM ユーザーに必要な形式でアカウント ID を指定する必要があります。システム カタログ アクセス制御
Hologres V3.0 以降、インスタンスに接続するユーザーは、付与された権限に関係なく、システム カタログ pg_class、pg_attribute、および pg_namespace にアクセスできました。つまり、すべてのユーザーがインスタンス内のスキーマ、テーブル、および列を一覧表示できるため、ユーザーが BI および開発ツールを介してインスタンスにアクセスする際にセキュリティ リスクが発生します。セキュリティを強化するために、Hologres V3.0.23 以降では、これらのシステム テーブルに行レベルのアクセス制御 (RLS) が導入されています。これにより、必要な権限を持つユーザーのみがテーブル メタデータを表示できるようになります。これらのシステム カタログの RLS をアクティブにするには、GUC パラメーター hg_experimental_enable_catalog_rls を on に設定します。
-- スーパーユーザー設定
ALTER DATABASE <database_name> SET hg_experimental_enable_catalog_rls = on;この GUC パラメーターは、システム テーブル
pg_class、pg_attribute、およびpg_namespaceにのみ影響します。データベース レベルでスーパーユーザーとしてこのパラメーターを有効にします。
アクティブ化されると、スーパーユーザー、テーブルまたはスキーマの所有者、およびテーブルまたはスキーマに対する権限を持つユーザーのみが関連するメタデータを表示できます。
詳細については、「システム テーブル」をご参照ください。
ユーザーの権限の照会
次の SQL ステートメントを実行して、ユーザーの権限を照会します。
SELECT ROLNAME FROM pg_roles;
SELECT user_display_name(ROLNAME) FROM pg_roles;ユーザーの削除
Hologres インスタンスが開発ツールに接続されている場合、SQL ステートメントを使用してユーザーを削除できます。
一般ユーザーの削除
一般ユーザーがテーブル、ビュー、拡張機能などのオブジェクトを作成していない場合、次のステートメントを実行して Hologres インスタンスからユーザーを削除できます。HoloWeb コンソールでユーザーを削除することもできます。
drop user "Alibaba Cloud account ID/Alibaba Cloud email address";スーパーユーザーロールを持つユーザーなどの管理者の削除
標準 PostgreSQL 認証モデルを使用して、スーパーユーザーまたは管理者ロールが割り当てられたユーザーなどの管理者を削除する場合、管理者がテーブル、ビュー、拡張機能などのオブジェクトを作成している場合は、管理者を削除する前に、オブジェクトを別のユーザーに転送する必要があります。そうしないと、エラーメッセージが報告されます。サンプルステートメント:
-- ユーザー A が所有するオブジェクトをユーザー B に転送します。 REASSIGN OWNED BY "Alibaba Cloud account ID of User A" to "Alibaba Cloud account ID of User B"; -- ユーザー A を削除します。 drop user "Alibaba Cloud account ID of User A";
次の SQL ステートメントを実行して、RAM ユーザーを Hologres インスタンスから削除できます。
DROP USER "Alibaba Cloud account ID/Alibaba Cloud email address";RAM ユーザーを Hologres インスタンスから削除した後、RAM ユーザーを使用してインスタンスに接続したり、インスタンス内のオブジェクトにアクセスしたりすることはできません。注意して進めてください。
標準 PostgreSQL 認証モデルは、権限を厳密に分割します。モデルを使用するためのベストプラクティスが参考のために提供されています。ベストプラクティスとビジネス要件に基づいてモデルを使用できます。詳細については、標準 PostgreSQL 認証モデルに基づいて権限を付与するをご参照ください。