Para controlar o acesso a dados específicos em tabelas do MaxCompute por usuários ou funções, o MaxCompute oferece o controle de acesso em nível de linha. Esse recurso permite definir políticas que associam usuários aos dados que eles têm permissão para acessar. A aplicação dessas políticas diretamente a uma tabela garante que usuários e funções visualizem apenas os dados autorizados, aumentando a segurança e a conformidade dos dados.
Informações gerais
As tabelas do MaxCompute podem conter grandes volumes de dados. Em cenários de compartilhamento, os administradores frequentemente precisam garantir que usuários específicos acessem apenas as linhas de dados autorizadas. Anteriormente, controlar o acesso em nível de linha exigia criar uma view separada para cada usuário ou usar uma tarefa ETL para filtrar e copiar dados para outra tabela.
O controle de acesso em nível de linha simplifica esse fluxo de trabalho. Não é necessário mover ou copiar dados, nem criar e manter views.
Esse controle aplica-se aos seguintes cenários:
Consultas SQL.
Baixe dados da tabela usando o MaxCompute Tunnel.
Leitura de dados da tabela por meio de um engine externo, como Spark ou Flink.
Engines que não suportam o controle de acesso em nível de linha do MaxCompute (como o Hologres) não conseguem acessar dados protegidos. Ainda é possível compartilhar dados filtrados utilizando uma view ou uma tabela copiada.
A tabela a seguir descreve os comandos para controle de acesso em nível de linha.
Ações | Descrição | Ponto de entrada |
Crie ou modifique uma Row Access Policy para usuários ou funções especificados. | ||
Exclua uma política de uma tabela. | ||
Visualize os detalhes de permissão de uma política em uma tabela. | ||
Lista as políticas em uma tabela. |
Limitações
-
As seguintes limitações aplicam-se ao controle de acesso em nível de linha:
Somente um administrador (um usuário com a função Admin ou proprietário da tabela) pode configure uma Row Access Policy.
Não é possível configure uma Row Access Policy em uma tabela transacional, view ou materialized view. Também não é permitido crie uma materialized view em uma tabela que já possua uma Row Access Policy, nem adicionar essa política à tabela base de uma materialized view. No entanto, você pode crie uma view baseada em uma tabela com Row Access Policy. Nesse caso, os resultados da consulta na view são determinados tanto pela política da tabela base quanto pelas regras definidas pelo proprietário da view.
Operações de evolução de schema não são suportadas em tabelas com Row Access Policy.
Não adicione uma tabela com Row Access Policy como resource de tabela UDF, nem configure essa política em uma tabela que já seja um resource UDF. O sistema não reporta erro durante a configuração, mas falhas ocorrerão em tempo de execução.
Regras de mascaramento não podem ser adicionadas a tabelas com Row Access Policy.
Atualmente, o controle de acesso em nível de linha não suporta partition pruning. Se
dsfor um campo de partição, talvez seja necessário realizar um scan completo da tabela para filtrar dados, mesmo que uma condição de filtro comods='20220101'esteja especificada emfilter_expr. Para mais informações sobrefilter_expr, consulte Descrição de filter_expr.
-
Ao compartilhar uma tabela com Row Access Policy entre projetos via package, observe as seguintes restrições:
É possível configure permissões em nível de linha para usuários fora do projeto, como a conta Alibaba Cloud ou um usuário RAM do tenant atual.
No uso de tabelas com Row Access Policy entre projetos, apenas políticas de usuário ou políticas DEFAULT são aplicadas.
Não é permitido adicionar outra Row Access Policy a uma tabela em um package que já contenha essa política.
Notas de uso
-
Diversos parâmetros de flag podem afetar o comportamento de operadores ou funções usados em
filter_expr. O MaxCompute verifique se as configurações de parâmetros no momento da execução da consulta correspondem às definições feitas na criação da política. Caso haja divergência, o seguinte erro será exibido:FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.IllegalArgumentException: Row access policy flag mismatch for: xxx -
Antes de execute comandos de controle de acesso em nível de linha, como CREATE, DROP, DESC ou LIST, defina o seguinte parâmetro GUC no nível de sessão para ative o recurso.
NotaEm uma versão futura, esse recurso será ativado por padrão no nível de sessão. Para mais detalhes, consulte os anúncios de lançamento.
SET odps.sql.row.policy.enabled=true; Ao consultar uma tabela com controle de acesso em nível de linha, o volume de dados de entrada para faturamento no modelo pagamento conforme o uso não é reduzido pela filtragem, pois não há suporte a partition pruning. Um usuário com Row Access Policy pode receber um conjunto de resultados filtrado mesmo ao consultar a tabela inteira. A quantidade de dados lidos da tabela de source pode ser maior do que o esperado com base no tamanho do resultado. Monitore seus custos com atenção.
Uma alternativa é implementar o controle de acesso em nível de linha criando e compartilhando múltiplas views ou tabelas com regras de filtro para diferentes usuários. Essa abordagem permite realizar computações sobre dados já filtrados, sendo mais simples e intuitiva. Para mais informações, consulte Controle de acesso em nível de linha. Comparado à criação de objetos compartilhados individuais, o controle nativo torna o plano de execução de consultas da tabela original mais complexo. Por outro lado, elimina a necessidade de criar objetos separados, evita armazenamento redundante e é mais adequado para definir regras para muitos usuários. Escolha o método que melhor atenda às suas necessidades.
Sintaxe
Utilize os comandos CREATE/REPLACE, DROP, DESC e LIST para crie (ou modifique), exclua ou visualize uma Row Access Policy.
CREATE/REPLACE
-
Sintaxe
CREATE [OR REPLACE] ROW ACCESS POLICY [IF NOT EXISTS] <policy_name> ON <table_name> TO <authorized_objects> FILTER USING <filter_expr> [AS <clause>]; -
Descrição
Crie ou modifique uma Row Access Policy para conceder permissões a um usuário ou função especificado.
-
Parâmetros
Parâmetro
Descrição
policy_name
Nome da Row Access Policy. Você pode personalizar este nome.
table_name
Nome da tabela a ser acessada.
authorized_objects
Objeto a ser autorizado. Valores válidos:
USER <user_list>: Lista de nomes de usuário a serem autorizados, separados por vírgulas.ROLE <role_list>: Lista de nomes de funções a receberem permissão. Múltiplos nomes devem ser separados por vírgulas.DEFAULT: Regra padrão aplicada quando nenhuma regra de usuário ou função corresponder.
filter_expr
Expressão de filtro. Para mais detalhes, consulte descrição de filter_expr.
clause
Atributo da Row Access Policy. O valor pode ser
PERMISSIVEouRESTRICTIVE. Consulte Especificação do atributo PERMISSIVE ou RESTRICTIVE.-
Descrição de filter_expr
A versão atual impõe restrições rigorosas a filter_expr:
filter_exprdeve ser uma expressão escalar que resulte em um tipo BOOLEAN.A expressão não pode conter subconsultas ou instruções como SELECT, CREATE ou UPDATE.
filter_exprsó pode referenciar constantes ou colunas da tabela autorizada. Referências a colunas de outras tabelas não são permitidas.É permitido usar operadores nativos do MaxCompute, incluindo relacionais, aritméticos, bit a bit e lógicos. Veja mais em Operadores.
-
Apenas um subconjunto de funções escalares nativas é permitido. Funções definidas pelo usuário (UDFs), funções de agregação e funções de janela não são suportadas. As funções aceitas incluem:
Funções de string: CONCAT, CONCAT_WS, GET_JSON_OBJECT, INSTR, LENGTH, LENGTHB, REGEXP_EXTRACT, REGEXP_REPLACE, REVERSE, SUBSTR, TOLOWER, TOUPPER, TRIM, LTRIM, RTRIM, REPLACE.
Funções matemáticas: ABS, ROUND.
Funções de data e hora: DATEADD, TO_DATE, TO_CHAR.
Outras funções: SIZE, FIELD, COALESCE, IF, SPLIT.
-
Especificação do atributo PERMISSIVE ou RESTRICTIVE
Múltiplas políticas podem aplicar-se a um mesmo usuário. Essas políticas são combinadas para determinar se o acesso a uma linha específica de dados é permitido. Ao crie uma Row Access Policy, utilize
AS {PERMISSIVE | RESTRICTIVE}para defina o atributo comoPERMISSIVEouRESTRICTIVE. Se nenhum atributo for especificado, a política seráPERMISSIVEpor padrão. Exemplo:Quando várias políticas se aplicam a um usuário:
Se todas forem PERMISSIVE, elas se combinam com uma relação OR. O usuário acessará a linha se o
filter_exprde qualquer política for verdadeiro.Se todas forem RESTRICTIVE, a combinação segue uma relação AND. O acesso à linha só ocorre se todas as políticas forem satisfeitas.
-
Caso existam políticas mistas (algumas PERMISSIVE e outras RESTRICTIVE), o usuário só acessará a linha se ambas as condições abaixo forem atendidas:
Pelo menos uma das políticas PERMISSIVE for satisfeita.
Todas as políticas RESTRICTIVE forem satisfeitas.
NotaSempre que adicionar uma nova Row Access Policy a uma tabela, avalie o efeito combinado de todas as políticas existentes. Por exemplo, se um usuário estiver sujeito a políticas RESTRICTIVE e PERMISSIVE simultaneamente, ele deverá atender às condições de todas as políticas RESTRICTIVE e de pelo menos uma PERMISSIVE.
-
Casos de uso
-
Conceder permissões a um usuário específico
Suponha que exista uma tabela chamada
table01contendo uma coluna STRING denominadaregion. Uma Row Access Policy é configurada para restringir o acesso de certos usuários apenas aos registros onde o valor da colunaregionsejachina. Exemplo de comando:CREATE ROW ACCESS POLICY policy01 ON table01 TO USER (aliyun$odps_test01**@aliyun.com,aliyun$odps_test02**@aliyun.com) FILTER USING (region = "china"); -
Conceder permissões a uma função específica
Considere que o sistema possua duas funções,
role1erole2. Autorize essas funções a acessar somente registros onde o camporegionseja igual achina. O comando é:CREATE ROW ACCESS POLICY policy02 ON table01 TO ROLE (role1, role2) FILTER USING (region = "china"); -
Conceder permissões ao usuário padrão
Ao adicionar a primeira Row Access Policy a uma tabela, o acesso torna-se restrito. Usuários que não corresponderem a nenhuma política perderão o acesso aos dados, pois não estarão em uma lista de permissões. Para gerenciar o acesso dos demais usuários, configure uma política padrão. O administrador pode usar os comandos abaixo para modifique as permissões do usuário padrão.
Negar acesso a todos os outros usuários por padrão equivale a especifique que o usuário padrão não possui permissões de acesso.
CREATE ROW ACCESS POLICY policy03 ON table01 TO DEFAULT FILTER USING (false);Para restringir o usuário Default a acessar apenas registros onde o campo
regionsejaother, utilize:CREATE ROW ACCESS POLICY policy04 ON table01 TO default FILTER USING (region = "other");ImportanteAo adicionar uma Row Access Policy a uma tabela, considere o comportamento de acesso dos usuários não abrangidos pelo controle. Se outros usuários acessavam a tabela anteriormente, defina regras explícitas para eles a fim de evitar erros inesperados de negação de acesso.
-
-
Lógica de autorização
O fluxograma a seguir ilustra o processo de autorização quando um usuário acessa uma tabela com Row Access Policy.
DROP
-
Exclua uma política específica de uma tabela.
DROP ROW ACCESS POLICY <policy_name> ON <table_name>; -
Remove todas as políticas de uma tabela.
DROP ALL ROW ACCESS POLICY ON <table_name>;
DESC
Visualize os detalhes de uma política específica em uma tabela.
DESC ROW ACCESS POLICY <policy_name> ON <table_name>;
LIST
-
Lista todas as políticas em uma tabela.
LIST ROW ACCESS POLICY ON <table_name>; -
Exibe as políticas configuradas para um usuário específico em uma tabela.
LIST ROW ACCESS POLICY ON <table_name> TO USER <user_name>; -
Mostra as políticas configuradas para uma função específica em uma tabela.
LIST ROW ACCESS POLICY ON <table_name> TO ROLE <role_name>;
Dados de amostra
Crie uma tabela chamada policy_test e insira dados. Os comandos SQL são:
-- Create a table.
CREATE TABLE policy_test(a bigint, b string);
-- Insert data into the table.
INSERT overwrite TABLE policy_test VALUES(1L, "1"), (2L, "2"), (3L, "3"), (4L, "4");
-- Check the inserted data.
SELECT * FROM policy_test;
-- The following result is returned:
+------------+---+
| a | b |
+------------+---+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+------------+---+
Exemplos
Esta seção apresenta exemplos de uso de permissões em nível de linha para o usuário padrão. Antes de começar, prepare os dados de amostra.
-
Exemplo 1: Conceder uma permissão em nível de linha na tabela
policy_testpara permitir que o usuário Default acesse dados ondea=2L.-
Crie uma Row Access Policy chamada policy01.
CREATE row access policy policy01 ON policy_test TO default filter using (a = 2L); -
Visualize os detalhes da policy01 na tabela policy_test.
DESC row access policy policy01 on policy_test;Resultado retornado:
-- The Restrictive property is set to its default value of false. Authorization Type: Row Access Policy Name: policy01 Objects: acs:odps:*:projects/clone_table_2/tables/policy_test FilterExpr: (a = 2L) NormalizedFilterExpr: (policy_test.a = 2L) Restrictive: false Settings: OK -
Consulte a tabela policy_test para verifique se a autorização está efetiva.
SELECT * FROM policy_test;Resultado retornado:
-- The policy is effective, and only a subset of records is returned. +------------+---+ | a | b | +------------+---+ | 2 | 2 | +------------+---+ -
Se o resumo do Logview contiver as informações abaixo, a filtragem em nível de linha foi acionada.
WARNING:[1,15] row access policy is enabled on table xxx.xxx_xxx.policy_test resource cost: cpu 0.00 Core * Min, memory 0.00 GB * Min inputs: xxx.xxx_xxx.policy_test: 4 (510 bytes) outputs: ----------------------------------------JOB:SQL_0_0_0_job_0---------------------------------------- Job run time: 1.453 Job run mode: service job 2.0 Job run engine: execution engine M1: bubble: 0 instance count: 1 run time: 1.450 instance time:
-
-
Exemplo 2: Adicionar duas permissões permissivas em nível de linha a uma tabela para permitir que o usuário Default acesse dados na tabela policy_test onde
a=2Loua=3L.-
Crie uma Row Access Policy chamada policy02.
CREATE row access policy policy02 ON policy_test TO default filter using (a = 3L); -
Liste todas as políticas na tabela policy_test.
LIST row access policy ON policy_test;Resultado retornado:
Authorization Type: Row Access Policy Name: policy01 Objects: acs:odps:*:projects/clone_table_2/tables/policy_test FilterExpr: (a = 2L) NormalizedFilterExpr: (policy_test.a = 2L) Restrictive: false Settings: Name: policy02 Objects: acs:odps:*:projects/clone_table_2/tables/policy_test FilterExpr: (a = 3L) NormalizedFilterExpr: (policy_test.a = 3L) Restrictive: false Settings: OK -
Consulte a tabela policy_test para confirmar que a autorização está ativa.
SELECT * FROM policy_test;Resultado retornado:
-- The two PERMISSIVE policies, policy01 and policy02, are both in effect. Two records are returned. +------------+---+ | a | b | +------------+---+ | 2 | 2 | | 3 | 3 | +------------+---+
-
-
Exemplo 3: Adicionar duas permissões permissivas e uma restritiva em nível de linha permite que o usuário Default acesse dados na tabela
policy_testque satisfaçam (a=2L||a=3L) &&a<3L.-
Crie uma Row Access Policy chamada policy03 e defina seu atributo como RESTRICTIVE.
CREATE row access policy policy03 ON policy_test TO default filter using (a < 3L) as restrictive; -
Verifique os detalhes da policy03 na tabela policy_test.
DESC row access policy policy03 ON policy_test;Resultado retornado:
-- The Restrictive property is set to true. Authorization Type: Row Access Policy Name: policy03 Objects: acs:odps:*:projects/clone_table_2/tables/policy_test FilterExpr: (a < 3L) NormalizedFilterExpr: (policy_test.a < 3L) Restrictive: true Settings: OK -
Execute uma consulta na tabela policy_test para validar a eficácia da autorização.
select * from policy_test;Resultado retornado:
-- Policies policy01, policy02, and policy03 are all in effect. -- policy01 and policy02 are PERMISSIVE, so only one needs to be satisfied. -- policy03 is RESTRICTIVE and must be satisfied. +------------+---+ | a | b | +------------+---+ | 2 | 2 | +------------+---+
-
-
Exemplo 4: Adicionar uma política PERMISSIVE e uma RESTRICTIVE a uma tabela. O usuário padrão deve satisfazer ambas as condições para acessar os dados.
-
Exclua a Row Access Policy chamada policy01.
SET odps.sql.row.policy.enabled=true; DROP ROW ACCESS POLICY policy01 ON policy_test; -
Visualize as permissões em nível de linha na tabela policy_test.
SET odps.sql.row.policy.enabled=true; LIST ROW ACCESS POLICY ON policy_test;Resultado retornado:
Authorization Type: Row Access Policy Name: policy02 Objects: acs:odps:*:projects/clone_table_2/tables/policy_test FilterExpr: (a = 3L) NormalizedFilterExpr: (policy_test.a = 3L) Restrictive: false Settings: Name: policy03 Objects: acs:odps:*:projects/clone_table_2/tables/policy_test FilterExpr: (a < 3L) NormalizedFilterExpr: (policy_test.a < 3L) Restrictive: true Settings: OK -
Consulte a tabela policy_test para verifique o resultado da autorização.
-- Check the data in the table. SELECT * FROM policy_test;Resultado retornado:
-- The result is empty because the conditions a=3 and a<3 cannot both be true. +------------+------------+ | a | b | +------------+------------+ +------------+------------+
-
Apêndice
Verificação de comportamento de compatibilidade
Ao avaliar uma expressão de filtro, o comportamento do MaxCompute pode ser afetado por parâmetros de flag. Se um usuário defina uma Row Access Policy sob um comportamento de compatibilidade e depois crie outras políticas sob um comportamento diferente, poderá ocorrer vazamento de dados devido a resultados inesperados. Portanto, quando o controle de acesso em nível de linha é aplicado, o sistema verifique o comportamento de compatibilidade vigente no momento da definição. Se as configurações forem inconsistentes, um erro será reportado e o acesso negado.
Exemplo: Este exemplo utiliza os dados de amostra para demonstrar como as políticas são aplicadas sob diferentes comportamentos de compatibilidade.
-
O modo de compatibilidade com Hive influencia o comportamento da função
SUBSTRquando seu segundo parâmetro é 0. Para mais detalhes, consulte SUBSTR.-
No modo de compatibilidade com Hive, uma posição inicial 0 para a função
SUBSTRproduz o mesmo resultado que a posição inicial 1.SET odps.sql.hive.compatible=true; SELECT substr('abc', 0); -- In Hive compatibility mode, a start position of 0 is treated the same as a start position of 1. +-----+ | _c0 | +-----+ | abc | +-----+ -
Fora do modo de compatibilidade com Hive, uma posição inicial 0 retorna uma string vazia.
SET odps.sql.hive.compatible=false; SELECT substr('abc', 0); -- Outside of Hive compatibility mode, a start position of 0 returns an empty string. +-----+ | _c0 | +-----+ | | +-----+
-
-
Durante a criação de uma Row Access Policy, o sistema verifique os operadores e funções usados em
filter_expr. Se o comportamento deles depender de certos parâmetros de Flag, esses parâmetros serão registrados emSettings. Utilize o comando DESC para visualize os parâmetros de Flag relevantes.-- Delete all policies on the table. DROP ALL row access policy ON policy_test; -- Configure a policy in Hive compatibility mode, using the SUBSTR function in filter_expr. SET odps.sql.hive.compatible=true; CREATE row access policy policy04 ON policy_test TO default filter using(substr(b, 0)='1'); -- View the details of the policy configured on the policy_test table. DESC row access policy policy04 on policy_test;Resultado retornado: O campo
Settingsexibe o valor do parâmetroodps.sql.hive.compatible.Authorization Type: Row Access Policy Name: policy04 Objects: acs:odps:*:projects/sql_optimizer/tables/policy_test FilterExpr: substr(b, 0) = '1' NormalizedFilterExpr: ::substr(policy_test.b, 0) = '1' Restrictive: false Settings: odps.sql.hive.compatible=true -
Na aplicação subsequente da política, o sistema verifique se os
Settingsdo ambiente atual são consistentes com osSettingsvigentes na criação da política. Em caso de inconsistência, um erro é reportado.-
Aplique a política no modo de compatibilidade com Hive.
SET odps.sql.hive.compatible=true; SELECT * FROM policy_test;Resultado retornado:
+------------+---+ | a | b | +------------+---+ | 1 | 1 | +------------+---+ -
No modo não compatível com Hive, a consulta falha porque o valor do parâmetro
odps.sql.hive.compatibledifere daquele especificado na criação da política.SET odps.sql.hive.compatible=false; SELECT * FROM policy_test;Resultado retornado:
FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.IllegalArgumentException: Row access policy flag mismatch for: odps.sql.hive.compatible, flag value when grant this policy is true, while at runtime is false. please set odps.sql.hive.compatible = true or contact your project manager.
-
Comportamento de baixe do MaxCompute Tunnel
Ao baixe dados de uma tabela com Row Access Policy usando o MaxCompute Tunnel, as regras de controle de acesso em nível de linha ainda devem ser seguidas. Contudo, o Tunnel não execute a lógica de filtragem diretamente. Em vez disso, ele inicia uma tarefa SQL para filtrar os dados e, em seguida, realiza o baixe do resultado.
Portanto, ao usar comandos do Tunnel ou o Tunnel SDK para baixe dados de uma tabela do MaxCompute com Row Access Policy, haverá um período de espera enquanto a tarefa SQL é executada.
Desativação da criação de Row Access Policies
Para impedir a criação de novas Row Access Policies em um projeto, o administrador pode execute o comando abaixo para modifique as propriedades do projeto:
Somente administradores podem usar o comando setproject para modifique este parâmetro no nível do Projeto. Usuários não podem alterar o valor do parâmetro no nível de Sessão.
setproject odps.sql.create.row.policy.disable=true;
Valores válidos:
false(padrão): Permite a criação de novas Row Access Policies.true: Proíbe a criação de novas Row Access Policies, mas permite modifique e exclua políticas existentes.