Compartilhamento de dados protegidos por uma política

Esta versão preliminar permite que os consumidores de compartilhamento de dados usem uma função de banco de dados compartilhada para acessar dados compartilhados protegidos por uma política de mascaramento ou uma política de acesso a linhas.

Visão geral

Um provedor de compartilhamento de dados pode usar a função de contexto IS_DATABASE_ROLE_IN_SESSION nas condições de uma política de mascaramento ou de uma política de acesso a linhas para permitir que um consumidor de compartilhamento de dados acesse dados compartilhados protegidos por qualquer uma dessas políticas. Isso oferece mais opções ao provedor para compartilhar dados e permite que o consumidor acesse dados confidenciais que o provedor disponibiliza.

O provedor pode optar por agrupar a política e os objetos compartilhados em um único banco de dados ou em bancos de dados diferentes. Quando as políticas e tabelas protegidas estiverem em bancos de dados diferentes, o provedor deverá:

  • Compartilhar ambos os bancos de dados com a conta do consumidor.

  • Criar a função de banco de dados no mesmo banco de dados da política.

  • Conceder a função de banco de dados para o compartilhamento.

Quando o consumidor cria um banco de dados a partir do compartilhamento, as funções de banco de dados no compartilhamento são concedidas à função que cria o banco de dados a partir do compartilhamento. Isso permite que a função da conta do consumidor atenda às condições da política que especificam a função do banco de dados e acesse os dados compartilhados.

Para acessar os dados compartilhados protegidos pela política, o consumidor deve especificar o banco de dados que contém a função de banco de dados compartilhada para tornar a função de banco de dados compartilhada ativa na sessão atual. Neste contexto, tornar a função de banco de dados ativa significa que a função de banco de dados está disponível na hierarquia de funções da função atual do usuário. Se você não especificar esse banco de dados compartilhado, os usuários na conta do consumidor não poderão acessar dados compartilhados protegidos por uma política. Você pode especificar esse banco de dados usando uma das seguintes opções:

  • Ative o banco de dados na sessão com o comando USE <objeto> ou selecione o banco de dados na planilha. Por exemplo:

    USE DATABASE mounted_db;
    
    Copy

    Observe que mounted_db é o nome do banco de dados que o consumidor cria a partir do compartilhamento.

  • Para uma consulta específica, utilize o nome completo do objeto que está no mesmo banco de dados que a função de banco de dados. Por exemplo:

    SELECT * FROM mounted_db.myschema.mytable;
    
    Copy

Chamada da função

Existem duas maneiras diferentes de especificar argumentos na função de contexto IS_DATABASE_ROLE_IN_SESSION: uma cadeia de caracteres literal ou um não literal (ou seja, nome da coluna).

  • Quando você especifica uma função de banco de dados como uma cadeia de caracteres na função de contexto IS_DATABASE_ROLE_IN_SESSION, o resultado da chamada da função depende de como a função é chamada. Por exemplo:

    • Em uma planilha, o Snowflake examina o banco de dados que está em uso para a sessão ou o banco de dados especificado na consulta. Isso se aplica tanto à conta do provedor quanto à conta do consumidor.

    • Em uma política, UDF ou exibição, o Snowflake analisa o banco de dados onde a política é definida quando a política é compartilhada. Quando a política não é compartilhada, o Snowflake retornará um erro se a pesquisa da função de banco de dados resultar na definição da função de banco de dados em um banco de dados diferente.

      A Role Context Function cannot reference a DB Role in another database.
      
      Copy
  • Ao especificar um nome de coluna como argumento na função de contexto IS_DATABASE_ROLE_IN_SESSION:

    • Se uma consulta de tabela chamar a função, a coluna será mapeada para o identificador da tabela que contém a coluna. Snowflake então examina as funções de banco de dados no banco de dados que contém a tabela. Por exemplo, para especificar a coluna AUTHZ_ROLE (ou seja, função autorizada) como argumento:

      SELECT * FROM mydb.myschema.t WHERE IS_DATABASE_ROLE_IN_SESSION(AUTHZ_ROLE);
      
      Copy
    • Se uma política de mascaramento, política de acesso a linhas ou UDF chamar a função, a pesquisa ocorrerá no banco de dados que contém a política ou UDF.

Fluxo de trabalho geral

O compartilhamento de dados protegidos por política com a função IS_DATABASE_ROLE_IN_SESSION na política requer as mesmas etapas para criar uma política para chamar a função e compartilhar dados. Para resumir:

  1. O provedor cria uma função de conta.

  2. O provedor cria uma política e a define em uma tabela ou coluna.

  3. O provedor testa a política com a função de conta.

  4. O provedor cria uma função de banco de dados e testa a política com a função de banco de dados.

  5. O provedor cria um compartilhamento e concede privilégios ao compartilhamento, inclusive concedendo a função de banco de dados ao compartilhamento.

  6. O consumidor cria um banco de dados a partir do compartilhamento (ou seja, o banco de dados acoplado).

  7. O consumidor consulta o objeto compartilhado protegido pela política.

Exemplo: todos os objetos no mesmo banco de dados

Neste exemplo, as funções de banco de dados, a política de mascaramento e a tabela protegida estão todas no mesmo banco de dados chamado mydb.

Para referência:

  • As funções de banco de dados são mydb.analyst e mydb.support.

  • A política de mascaramento é definida da seguinte forma:

    CREATE OR REPLACE MASKING POLICY mydb.policies.email_mask
      AS (val string) RETURNS string ->
      CASE
        WHEN IS_DATABASE_ROLE_IN_SESSION('MYDB.ANALYST')
          THEN val
        WHEN IS_DATABASE_ROLE_IN_SESSION('MYDB.SUPPORT')
          THEN REGEXP_REPLACE(val,'.+\@','*****@')
        ELSE '********'
      END
      COMMENT = 'use database role for shared data'
      ;
    
    Copy
  • A coluna EMAIL está em uma tabela chamada mydb.tables.empl_info e a política de mascaramento está definida nesta coluna.

Conclua as etapas a seguir para compartilhar o banco de dados mydb e permitir que o consumidor use a função de banco de dados compartilhado para consultar os dados compartilhados protegidos pela política de mascaramento compartilhado. Estas etapas pressupõem que o provedor já tenha testado a política de mascaramento na coluna EMAIL com suas funções de conta e de banco de dados.

  1. Na conta do provedor, execute o comando CREATE SHARE para criar um compartilhamento para a função de banco de dados mydb.analyst_share:

    USE ROLE r1;
    CREATE SHARE analyst_share;
    
    Copy
  2. Conceda privilégios à função. Os mesmos privilégios são necessários para cada compartilhamento:

    USE ROLE r1;
    GRANT USAGE ON DATABASE mydb TO SHARE analyst_share;
    GRANT USAGE ON SCHEMA mydb.policies TO SHARE analyst_share;
    GRANT USAGE ON SCHEMA mydb.tables TO SHARE analyst_share;
    GRANT SELECT ON TABLE mydb.tables.empl_info TO SHARE analyst_share;
    GRANT DATABASE ROLE mydb.analyst TO SHARE analyst_share;
    
    Copy
  3. Adicione contas de consumidor ao compartilhamento:

    ALTER SHARE analyst_share ADD ACCOUNTS = consumer_account;
    
    Copy
  4. Na conta do consumidor, crie a função de conta r1 e conceda privilégios a esta função para importar o compartilhamento:

    USE ROLE ACCOUNTADMIN;
    CREATE ROLE r1;
    
    GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE r1;
    GRANT CREATE DATABASE ON ACCOUNT TO ROLE r1;
    GRANT IMPORT SHARE ON ACCOUNT TO ROLE r1;
    GRANT ROLE r1 TO ROLE ACCOUNTADMIN;
    
    Copy
  5. Importe o compartilhamento:

    USE ROLE r1;
    CREATE DATABASE mounted_db FROM SHARE provider_account.analyst_share;
    
    Copy
  6. Verifique se a função do banco de dados na sessão:

    USE DATABASE mounted_db;
    USE SCHEMA mounted_db.tables;
    
    SELECT IS_DATABASE_ROLE_IN_SESSION('mounted_db.analyst');
    
    Copy

    A instrução SELECT deve retornar True.

  7. Consulte a tabela protegida:

    SELECT * FROM empl_info;
    
    Copy

    A instrução SELECT deve retornar os endereços de e-mail sem mascaramento.

  8. Conceda as funções de banco de dados às funções de conta para que os usuários com essas funções possam consultar a tabela protegida e visualizar dados com base na definição da política de mascaramento.

    Depois de repetir as duas etapas anteriores, um usuário que recebe a função de banco de dados mydb.support deverá ver um endereço de e-mail parcialmente mascarado.

Exemplo: política de mascaramento e dados protegidos em bancos de dados diferentes

Quando a política e a tabela protegida estiverem em bancos de dados diferentes, ambos os bancos de dados deverão ser compartilhados com o consumidor.

Por exemplo:

  • mydb1 contém a política de mascaramento e a função de banco de dados mydb1.analyst. Você deve agrupar a política e a função de banco de dados no mesmo banco de dados.

  • mydb2 contém a tabela chamada mydb2.tables.empl_info, que contém a coluna EMAIL. A política de mascaramento está definida nesta coluna.

O provedor segue o mesmo procedimento do exemplo anterior em termos de criação de um compartilhamento, concessão de privilégios ao compartilhamento e concessão da função de banco de dados ao compartilhamento.

O consumidor segue o mesmo procedimento do exemplo anterior em termos de criação de um banco de dados a partir do compartilhamento. Porém, o consumidor deve ter o banco de dados que contém a política em uso para ativar a função de banco de dados. Em seguida, o consumidor pode consultar a tabela protegida especificando o nome totalmente qualificado da tabela.

  1. Na conta do provedor, execute o comando CREATE SHARE para criar um compartilhamento para cada banco de dados:

    USE ROLE r1;
    CREATE SHARE analyst_policy_share;
    CREATE SHARE analyst_table_share;
    
    Copy
  2. Conceda privilégios ao compartilhamento chamado analyst_policy_share:

    USE ROLE r1;
    GRANT USAGE ON DATABASE mydb1 TO SHARE analyst_policy_share;
    GRANT USAGE ON SCHEMA mydb1.policies TO SHARE analyst_policy_share;
    GRANT DATABASE ROLE mydb1.analyst TO SHARE analyst_policy_share;
    
    Copy
  3. Conceda privilégios ao compartilhamento chamado analyst_table_share:

    USE ROLE r1;
    GRANT USAGE ON SCHEMA mydb2.tables TO SHARE analyst_table_share;
    GRANT SELECT ON TABLE mydb2.tables.empl_info TO SHARE analyst_table_share;
    
    Copy
  4. Adicione contas de consumidor ao compartilhamento:

    ALTER SHARE analyst_policy_share ADD ACCOUNTS = consumer_account;
    ALTER SHARE analyst_table_share ADD ACCOUNTS = consumer_account;
    
    Copy
  5. Na conta do consumidor, crie a função de conta r1 e conceda privilégios a esta função para importar o compartilhamento:

    USE ROLE ACCOUNTADMIN;
    CREATE ROLE r1;
    
    GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE r1;
    GRANT CREATE DATABASE ON ACCOUNT TO ROLE r1;
    GRANT IMPORT SHARE ON ACCOUNT TO ROLE r1;
    GRANT ROLE r1 TO ROLE ACCOUNTADMIN;
    
    Copy
  6. Importe cada compartilhamento:

    USE ROLE r1;
    CREATE DATABASE mounted_db1 FROM SHARE provider_account.analyst_policy_share;
    CREATE DATABASE mounted_db2 FROM SHARE provider_account.analyst_table_share;
    
    Copy
  7. Verifique se a função do banco de dados na sessão:

    USE DATABASE mounted_db1;
    USE SCHEMA mounted_db1.policies;
    
    SELECT IS_DATABASE_ROLE_IN_SESSION('mounted_db1.analyst');
    
    Copy

    A instrução SELECT deve retornar True.

  8. Consulte a tabela protegida:

    SELECT * FROM mounted_db2.tables.empl_info;
    
    Copy

    A instrução SELECT deve retornar os endereços de e-mail sem mascaramento.

Exemplo: política de acesso a linhas sem tabela de mapeamento

Neste exemplo, a política de acesso a linhas chama a função IS_DATABASE_ROLE_IN_SESSION para pesquisar o nome da função na coluna AUTHZ_ROLE (ou seja, função autorizada). Observe a sintaxe não literal e que a pesquisa da função ocorre no banco de dados que contém a política. Neste cenário, a tabela de mapeamento deve estar no mesmo banco de dados que a política de acesso a linhas.

Crie a política:

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role AS (authz_role string)
RETURNS boolean ->
IS_DATABASE_ROLE_IN_SESSION(authz_role);
Copy

Adicione a política a uma tabela:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
Copy

O provedor pode optar por compartilhar objetos em um único banco de dados ou em vários bancos de dados, conforme mostrado nos exemplos de políticas de mascaramento. O consumidor segue o mesmo procedimento para criar um banco de dados a partir de um compartilhamento para cada banco de dados que o provedor disponibiliza.

Exemplo: política de acesso a linhas com tabela de mapeamento

Neste exemplo, a política de acesso a linhas chama a função IS_DATABASE_ROLE_IN_SESSION para procurar a função autorizada em uma coluna da tabela de mapeamento chamada ROLE_NAME. Observe a sintaxe não literal e que a pesquisa da função ocorre no banco de dados que contém a política. Neste cenário, a tabela de mapeamento deve obrigatoriamente estar no mesmo banco de dados que a política de acesso a linhas. Após criar a política, adicione a política à tabela que contém a coluna AUTHZ_ROLE.

Crie a política:

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role_map AS (authz_role string)
RETURNS boolean ->
EXISTS (
  SELECT 1 FROM mapping_table m
  WHERE authz_role = m.key AND IS_DATABASE_ROLE_IN_SESSION(m.role_name)
);
Copy

Adicione a política a uma tabela:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);
Copy

O provedor pode optar por compartilhar objetos em um único banco de dados ou em vários bancos de dados, conforme mostrado nos exemplos de políticas de mascaramento. O consumidor segue o mesmo procedimento para criar um banco de dados a partir de um compartilhamento para cada banco de dados que o provedor disponibiliza.