権限を管理する
プレビュー
この機能は、us-east-1、 us-west-2、 eu-west-1、 ap-southeast-1、 ap-southeast-2、 eu-central-1、 us-east-2、 ap-south-1のリージョンでパブリック プレビューとして提供されています。
Lakebase プロビジョニング プレビューは、手動でスケールするプロビジョニング コンピュートを使用します。 オートスケール コンピュート、分岐、即時復元、その他の高度な機能をサポートする Lakebase の新しいバージョンについては、 「Lakebase Postgres (オートスケール プレビュー)」を参照してください。 どのバージョンが適しているかを判断するには、バージョンの選択を参照してください。
このページでは、データベース インスタンスに対する Databricks ユーザーと ID のアクセス許可を付与するタイミングと方法について説明します。
他のユーザーがPostgreSQLを使用してデータベース・インスタンスにアクセスできるようにするには、 databricks_superuser は対応するPostgresロールを作成する必要があります。Postgres ロールの作成方法の詳細については、「 Postgres ロールの管理」を参照してください。
アクセス許可がチェックされるタイミングと方法
Postgres 構文を使用するか、PostgreSQL インターフェイスを介して接続する場合、Lakebase は以下を使用して PostgreSQL 固有のアクセス制御を適用します。
- Postgres ロール
- ロール メンバーシップ
- Postgres で付与されたアクセス許可
他のすべてのシナリオでは、Lakebase は Databricks 固有のアクセス制御を適用します。
- Databricks ID(ユーザー、グループ、サービスプリンシパル)
- Databricks グループ メンバーシップ
- ワークスペースアクセス制御リスト (ACL)
- Unity Catalog の特権
Databricks ID とメンバーシップ、および Postgres ロールとメンバーシップの間には自動同期はありません。
ユースケース/権限またはID | データベースインスタンスの管理 | 同期されたテーブルを作成または削除する | 同期されたテーブル パイプラインを管理する | SQLウェアハウスからPostgresテーブルのクエリー | 特徴量およびモデルサービングにおけるオンライン特徴量のクエリ | PostgreSQL での Postgres テーブルのクエリ |
|---|---|---|---|---|---|---|
Databricks ID | ✅ | ✅ | ✅ | ✅ | ✅ | 対応するPostgresロールが必要です |
Databricks グループ メンバーシップ | ✅ | ✅ | ✅ | ✅ | ✅ | グループでログインするときにのみログイン時にチェックされます |
インスタンス ACL | ✅ | ✅ | ||||
パイプライン ACL | 既存のパイプラインを再利用する場合、または同期されたテーブルを削除する場合 (パイプラインを編集する) 場合は、パイプライン所有者である必要があります | ✅ | ||||
UC 権限 | ✅ | ✅ | ✅ | |||
Postgres ロール | ✅ | |||||
Postgres ロール メンバーシップ | ✅ | |||||
Postgres の権限 | ✅ |
データベースインスタンスの権限
インスタンスを管理し、Databricks UI、API、または SDK からテーブル操作を実行するには、ユーザーがデータベース インスタンスに対する特定の権限を持っている必要があります。ワークスペース管理者とインスタンス作成者は、 データベース インスタンスの 概要ページで、任意のユーザー、グループ、またはサービスプリンシパルに追加の権限を割り当てることができます。
- ワークスペースのサイドバーで「 コンピュート 」をクリックします。
- [ OLTP データベース] をクリックします。
- 「 アクセス許可 」タブをクリックします。
- 右上の インスタンスのアクセス許可を管理 をクリックします。
- 追加の権限を付与するユーザー、グループ、またはサービスプリンシパルを入力します。
- ID に付与するアクセス許可を選択します。データベース・インスタンス ACLを参照してください。
- [ + 追加 ] をクリックします。
- すべてのワークスペース・ユーザーは、データベース・インスタンスを表示またはリストできます。データベース カタログと同期テーブルの権限は、Unity Catalogのメタストア、カタログ、スキーマ、およびテーブルの権限によってさらに管理されます 。 詳細については、「 Unity Catalog での特権の管理」を参照してください。
- 保存 をクリックします。
Postgresの権限
Postgres のテーブルを読み取ったり、テーブルに書き込んだりするには、ユーザーには Postgres での次の権限が必要です。
CONNECTデータベース上USAGEスキーマ(または新しいテーブルを作成する場合はCREATE)SELECT、INSERT、UPDATE、またはDELETEテーブル上にあります
Postgres 権限の完全なリストについては、 PostgreSQL のドキュメントを参照してください。
Postgres の特定のテーブルに対するユーザー権限を確認する
次の SQL ステートメントを実行して、継承された権限を含むユーザーの権限をチェックするpg_temp.check_permissionsという名前の関数を作成します。
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
;
この関数を使用するには、次のクエリを使用します。
SELECT * FROM pg_temp.check_permissions('<your_user>', '<your_database>', '<your_schema>', '<your_table>');
-- Example:
SELECT * FROM pg_temp.check_permissions('joe@acme.org', 'databricks_postgres', 'public', 'table1');
Postgres のデータベース、スキーマ、テーブルのすべての権限を表示します
次の SQL ステートメントは、継承された権限を除く、すべてのユーザーに付与されたすべての権限の詳細ビューを返すpg_temp.make_owner_aclという名前の関数を作成します。
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
;
この関数を使用するには、次のクエリを使用します。
SELECT * FROM pg_temp.get_all_permissions('<your_database>', '<your_schema>', '<your_table>');
-- Example:
SELECT * FROM pg_temp.get_all_permissions('databricks_postgres', 'public', 'table1');
Postgresのロール継承階層を確認する
Postgres では、ロールは別のロールのメンバーになることができ、メンバーシップによって権限が親ロールから継承されるかどうかが指定されます。特定のロールが属するすべてのロールを表示するには、次の SQL ステートメントを使用して SQL 関数pg_temp.get_inherited_rolesを作成します。
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
;
この関数を使用するには、 <your_user>を Databricks ユーザー名に置き換えます。
SELECT * FROM pg_temp.get_inherited_roles('<your role>');
Postgresでロール管理者を見つける
ロールの管理者を確認するには、次の SQL クエリを使用して、 <target_role>をロール名に置き換えます。
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;