gerenciar funções do Postgres
Visualização
Esse recurso está em Public Preview nas seguintes regiões: us-east-1
, us-west-2
, eu-west-1
, ap-southeast-1
, ap-southeast-2
, eu-central-1
, us-east-2
, ap-south-1
.
Uma função Postgres para a identidade Databricks do proprietário da instância do banco de dados Lakebase é criada automaticamente.
Inicialmente, apenas o proprietário da instância pode acessar log in e acessar a instância através do Postgres. log in Para permitir que outras identidades Databricks se conectem à instância do banco de dados, a identidade Databricks deve possuir uma função Postgres correspondente.
Esta página descreve como adicionar e gerenciar funções adicionais baseadas em identidade da Databricks no PostgreSQL.
Criar funções Postgres e conceder privilégios para identidades Databricks
Crie funções Postgres utilizando a interface do usuário do Databricks ou consultas PostgreSQL.
As ações de gerenciamento de funções são regidas pelas permissões concedidas na instância do banco de dados. Certifique-se de que possui o nível de acesso adequado antes de tentar gerenciar funções.
- UI
- PostgreSQL
Os usuários com permissão CAN USE
na instância do banco de dados podem view as funções Postgres existentes associadas a identidades Databricks ou adicionar uma função para sua própria identidade à instância.
Os usuários com CAN MANAGE
podem criar funções adicionais para outras identidades do Databricks, incluindo privilégios adicionais, e remover funções de qualquer identidade do Databricks.
É possível atribuir permissões adicionais a quaisquer usuários, grupos ou entidades de serviço desejados na página de visão geral das instâncias do banco de dados .
-
Clique em Computação na barra lateral do workspace.
-
Clique em Instâncias de banco de dados.
-
Clique na guia Permissões .
-
Clique em Adicionar função PostgreSQL no canto superior direito.
-
Para a identidade do espaço de trabalho , insira um usuário, grupo ou entidade de serviço e selecione a identidade Databricks. É necessário selecionar uma identidade Databricks que ainda não possua uma função Postgres na instância.
-
Selecione uma associação à função . Se você tiver a permissão
CAN MANAGE
na instância do banco de dados, poderá adicionar associação à funçãodatabricks_superuser
e ativar alguns atributos da função. -
Selecione quais atributos do PostgreSQL serão concedidos à nova função.
CREATEDB
: concede permissão para criar novos bancos de dadosCREATEROLE
: concede permissão para criar novas funçõesBYPASS RLS
: concede permissão para ignorar toda a segurança em nível de linha na instância
-
Clique em Confirmar .
Antes de criar novas funções do Postgres, verifique se você atende aos seguintes requisitos:
- Você deve ter as permissões
CREATE
eCREATE ROLE
no banco de dados. - É necessário autenticar-se e log in no Postgres como uma identidade Databricks (usuário, entidade de serviço ou grupo). As sessões autenticadas pelo Postgres nativo não podem criar funções do Databricks.
- Os seus tokens de autenticação devem estar válidos e não expirados no momento da criação da função.
Use a função databricks_create_role
para adicionar e criar funções do PostgreSQL baseadas em identidade da Databricks. A extensão personalizada do PostgreSQL databricks_auth
fornece a função databricks_create_role
.
-
Crie a extensão
databricks_auth
. Cada banco de dados Postgres deve ter sua própria extensão.SQLCREATE EXTENSION IF NOT EXISTS databricks_auth;
-
Use a função
databricks_create_role
para adicionar e criar novas funções do Postgres para identidades do Databricks. A função ainda não deve existir. Se existir uma função com o mesmo nome, elimine-a antes de criar a função baseada em identidade do Databricks.SQLSELECT databricks_create_role('identity_name', 'identity_type');
Os parâmetros
identity_name
eidentity_type
dependem do tipo de identidade do Databricks:-
Usuário da Databricks:
- identity_name: e-mail do usuário, por exemplo.
myuser@databricks.com
- tipo_identidade:
USER
SQLSELECT databricks_create_role('myuser@databricks.com','USER');
- identity_name: e-mail do usuário, por exemplo.
-
Databricks entidade de serviço:
- identity_name: ID do aplicativo da entidade de serviço, por exemplo.
8c01cfb1-62c9-4a09-88a8-e195f4b01b08
- tipo_identidade:
SERVICE_PRINCIPAL
SQLSELECT databricks_create_role('8c01cfb1-62c9-4a09-88a8-e195f4b01b08','SERVICE_PRINCIPAL');
- identity_name: ID do aplicativo da entidade de serviço, por exemplo.
-
Grupo Databricks:
- identity_name: Nome do grupo (diferencia maiúsculas de minúsculas):
My Group 123
- tipo_identidade:
GROUP
SQLSELECT databricks_create_role('My Group 123','GROUP');
- identity_name: Nome do grupo (diferencia maiúsculas de minúsculas):
-
-
Uma função criada usando
databricks_create_role
só tem privilégios concedidos aPUBLIC
após a criação. Para conceder ou revogar privilégios adicionais, use o comando padrão de gerenciamento de privilégios do PostgresGRANT
eREVOKE
.Dê permissão de leitura à função para acessar uma tabela.
SQLGRANT SELECT ON "my_schema"."my_table" TO <role-name>;
Remova o acesso de gravação a uma tabela da função.
SQLREVOKE INSERT, UPDATE, DELETE ON TABLE "my_schema"."my_table" FROM <role-name>;
Revogue todo o acesso da função a um banco de dados.
SQLREVOKE CONNECT ON DATABASE "example_database" FROM <role-name>;
visualizar funções de identidade d Databricks
- UI
- PostgreSQL
É possível visualizar quais usuários, grupos e entidades de serviço possuem uma função Postgres correspondente na página de visão geral das instâncias de banco de dados .
- Clique em Computação na barra lateral do workspace.
- Clique em Instâncias de banco de dados.
- Clique na guia Permissões .
Utilize consultas PostgreSQL para listar todas as funções de identidade Databricks criadas por default e, a partir da função databricks_create_role
, utilize a função databricks_list_roles
na extensão databricks_auth
. Isso lista todos os usuários Databricks, entidade de serviço e grupos adicionados para autenticação como funções Postgres.
CREATE EXTENSION IF NOT EXISTS databricks_auth;
SELECT * from databricks_list_roles;
Eliminar uma função Postgres baseada em identidade da Databricks
- UI
- PostgreSQL
A eliminação de uma função não pode ser desfeita. Você pode recriar uma função, mas qualquer reatribuição de propriedade de objeto não é reversível sem eliminar a nova função que possui objetos reatribuídos.
- Clique em Computação na barra lateral do workspace.
- Clique em Instâncias de banco de dados.
- Clique na guia Permissões .
- Para a identidade da função que você deseja eliminar, no lado direito, clique em.
- Clique em Descartar função .
- Se você precisar abandonar uma função que possui objetos, ative Reatribuir objetos de propriedade . Isso reatribuirá todos os objetos de propriedade reatribuíveis (bancos de dados, esquemas e tabelas) à outra função e, em seguida, eliminará todos os objetos de propriedade não reatribuíveis.
- Clique em Confirmar .
Uma função do Postgres baseada em identidade da Databricks pode ser descartada e removida da mesma forma que qualquer outra função do Postgres. Para obter mais detalhes, consulte a documentação do PostgreSQL sobre eliminação de funções. Depois que uma função baseada em identidade Databricks é descartada, ela não pode ser usada para autenticação baseada em tokens e acesso ao Postgres.
Utilize consultas PostgreSQL para verificar as permissões do Postgres.
Para ler ou gravar em uma tabela no Postgres, os usuários precisam das seguintes permissões:
- CONNECT no banco de dados
- USO no esquema
- USO na mesa
Verifique as permissões do usuário em uma tabela específica
Execute a seguinte instrução SQL para criar uma função chamada pg_temp.check_permissions
que verifica as permissões de um usuário, incluindo permissões herdadas.
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
;
Para utilizar a função, substitua um nome de usuário do Databricks por <your_user>
, o nome da sua instância por databricks_postgres
e o nome da sua tabela por <my_table>
na seguinte consulta:
SELECT * FROM pg_temp.check_permissions('<your_user>', 'databricks_postgres', 'public', '<my_table>');
visualizar todas as permissões para banco de dados, esquema e tabela
A seguinte instrução " SQL " cria uma função chamada " pg_temp.make_owner_acl
" que retorna uma lista detalhada " view " de todas as permissões concedidas, excluindo permissões herdadas, para todos os usuários:
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
;
Para usar a função, substitua o nome da instância por databricks_postgres
e o nome da tabela por <my_table>
na consulta a seguir:
SELECT * FROM pg_temp.get_all_permissions('databricks_postgres', 'public', '<mytable>');
Verifique a hierarquia de herança de funções
No Postgres, uma função pode ser membro de outra função, e a associação especifica se as permissões são herdadas da função principal. Para visualizar todas as funções das quais uma determinada função faz parte, utilize a seguinte instrução SQL para criar a função 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
;
Para utilizar a função, substitua <your_user>
por um nome de usuário Databricks:
SELECT * FROM pg_temp.get_inherited_roles('<your role>');
Encontre administradores de funções
Para visualizar o administrador de uma função, utilize a seguinte consulta SQL e substitua o nome da função por <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;