Postgres ロールの管理
プレビュー
この機能は、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 データベース インスタンス所有者の Databricks ID の Postgres ロールが自動的に作成されます。
最初は、インスタンスの所有者のみが Postgres を介してログインしてインスタンスにアクセスできます。他の Databricks ID がデータベース インスタンスにログインできるようにするには、Databricks ID に対応する Postgres ロールが必要です。
このページでは、PostgreSQL で Databricks ID ベースのロールを追加および管理する方法について説明します。
Postgres ロールを作成し、Databricks ID の特権を付与する
Databricks UI または PostgreSQL クエリを使用して Postgres ロールを作成します。
ロール管理アクションは、データベース・インスタンスに付与された権限によって管理されます。ロールの管理を試みる前に、適切なレベルのアクセス権があることを確認してください。
- UI
- PostgreSQL
データベース インスタンスに対する CAN USE
アクセス許可を持つユーザーは、Databricks ID に関連付けられている既存の Postgres ロールを表示したり、自分の ID のロールをインスタンスに追加したりできます。
CAN MANAGE
を持つユーザーは、追加の特権を含む他の Databricks ID のロールを追加で作成し、任意の Databricks ID のロールを削除できます。
データベース ・インスタンス の概要ページで、任意のユーザー、グループ、またはサービスプリンシパルに追加の権限を割り当てることができます。
-
ワークスペースのサイドバーで「 コンピュート 」をクリックします。
-
データベース・インスタンス をクリックします。
-
「 アクセス許可 」タブをクリックします。
-
右上の PostgreSQL ロールの追加 をクリックします。
-
[ ワークスペース identity ] に、ユーザー、グループ、またはサービスプリンシパルを入力し、 Databricks ID を選択します。 インスタンスに Postgres ロールがまだない Databricks ID を選択する必要があります。
-
[ロール] メンバーシップ を選択します。データベース インスタンスに対する
CAN MANAGE
アクセス許可がある場合は、databricks_superuser
ロール にメンバーシップを追加し、一部のロール属性を有効にすることができます。 -
新しいロールに付与するPostgreSQL属性を選択します。
CREATEDB
: 新しいデータベースを作成する権限を付与します。CREATEROLE
: 新しいロールを作成する権限を付与します。BYPASS RLS
: インスタンス内のすべての行レベルのセキュリティをバイパスする権限を付与します。
-
確認 をクリックします。
新しいPostgresロールを作成する前に、次の要件を満たしていることを確認してください。
- データベースに対する
CREATE
権限とCREATE ROLE
権限が必要です。 - Postgres に認証し、 Databricks ID (ユーザー、サービスプリンシパル、またはグループ) としてログインする必要があります。 ネイティブ Postgres 認証セッションでは、Databricks ロールを作成できません。
- 認証トークンは有効であり、ロールの作成時に有効期限が切れていない必要があります。
databricks_create_role
関数を使用して、Databricks ID ベースの PostgreSQL ロールを追加および作成します。カスタムPostgreSQL拡張機能 databricks_auth
は、 databricks_create_role
関数を提供します。
-
databricks_auth
拡張機能を作成します。各Postgresデータベースには、独自の拡張子が必要です。SQLCREATE EXTENSION IF NOT EXISTS databricks_auth;
-
databricks_create_role
関数を使用して、Databricks ID の新しい Postgres ロールを追加および作成します。ロールはすでに存在していてはなりません。同じ名前のロールが存在する場合は、Databricks ID ベースのロールを作成する前に削除します。SQLSELECT databricks_create_role('identity_name', 'identity_type');
identity_name
パラメーターとidentity_type
パラメーターは、Databricks ID の種類によって異なります。-
Databricks ユーザー:
- identity_name:ユーザーの電子メール(例:
myuser@databricks.com
- identity_type:
USER
SQLSELECT databricks_create_role('myuser@databricks.com','USER');
- identity_name:ユーザーの電子メール(例:
-
Databricks サービスプリンシパル:
- identity_name:サービスプリンシパルのアプリケーションID(例:
8c01cfb1-62c9-4a09-88a8-e195f4b01b08
- identity_type:
SERVICE_PRINCIPAL
SQLSELECT databricks_create_role('8c01cfb1-62c9-4a09-88a8-e195f4b01b08','SERVICE_PRINCIPAL');
- identity_name:サービスプリンシパルのアプリケーションID(例:
-
Databricks グループ:
- identity_name: グループの名前 (大文字と小文字を区別):
My Group 123
- identity_type:
GROUP
SQLSELECT databricks_create_role('My Group 123','GROUP');
- identity_name: グループの名前 (大文字と小文字を区別):
-
-
databricks_create_role
を使用して作成されたロールには、作成後にPUBLIC
にのみ権限が付与されます。追加の権限を付与または取り消すには、標準のPostgres権限管理コマンドGRANT
とREVOKE
を使用します。テーブルにアクセスするための読み取りアクセス許可をロールに付与します。
SQLGRANT SELECT ON "my_schema"."my_table" TO <role-name>;
ロールからテーブルへの書き込みアクセスを削除します。
SQLREVOKE INSERT, UPDATE, DELETE ON TABLE "my_schema"."my_table" FROM <role-name>;
ロールからデータベースへのすべてのアクセスを取り消します。
SQLREVOKE CONNECT ON DATABASE "example_database" FROM <role-name>;
Databricks ID ロールを表示する
- UI
- PostgreSQL
どのユーザー、グループ、およびサービスプリンシパルが対応するPostgresロールを持っているかは、 データベース・インスタンス の概要ページで確認できます。
- ワークスペースのサイドバーで「 コンピュート 」をクリックします。
- データベース・インスタンス をクリックします。
- 「 アクセス許可 」タブをクリックします。
PostgreSQLクエリを使用して、によって作成されたすべてのDatabricks ID ロールを一覧表示します デフォルト databricks_create_role
関数を使用して、databricks_auth
拡張機能の databricks_list_roles
関数を使用します。これにより、Postgres ロールとして認証するために追加されたすべての Databricks ユーザー、サービスプリンシパル、およびグループが一覧表示されます。
CREATE EXTENSION IF NOT EXISTS databricks_auth;
SELECT * from databricks_list_roles;
Databricks ID ベースの Postgres ロールを削除する
- UI
- PostgreSQL
ロールの削除は元に戻せません。ロールを再作成することはできますが、オブジェクト所有権の再割り当ては、再割り当てされたオブジェクトを所有する新しいロールを削除せずに元に戻すことはできません。
- ワークスペースのサイドバーで「 コンピュート 」をクリックします。
- データベース・インスタンス をクリックします。
- 「 アクセス許可 」タブをクリックします。
- ドロップするロール ID で、右端の [
] をクリックします。
- [ ロールの削除 ] をクリックします。
- オブジェクトを所有するロールを削除する必要がある場合は、[ 所有オブジェクトを再割り当て] をオンにします。これにより、再割り当て可能なすべての所有オブジェクト (データベース、スキーマ、およびテーブル) が他の役割に再割り当てされ、再割り当て不可の所有オブジェクトが削除されます。
- 確認 をクリックします。
Databricks ID ベースの Postgres ロールは、他の Postgres ロールと同様に削除および削除できます。詳細については、 ロールの削除に関するPostgreSQLのドキュメントを参照してください。Databricks ID ベースのロールが削除されると、トークンベースの認証と Postgres へのアクセスに使用できなくなります。
PostgreSQL クエリを使用して 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;