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ロールを追加 」をクリックします。
-
ワークスペース ID の場合は、ユーザー、グループ、またはサービスプリンシパルを入力し、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:ユーザーのEメール
myuser@databricks.com
- identity_type:
USER
SQLSELECT databricks_create_role('myuser@databricks.com','USER');
- identity_name:ユーザーのEメール
-
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;