Todos os produtos
Search
Central de documentação

DataWorks:Melhor prática: Conceder acesso de um usuário específico a uma UDF

Última atualização: Aug 20, 2026

Este tópico explica como restringir o acesso a recursos, como tabelas e funções definidas pelo usuário (UDFs), a usuários específicos. Esse método é comum para segurança e controle de dados, especialmente quando uma UDF envolve criptografia ou descriptografia.

Pré-requisitos

Instale o cliente MaxCompute. Para mais informações, consulte Instale e configure o cliente MaxCompute.

Informações de base

Os métodos padrão para configurar permissões de acesso de usuário incluem:

  • Uso de packages para controle de permissão granular

    Um package compartilha dados e autoriza o acesso a recursos entre projetos. No entanto, conceder a função de desenvolvedor a um usuário por meio de um package atribui permissões totais, o que gera risco de segurança. Para mais informações, consulte Acesse recursos entre projetos usando packages.

    • A saída abaixo mostra as permissões da função de desenvolvedor do DataWorks:

      odps@ xxx    desc role role_project_dev;
      
      Authorization Type: Policy
      A       projects/sz_mc: *
      A       projects/sz_mc/instances/*: *
      A       projects/sz_mc/jobs/*: *
      A       projects/sz_mc/offlinemodels/*: *
      A       projects/sz_mc/packages/*: *
      A       projects/sz_mc/registration/functions/*: *
      A       projects/sz_mc/resources/*: *
      A       projects/sz_mc/tables/*: *
      A       projects/sz_mc/volumes/*:

      Por padrão, a função de desenvolvedor tem permissões totais sobre packages, funções, recursos e tabelas no workspace. Essa abordagem concede permissões excessivamente amplas.

    • A saída a seguir exibe as permissões concedidas a um usuário RAM após a atribuição da função de desenvolvedor no DataWorks:

      odps@ xxx> show grants for RAM$yxxx.pt@aliyun-test.com:ramtest;
      
      [roles]
      role_project_dev
      
      Authorization Type: Policy
      [role/role_project_dev]
      A	projects/sz_mc: *
      A	projects/sz_mc/instances/*: *
      A	projects/sz_mc/jobs/*: *
      A	projects/sz_mc/offlinemodels/*: *
      A	projects/sz_mc/packages/*: *
      A	projects/sz_mc/registration/functions/*: *
      A	projects/sz_mc/resources/*: *
      A	projects/sz_mc/tables/*: *
      A	projects/sz_mc/volumes/*: *

    Portanto, nem a autorização por package nem as funções padrão do DataWorks atendem ao requisito de permitir que um usuário específico acesse uma UDF específica. Por exemplo, se você conceder a função de desenvolvedor ao usuário RAM RAM$xxxxx.pt@aliyun-test.com:ramtest, ele terá todas as permissões em todos os objetos do workspace atual por padrão. Para mais informações, consulte Autorização de Usuário.

  • Criação de uma função personalizada no DataWorks para controlar permissões

    Na página MaxCompute Advanced Settings da configuração do seu workspace no DataWorks, gerencie as permissões para funções de usuário personalizadas. Contudo, nessa página, conceda permissões apenas em uma tabela ou projeto específico, e não em recursos individuais ou UDFs.

    Nota

    Para mais informações sobre as propriedades do MaxCompute em um workspace do DataWorks, consulte Configure as permissões do mecanismo MaxCompute.

  • Combinação de política de função e política de projeto para conceder acesso a uma UDF específica

    As políticas permitem controle granular sobre as permissões de usuários em recursos específicos.

    Nota

    Por questões de segurança, teste as políticas em um projeto de teste antes de aplicá-las em ambiente de produção.

Sendo assim, utilize políticas para conceder acesso de um usuário específico a uma UDF específica seguindo este padrão:

  • Para impedir que outros usuários acessem recursos específicos em um workspace, conceda primeiro a permissão de desenvolvedor de dados no DataWorks e, em seguida, use uma política de função no cliente MaxCompute para negar explicitamente o acesso.

  • Caso precise conceder acesso a um recurso específico para um usuário determinado, conceda primeiro a permissão de desenvolvedor de dados no DataWorks e, depois, utilize uma política de projeto no cliente MaxCompute para permitir explicitamente o acesso.

Etapas

  1. Crie uma função que negue o acesso à UDF por padrão.

    1. No cliente MaxCompute, execute o comando abaixo para criar uma função chamada denyudfrole.

      create role denyudfrole;
    2. Crie um arquivo de política com o seguinte conteúdo.

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Deny",
            "Action": ["odps:Read","odps:List"],
            "Resource": "acs:odps:*:projects/sz_mc/resources/getaddr.jar"
          },
          {
            "Effect": "Deny",
            "Action": ["odps:Read","odps:List"],
            "Resource": "acs:odps:*:projects/sz_mc/registration/functions/getregion"
          }
        ]
      }
    3. Defina a política da função.

      Execute o comando a seguir para aplicar a política do arquivo à função.

      put policy /Users/yangyi/Desktop/role_policy.json on role denyudfrole;
    4. Execute o comando abaixo para visualizar a política da função.

      get policy on role denyudfrole;

      O sistema retorna o seguinte resultado:

      odps@        get policy on role denyudfrole;
      {
          "Statement": [{
                  "Action": ["odps:Read",
                          "odps:List"],
                  "Effect": "Deny",
                  "Resource": ["acs:odps:*:projects/sz_mc/resources/getaddr.jar"]},
              {
                  "Action": ["odps:Read",
                          "odps:List"],
                  "Effect": "Deny",
                  "Resource": ["acs:odps:*:projects/sz_mc/registration/functions/getregion"]}],
          "Version": "1"}
    5. Execute o comando a seguir para adicionar o usuário RAM à função denyudfrole.

      grant denyudfrole to RAM$xxxx.pt@aliyun-test.com:ramtest;
  2. Verifique se a criação da função de negação de UDF foi bem-sucedida.

    1. Faça login no cliente e insira whoami; para confirmar a função.

      odps@ xxx>whoami;
      Name: RAM$xxx pt@aliyun-test.com:ramtest
      End_Point: http://service.odps.aliyun.com/api
      Tunnel_End_Point: http://dt.cn-shanghai.maxcompute.aliyun.com
      Project: xxx
    2. Execute show grants; para visualizar as permissões do usuário atual.

      odps@xxx    >show grants;
      
      [roles]
      role_project_dev, denyudfrole
      
      Authorization Type: Policy
      [role/denyudfrole]
      D       projects/xxx/registration/functions/getregion: List | Read
      D       projects/xxx/resources/getaddr.jar: List | Read
      [role/role_project_dev]
      A       projects/xxx: *
      A       projects/xxx/instances/*: *
      A       projects/xxx/jobs/*: *
      A       projects/xxx/offlinemodels/*: *
      A       projects/xxx/packages/*: *
      A       projects/xxx/registration/functions/*: *
      A       projects/xxx/resources/*: *
      A       projects/xxx/tables/*: *
      A       projects/xxx/volumes/*: *

      O resultado da consulta mostra que o usuário RAM possui duas funções: role_project_dev (a função padrão de desenvolvedor no DataWorks) e denyudfrole (a função personalizada criada).

    3. Valide as permissões da UDF personalizada e seus packages dependentes.

      odps@ xxx>desc function getregion;
      FAILED: ODPS-0420095: Access Denied - Authorization Failed [4011], You have NO privilege 'odps:Read' on {acs:odps:*:projects/xxx/resources/xxx}. -->Tips: Pricipal:RAMS xxx.pl@aliyun-esl.com.ramlesl by policy
      ID:38747231-386f-4018-b792-1da11700dc7e.
      odps@ xxx>desc resource getaddr.jar;
      FAILED: ODPS-0420095: Access Denied - Authorization Failed [4011], You have NO privilege 'odps:Read' on {acs:odps:*:pro
      1-5788-49b1-82b8-1f4a95c2f9c5.  -->Tips: Pricipal:RAMS xxx.pt@aliyun-test.com [xxx]
      [DEBUG]: com.aliyun.odps.OdpsException: ODPS-0420095: Access Denied - Authorization Failed [4011], You have NO privileg

      O resultado indica que, mesmo com a função de desenvolvedor, o usuário RAM não tem permissão de leitura na UDF personalizada getregion. Configure uma política de projeto para conceder acesso explícito a esse usuário.

  3. Configure a política de projeto.

    1. Escreva a política.

      {
      "Version": "1", "Statement":
      [{
      "Effect":"Allow",
      "Principal":"RAM$yangyi.pt@aliyun-test.com:yangyitest",
      "Action":["odps:Read","odps:List","odps:Select"],
      "Resource":"acs:odps:*:projects/sz_mc/resources/getaddr.jar"
      },
      {
      "Effect":"Allow",
       "Principal":"RAM$yangyi.pt@aliyun-test.com:yangyitest",
      "Action":["odps:Read","odps:List","odps:Select"],
      "Resource":"acs:odps:*:projects/sz_mc/registration/functions/getregion"
      }] }
    2. Aplique a política de projeto.

      Execute o comando a seguir para aplicar a política de projeto do arquivo especificado.

      put policy /Users/yangyi/Desktop/project_policy.json;
    3. Execute o comando abaixo para visualizar a política de projeto.

      get policy;

      O sistema retorna o seguinte resultado:

      odps@ xxx>get policy;
      {
        "Statement": [{
          "Action": ["odps:Read",
            "odps:List",
            "odps:Select"],
          "Effect": "Allow",
          "Principal": ["RAM$xxxl.pt@aliyun-test.com:yangyitest"],
          "Resource": ["acs:odps:*:projects/sz_mc/resources/getaddr.jar"]},
          {
          "Action": ["odps:Read",
            "odps:List",
            "odps:Select"],
          "Effect": "Allow",
          "Principal": ["RAM$yangyi.pt@aliyun-test.com:yangyitest"],
          "Resource": ["acs:odps:*:projects/sz_mc/registrxxx"]
        "Version": "1"}
    4. Verifique executando whoami; e show grants;.

      odps@ xxx    whoami;
      Name: RAM$xxx.pt@aliyun-test.com:yangyitest
      End_Point: http://service.odps.aliyun.com/api
      Tunnel_End_Point: http://dt.cn-shanghai.maxcompute.aliyun.com
      Project: sz_mc
      odps@ xxx    show grants;
      
      [roles]
      role_project_dev
      
      Authorization Type: Policy
      [role/role_project_dev]
      A       projects/sz_mc: *
      A       projects/sz_mc/instances/*: *
      A       projects/sz_mc/jobs/*: *
      A       projects/sz_mc/offlinemodels/*: *
      A       projects/sz_mc/packages/*: *
      A       projects/sz_mc/registration/functions/*: *
      A       projects/sz_mc/resources/*: *
      A       projects/sz_mc/tables/*: *
      A       projects/sz_mc/volumes/*: *
      [user/RAM$yangyi.pt@aliyun-test.com:yangyitest]
    5. Execute uma tarefa SQL para validar que apenas o usuário RAM especificado acessa a UDF e seu package dependente.

      • O usuário RAM especificado acessa a UDF:

        odps@ xxx:select getregion('172.xxx.xxx.1');
        
        ID = 2019011409xxx
        Log view:
        http://logview.odps.aliyun.com/logview/?h=http://service.odps.aliyun.com/api&p=sz_xxx
        U00DA2MTU2Myx7IlN0YXR1xxx/hZCJdLCJFZmZlY3QiOiJBbGxvxxx
        biI6IjEifQ==
        Job Queueing.
        
                 STAGES      STATUS      TOTAL  COMPLETED  RUNNING  PENDING  BACKU
        M1_job_0 ..........  TERMINATED    1        1         0        0
        
        STAGES: 01/01  [==============================>>] 100%  ELAPSED TIME: 24.34 s
        
        Summary:
        resource cost: cpu 0.27 Core * Min, memory 0.53 GB * Min
        inputs:
        outputs:
        Job run time: 18.000
        Job run mode: fuxi job
        Job run engine: execution engine
        M1:
                instance count: 1
                run time: 18.000
                instance time:
                        min: 16.000
      • O usuário acessa o package dependente:

        odps# desc resource getaddr.jar;
        Name                getaddr.jar
        Owner               ALIYUNSxxx.pt@oliyun-test.com
        Type                JAR
        Comment             IDE RESOURCE UPDATE TO ODPS /home/admin/oxs-base-biz-phoenix/temp/4d3efccz0l9eiirin53o5n4/getaddr.jar
        CreatedTime         2018-05-24 19:51:16
        LastModifiedTime    2018-05-24 19:51:16
        LastUpdator
        Size                1353716
        Md5sum              770497a9f605e09e198cb166cec7fa08