メインコンテンツまでスキップ

Postgres ロールの管理

備考

プレビュー

この機能は、us-east-1us-west-2eu-west-1ap-southeast-1ap-southeast-2eu-central-1us-east-2ap-south-1の各地域でパブリック プレビュー段階です。

Lakebase データベース インスタンス所有者の Databricks ID の Postgres ロールが自動的に作成されます。

最初は、インスタンスの所有者のみがPostgresを介してインスタンスにログインしてアクセスできます。他の Databricks ID がデータベース インスタンスにログインできるようにするには、Databricks ID に対応する Postgres ロールが必要です。

このページでは、PostgreSQL で追加の Databricks ID ベースのロールを追加および管理する方法について説明します。

Postgres ロールを作成し、Databricks ID の権限を付与する

Databricks UI または PostgreSQL クエリを使用して Postgres ロールを作成します。

注記

ロール管理アクションは、データベース・インスタンスに付与されたパーミッションによって管理されます。ロールの管理を試みる前に、適切なレベルのアクセス権があることを確認してください。

データベース インスタンスに対する CAN USE 権限を持つユーザーは、Databricks ID に関連付けられている既存の Postgres ロールを表示したり、自分の ID のロールをインスタンスに追加したりできます。

CAN MANAGEを持つユーザーは、追加の特権を含む他の Databricks ID のロールを追加で作成し、任意の Databricks ID のロールを削除できます。

データベース・インスタンス の概要ページで、任意のユーザー、グループ、またはサービスプリンシパルに追加の権限を割り当てることができます。

  1. ワークスペースのサイドバーで「 コンピュート 」をクリックします。

  2. データベース・インスタンス をクリックします。

  3. アクセス許可 」タブをクリックします。

  4. 右上の「 PostgreSQLロールを追加 」をクリックします。

  5. ワークスペース ID の場合は、ユーザー、グループ、またはサービスプリンシパルを入力し、Databricks ID を選択します。インスタンスに Postgres ロールがまだない Databricks ID を選択する必要があります。

  6. [ロール メンバーシップ ] を選択します。データベース・インスタンスに対する CAN MANAGE パーミッションがある場合は、 databricks_superuser ロール にメンバーシップを追加し、一部のロール属性を有効にできます。

  7. 新しいロールに付与する PostgreSQL 属性を選択します。

    • CREATEDB: 新しいデータベースを作成する権限を付与します
    • CREATEROLE: 新しいロールを作成する権限を付与します
    • BYPASS RLS: インスタンス内のすべての行レベルのセキュリティをバイパスする権限を付与します
  8. 確認 をクリックします。

Databricks ID ロールを表示する

どのユーザー、グループ、サービスプリンシパルが対応するPostgresロールを持っているかは、 データベースインスタンス の概要ページで確認できます。

  1. ワークスペースのサイドバーで「 コンピュート 」をクリックします。
  2. データベース・インスタンス をクリックします。
  3. アクセス許可 」タブをクリックします。

Databricks ID ベースの Postgres ロールを削除する

ロールの削除は元に戻せません。ロールを再作成することはできますが、オブジェクト所有権の再割り当ては、再割り当てされたオブジェクトを所有する新しいロールを削除しない限り、元に戻すことはできません。

  1. ワークスペースのサイドバーで「 コンピュート 」をクリックします。
  2. データベース・インスタンス をクリックします。
  3. アクセス許可 」タブをクリックします。
  4. ドロップするロール ID の右端にある [ ケバブメニューのアイコン。] をクリックします。
  5. [ロールの削除 ] をクリックします。
  6. オブジェクトを所有するロールを削除する必要がある場合は、[ 所有オブジェクトを再割り当て ]をオンにします。これにより、再割り当て可能なすべての所有オブジェクト (データベース、スキーマ、およびテーブル) が他のロールに再割り当てされ、再割り当て不可能な所有オブジェクトはすべて削除されます。
  7. 確認 をクリックします。

PostgreSQL クエリを使用して Postgres のアクセス許可を確認する

Postgres でテーブルの読み取りまたはテーブルへの書き込みを行うには、ユーザーに次の権限が必要です。

  • データベースでの CONNECT
  • スキーマの USAGE
  • テーブル上の USAGE

特定のテーブルに対するユーザー権限の確認

次の SQL 文を実行して、継承されたパーミッションを含むユーザーのパーミッションをチェックする pg_temp.check_permissions という名前の関数を作成します。

SQL
CREATE OR REPLACE FUNCTION pg_temp.check_permissions(TEXT, TEXT, TEXT, TEXT)
RETURNS TABLE(database_connect BOOLEAN, schema_usage BOOLEAN, table_select BOOLEAN,
table_insert BOOLEAN, table_update BOOLEAN, table_delete BOOLEAN) AS $$
SELECT
has_database_privilege($1, $2, 'CONNECT'),
has_schema_privilege($1, $3, 'USAGE'),
has_table_privilege($1, $4, 'SELECT'),
has_table_privilege($1, $4, 'INSERT'),
has_table_privilege($1, $4, 'UPDATE'),
has_table_privilege($1, $4, 'DELETE')
$$ LANGUAGE sql
;

この関数を使用するには、次のクエリで、 <your_user>を Databricks ユーザー名、 databricks_postgresをインスタンス名、 <my_table> をテーブル名に置き換えます。

SQL
SELECT * FROM pg_temp.check_permissions('<your_user>', 'databricks_postgres', 'public', '<my_table>');

データベース、スキーマ、およびテーブルのすべてのアクセス許可を表示する

次の SQL 文は、 pg_temp.make_owner_acl という名前の関数を作成します。この関数は、すべてのユーザーに対して付与されたすべてのパーミッション (継承されたパーミッションを除く) の詳細ビューを返します。

SQL
CREATE OR REPLACE FUNCTION pg_temp.make_owner_acl(owner_oid OID)
RETURNS TABLE(grantor OID, grantee OID, privilege_type TEXT, is_grantable BOOLEAN) AS $$
SELECT owner_oid, owner_oid,'OWNER'::TEXT, True
$$ LANGUAGE SQL;

CREATE OR REPLACE FUNCTION pg_temp.get_all_permissions(TEXT, TEXT, TEXT)
RETURNS TABLE(type TEXT, name TEXT, role TEXT, acl TEXT, can_grant TEXT) AS $$
SELECT type, name,
CASE WHEN grantee = 0 THEN 'PUBLIC' ELSE pg_get_userbyid(grantee) END AS role, privilege_type,
CASE WHEN privilege_type = 'OWNER' THEN 'YES, ALL' WHEN is_grantable THEN 'YES' ELSE 'NO' END AS can_grant
FROM (
SELECT 'DATABASE' type, datname as name, (pg_temp.make_owner_acl(datdba)).*
FROM pg_database
WHERE datname = $1
UNION ALL
SELECT 'DATABASE' type, datname as name, (aclexplode(datacl)).*
FROM pg_database
WHERE datname = $1
UNION ALL
SELECT 'SCHEMA' type, nspname as name, (pg_temp.make_owner_acl(nspowner)).*
FROM pg_namespace
WHERE nspname = $2
UNION ALL
SELECT 'SCHEMA' type, nspname as name, (aclexplode(nspacl)).*
FROM pg_namespace
WHERE nspname = $2
UNION ALL
SELECT 'TABLE' type, relname as name, (pg_temp.make_owner_acl(relowner)).*
FROM pg_class
WHERE relname = $3
UNION ALL
SELECT 'TABLE' type, relname as name, (aclexplode(relacl)).*
FROM pg_class
WHERE relname = $3
)
$$ LANGUAGE SQL
;

この関数を使用するには、次のクエリで、インスタンス名を を databricks_postgres に、テーブル名を <my_table> に置き換えます。

SQL
SELECT * FROM pg_temp.get_all_permissions('databricks_postgres', 'public', '<mytable>');

ロール継承階層の確認

Postgres では、ロールは別のロールのメンバーになることができ、メンバーシップは権限が親ロールから継承されるかどうかを指定します。特定のロールが属するすべてのロールを表示するには、次の SQL ステートメントを使用して SQL 関数 pg_temp.get_inherited_rolesを作成します。

SQL
CREATE OR REPLACE FUNCTION pg_temp.get_inherited_roles(
role_name TEXT
)
RETURNS TABLE(inherited_roles TEXT, member_via TEXT, inherits_permissions TEXT) AS $$
WITH RECURSIVE role_tree AS (
SELECT
m.roleid,
pg_get_userbyid(m.roleid) rolname,
'DIRECT' COLLATE "C" as member_via,
m.inherit_option as inherits_permissions
FROM pg_auth_members m
WHERE m.member = (SELECT oid FROM pg_roles WHERE rolname = $1)
UNION ALL
SELECT
m.roleid,
pg_get_userbyid(m.roleid) rolname,
rt.rolname::text as member_via,
(rt.inherits_permissions AND m.inherit_option) as inherits_permissions
FROM pg_auth_members m
JOIN role_tree rt ON m.member = rt.roleid
)
SELECT
rolname AS inherited_roles,
member_via,
CASE WHEN inherits_permissions THEN 'YES' ELSE 'NO' END as inherits_permissions
FROM role_tree
GROUP BY inherited_roles, member_via, inherits_permissions
ORDER BY inherits_permissions DESC
$$ LANGUAGE sql
;

この関数を使用するには、Databricks のユーザー名を次のものに置き換え<your_user>

SQL
SELECT * FROM pg_temp.get_inherited_roles('<your role>');

ロール管理者の検索

ロールの管理者を表示するには、次の SQL クエリを使用し、ロール名を <target_role>に置き換えます。

SQL
SELECT pg_get_userbyid(m.member) admin
FROM pg_auth_members m
WHERE m.roleid = (SELECT oid FROM pg_roles WHERE rolname = '<target_role>')
AND m.admin_option = true;