Partilhar via


Gerenciar permissões

Importante

Esta funcionalidade está na Pré-visualização Pública nas seguintes regiões: westus, westus2, eastus, eastus2, centralussouthcentralusnortheuropewesteuropeaustraliaeastbrazilsouthcanadacentralcentralindiasoutheastasiauksouth.

Esta página descreve quando e como conceder permissões de usuários e identidades do Azure Databricks a uma instância de banco de dados.

Para permitir que outros usuários usem o PostgreSQL para acessar a instância do banco de dados, o databricks_superuser deve criar funções Postgres correspondentes para eles. Para obter detalhes sobre como criar funções do Postgres, consulte Gerenciar funções do Postgres.

Quando e como as permissões são verificadas

Quando você usa a sintaxe Postgres ou se conecta por meio de uma interface PostgreSQL, o Lakebase impõe controles de acesso específicos do PostgreSQL usando o seguinte:

  • Funções do Postgres
  • Associações de funções
  • Permissões concedidas pelo Postgres

Em todos os outros cenários, o Lakebase impõe controles de acesso específicos do Databricks:

  • Identidades do Azure Databricks (usuários, grupos e entidades de serviço)
  • Associações de grupos do Azure Databricks
  • Listas de controle de acesso ao espaço de trabalho (ACLs)
  • Privilégios do Catálogo Unity

Observação

Não há sincronização automática entre identidades e associações do Azure Databricks e funções e associações do Postgres.

Caso de uso / Permissão ou identidade Gerenciar instâncias de banco de dados Criar ou excluir tabelas sincronizadas Gerenciar pipeline de tabela sincronizada Consultar tabelas Postgres a partir de um armazém SQL Consultar recursos on-line no serviço de recursos e modelos Consultar tabelas do Postgres no PostgreSQL
Identidades do Azure Databricks Requer uma função Postgres correspondente
Associações ao grupo Databricks Verificado apenas ao iniciar sessão como um grupo
ACLs de instância
Pipeline ACLs (Listas de Controlo de Acesso) Precisa ser proprietário de um pipeline ao reutilizar um pipeline existente ou excluir uma tabela sincronizada (que edita o pipeline)
Permissões de UC
Funções do Postgres
Pertencimento a perfis do Postgres
Permissões do Postgres

Permissões de instância de base de dados

Um utilizador deve ter permissões específicas na instância da base de dados para gerir a instância e realizar operações de tabela a partir da interface, API ou SDK do Azure Databricks. Os administradores do espaço de trabalho e o criador da instância podem atribuir permissões adicionais a quaisquer usuários, grupos ou entidades de serviço desejados na página Visão geral das instâncias de banco de dados .

  1. Clique em Computação na barra lateral do espaço de trabalho.
  2. Clique em Banco de Dados OLTP.
  3. Clique na guia Permissões .
  4. Clique em Gerenciar permissões de instância no canto superior direito.
  5. Insira um usuário, grupo ou entidade de serviço para conceder permissões adicionais.
  6. Selecione a permissão que deseja conceder à identidade. Consulte ACLs de instância de banco de dados.
  7. Clique em + Adicionar.
  8. Qualquer usuário de espaço de trabalho pode exibir ou listar instâncias de banco de dados. As permissões de catálogo de banco de dados e tabela sincronizada são ainda mais regidas pelas permissões de metastore, catálogo, esquema e tabela do Unity Catalog. Para obter mais detalhes, consulte Gerenciar privilégios no Catálogo Unity.
  9. Clique em Salvar.

Permissões do Postgres

Para ler ou escrever numa tabela no Postgres, os utilizadores necessitam das seguintes permissões no Postgres:

  • CONNECT na base de dados
  • USAGE no esquema (ou CREATE para criar novas tabelas)
  • SELECT, INSERT, UPDATE, ou DELETE na mesa

Para a lista completa de privilégios Postgres, consulte a documentação PostgreSQL.

Verifique as permissões dos utilizadores numa tabela específica no Postgres

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 usar a função, utilize a seguinte consulta:

SELECT * FROM pg_temp.check_permissions('<your_user>', '<your_database>', '<your_schema>', '<your_table>');

-- Example:
SELECT * FROM pg_temp.check_permissions('joe@acme.org', 'databricks_postgres', 'public', 'table1');

Veja todas as permissões para base de dados, esquema e tabela no Postgres

A instrução SQL a seguir cria uma função chamada pg_temp.make_owner_acl que retorna uma exibição detalhada 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, utilize a seguinte consulta:

SELECT * FROM pg_temp.get_all_permissions('<your_database>', '<your_schema>', '<your_table>');

-- Example:
SELECT * FROM pg_temp.get_all_permissions('databricks_postgres', 'public', 'table1');

Verificar hierarquia de herança de funções no Postgres

No Postgres, uma função pode ser membro de outra função, e a afiliação especifica se as permissões são herdadas da função pai. 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 pg_temp.get_inherited_rolesSQL:

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 Azure Databricks por <your_user>:

SELECT * FROM pg_temp.get_inherited_roles('<your role>');

Encontre administradores de funções no Postgres

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;