データベースの役割、アクセス、および権限
プレビュー
この機能は、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を使用する際のID、役割、および権限の仕組みについて説明します。
データベースインスタンスを作成すると、データベースインスタンスの作成者に対してPostgresロールが自動的に設定されます。作成者には、データベース・インスタンス内のすべてのデータに対する高レベルのアクセス権を持つ databricks_superuser
ロールが与えられます。このロールとその権限の詳細については、「 データベースの役割のタイプと権限」を参照してください。
databricks_superuser
として、他のユーザーに対応する Postgres ロールを作成することで、他のユーザーが PostgreSQL を介してデータベース インスタンスにアクセスできるようにすることができます。Postgres ロールを作成する方法の詳細については、「 Databricks ID の Postgres ロールを作成および管理する」を参照してください。
権限を確認するタイミングと方法
Postgres構文を使用する場合、またはPostgreSQLインターフェースを介して接続する場合、Lakebaseは以下を使用してPostgreSQL固有のアクセス制御を実施します。
- Postgres ロール
- ロールのメンバーシップ
- Postgres で付与された権限
他のすべてのシナリオでは、Lakebase は次のような Databricks 固有のアクセス制御を適用します。
- Databricks ID (ユーザー、グループ、サービスプリンシパル)
- Databricks グループ メンバーシップ
- ワークスペースアクセス制御リスト (ACL)
- Unity Catalog の特権
Databricks の ID とメンバーシップ、および Postgres のロールとメンバーシップとの間には自動同期はありません。
ユースケース / 権限またはアイデンティティ | データベース・インスタンスの管理 | 同期テーブルの作成 | 同期されたテーブル パイプラインを管理する | SQLウェアハウスからPostgresテーブルのクエリー | 特徴量およびモデルサービングにおけるオンライン特徴量のクエリ | PostgreSQLでのPostgresテーブルのクエリ |
---|---|---|---|---|---|---|
Databricks の ID | はい | はい | はい | はい | はい | 対応するPostgresロールが必要です |
Databricks グループ メンバーシップ | はい | はい | はい | はい | はい | グループとしてログインするときだけチェックされます |
インスタンス ACL | はい | はい | ||||
パイプライン ACL | はい | はい | ||||
UC のアクセス許可 | はい | はい | はい | |||
Postgres ロール | はい | |||||
Postgres ロールのメンバーシップ | はい | |||||
Postgres の権限 | はい |
Postgres の権限を確認する
Postgres でテーブルの読み取りまたはテーブルへの書き込みを行うには、ユーザーに次の権限が必要です。
- データベースでの CONNECT
- スキーマの USAGE
- テーブル上の USAGE
次の 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
;
この関数を使用するには、次のクエリで、 <your_user>
を Databricks ユーザー名、 databricks_postgres
をインスタンス名、 <my_table>
をテーブル名に置き換えます。
SELECT * FROM pg_temp.check_permissions('<your_user>', 'databricks_postgres', 'public', '<my_table>');
次の 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
;
この関数を使用するには、次のクエリで、インスタンス名を を databricks_postgres
に、テーブル名を <my_table>
に置き換えます。
SELECT * FROM pg_temp.get_all_permissions('databricks_postgres', 'public', '<mytable>');
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
;
この関数を使用するには、Databricks のユーザー名を次のものに置き換え<your_user>
SELECT * FROM pg_temp.get_inherited_roles('<your role>');
ロールの管理者を表示するには、次の 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;
Databricks ID と Postgres ロール
Postgres クライアントを使用して、 資格情報を持つDatabricks ユーザー、グループ、またはサービスプリンシパルOAuth ID を使用してデータベース インスタンスに接続できます。
データベース インスタンスに対する CAN USE
権限を持つユーザーは、Databricks ID に関連付けられている既存の Postgres ロールを表示したり、自分の ID のロールをインスタンスに追加したりできます。CAN MANAGE
を持つユーザーは、追加の特権を含む他の Databricks ID のロールを追加で作成し、任意の Databricks ID のロールを削除できます。
Databricks ID の Postgres ロールを追加する
新しい Postgres ロールを作成するときに、 databricks_superuser
ロールにメンバーシップを追加し、一部のロール属性を有効にすることができます。
databricks_superuser
インスタンス内のすべてのデータの読み取りと書き込み、およびシステムメトリクスの表示に対する広範なアクセス権があります。具体的には、 databricks_superuser
は標準の Postgres ロール pg_read_all_data
、 pg_write_all_data
、および pg_monitor
のメンバーです。必要な権限を発行するのに十分な権限を持つロールとして接続されている場合、Postgresで直接より詳細なアクセス権限を設定します。
次のロール属性を設定できます。
CREATEDB
: 新しいデータベースを作成する権限を付与しますCREATEROLE
: 新しいロールを作成する権限を付与しますBYPASS RLS
: インスタンス内のすべての行レベルのセキュリティをバイパスする権限を付与します
新しいPostgresロールを作成するには、[ Add PostgreSQL Role ]をクリックし、モデルを使用して権限を追加します。インスタンスに Postgres ロールがまだない Databricks ID を選択する必要があります。オプションで、データベース・インスタンスに対するパーミッションがある場合は、標準ロールまたは特定のロール属性にメンバーシップ CAN MANAGE
追加できます。
Postgres ロールの管理
データベース・インスタンスに対する CAN_MANAGE
権限を持つユーザーは、次のアクションを実行できます。
- 他の Databricks ID の Postgres ロールを作成します (必要に応じて追加の特権を割り当てるなど)。
- UI または API を使用して、Databricks ID の Postgres ロールを削除します。
データベース・インスタンスに対する CAN_USE
権限を持つユーザーは、次のアクションを実行できます。
- 自分の ID のロールを追加します (追加の権限はありません)。
ロール管理アクションは、データベース・インスタンスに付与されたパーミッションによって管理されます。ロールの管理を試みる前に、適切なレベルのアクセス権があることを確認してください。
Databricks ID にインスタンス特権を付与する
ユーザーは、インスタンスを管理し、テーブル操作を実行するために、データベース・インスタンスに対する特定の権限を持っている必要があります。ワークスペース管理者とインスタンス作成者は、 データベース インスタンス の概要ページで、任意のユーザー、グループ、またはサービスプリンシパルに追加のアクセス許可を割り当てることができます。
- ワークスペースのサイドバーで「 コンピュート 」をクリックします。
- 「OLTP データベース 」をクリックします。
- 「 権限 」タブをクリックします。
- 右上の インスタンスのアクセス許可を管理 をクリックします。
- 追加の権限を付与するユーザー、グループ、またはサービスプリンシパルを入力します。
- ID に付与するアクセス許可を選択します。データベース・インスタンス ACLを参照してください。
- [ + 追加 ] をクリックします。
- すべてのワークスペース・ユーザーは、データベース・インスタンスを表示またはリストできます。データベース カタログと同期テーブルの権限は、Unity Catalogのメタストア、カタログ、スキーマ、およびテーブルの権限によってさらに管理されます 。 詳細については、「 Unity Catalog での特権の管理」を参照してください。