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.
NotaPara 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.
NotaPor 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
-
Crie uma função que negue o acesso à UDF por padrão.
-
No cliente MaxCompute, execute o comando abaixo para criar uma função chamada denyudfrole.
create role denyudfrole; -
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" } ] } -
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; -
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"} -
Execute o comando a seguir para adicionar o usuário RAM à função denyudfrole.
grant denyudfrole to RAM$xxxx.pt@aliyun-test.com:ramtest;
-
-
Verifique se a criação da função de negação de UDF foi bem-sucedida.
-
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 -
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).
-
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 privilegO 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.
-
-
Configure a política de projeto.
-
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" }] } -
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; -
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"} -
Verifique executando
whoami;eshow 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] -
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
-
-