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, somente o proprietário da instância pode log in e acessar a instância por meio do Postgres. Para permitir que outras identidades Databricks log in acessem a instância do banco de dados, a identidade Databricks deve ter 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 do Postgres e conceder privilégios para identidades do Databricks
Crie funções do Postgres usando a interface do usuário do Databricks ou consultas do 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 o senhor tenha o nível de acesso adequado antes de tentar gerenciar as funções.
- UI
- PostgreSQL
Os usuários com permissão CAN USE
na instância do banco de dados podem view as funções existentes do Postgres associadas às identidades Databricks ou adicionar uma função para sua própria identidade na instância.
Os usuários com CAN MANAGE
podem também criar funções para outras identidades da Databricks, inclusive com privilégios adicionais, e eliminar funções para qualquer identidade da Databricks.
O senhor pode 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 Add PostgreSQL role (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. O senhor deve selecionar uma identidade Databricks que ainda não tenha 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 os atributos do PostgreSQL a serem 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. - O senhor deve se autenticar e acessar log in no Postgres como uma identidade Databricks (usuário, entidade de serviço ou grupo). As sessões autenticadas do Postgres nativo não podem criar funções do Databricks.
- Seus tokens de autenticação devem ser válidos e não ter expirado 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 Databricks funções de identidade
- UI
- PostgreSQL
É possível ver quais usuários, grupos e entidades de serviço têm 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 .
Use as consultas PostgreSQL para listar todas as funções de identidade Databricks criadas por default e, a partir do uso da função databricks_create_role
, use a função databricks_list_roles
na extensão databricks_auth
. Lista todos os usuários do Databricks, entidade de serviço e grupos adicionados para autenticação como funções do 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.
Use as consultas do 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, inclusive as 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 usar a função, substitua um nome de usuário do Databricks por <your_user>
, o nome da instância por databricks_postgres
e o nome da tabela por <my_table>
na consulta a seguir:
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
O seguinte comando SQL cria uma função chamada pg_temp.make_owner_acl
que retorna um view detalhado de todas as permissões concedidas, excluindo as 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 ver todas as funções das quais uma determinada função faz parte, use 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 usar a função, substitua um nome de usuário do Databricks por <your_user>
:
SELECT * FROM pg_temp.get_inherited_roles('<your role>');
Encontre administradores de funções
Para ver o administrador de uma função, use 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;