Uso de políticas de privacidade para privacidade diferencial

Este tópico descreve como um provedor de dados usa políticas de privacidade para implementar privacidade diferencial.

Sobre as políticas de privacidade

Com a privacidade diferencial, o Snowflake deve verificar cada consulta para determinar se ela excederá o orçamento de privacidade associado ao usuário que executa a consulta. As políticas de privacidade tornam isso possível. Um provedor de dados cria uma política de privacidade que associa usuários a orçamentos de privacidade e, em seguida, atribui essa política a tabelas e exibições para torná-las protegidas em termos de privacidade.

Quando um analista executa uma consulta em uma tabela com uma política de privacidade, o Snowflake avalia o corpo da política e executa uma das seguintes ações:

  • Se a política associar o usuário a um orçamento de privacidade, o Snowflake garante que a perda de privacidade incorrida pela consulta não exceda esse orçamento de privacidade. Se a consulta for executada com sucesso, o Snowflake adicionará a perda de privacidade incorrida pela consulta à perda cumulativa de privacidade do usuário para que consultas subsequentes não excedam o orçamento de privacidade.

  • Se a política indicar que o usuário pode consulta a tabela sem restrições, os resultados não conterão ruído e o Snowflake não rastreará a perda de privacidade incorrida pela consulta.

Práticas recomendadas da política de privacidade

Você pode criar uma única política de privacidade para proteger uma única entidade e, em seguida, atribuir a política de privacidade a todas as tabelas e exibições que contêm informações para essa entidade. Isso agrupa todos os orçamentos de privacidade para aquela entidade em uma política de privacidade. Você não precisa criar políticas de privacidade separadas para cada tabela e exibição.

Como trabalhar com políticas de privacidade

A implementação de privacidade diferencial para um esquema é um processo de três etapas:

  1. Crie uma política de privacidade que associa orçamentos de privacidade a usuários com base em condições como nome, função ou conta.

  2. Atribua essa política de privacidade a uma tabela ou exibição para garantir que uma consulta ou definir de consultas aos dados não exceda o orçamento de privacidade associado ao usuário que está executando a consulta.

  3. Conceda privilégios SELECT nos dados protegidos por privacidade. Não conceda privilégios antes de atribuir uma política de privacidade à tabela ou exibição porque o analista teria acesso total aos dados.

Ao gerenciar seu ambiente de privacidade diferencial, você também pode:

Criação de uma política de privacidade

A sintaxe mais básica para criar uma nova política de privacidade é:

CREATE PRIVACY POLICY  <name>
  AS ( ) RETURNS PRIVACY_BUDGET -> <body>
Copy

Onde:

  • name é o nome da política de privacidade.

  • AS ( ) RETURNS PRIVACY_BUDGET é a assinatura e o tipo de retorno da política. A assinatura não aceita nenhum argumento e o tipo de retorno é PRIVACY_BUDGET, que é um tipo de dados interno. Todas as políticas de privacidade têm a mesma assinatura e tipo de retorno.

  • body é uma expressão SQL que determina se a política de privacidade retorna um orçamento de privacidade e, em caso afirmativo, qual.

    A expressão SQL do corpo chama duas funções para controlar o valor de retorno da política:

    NO_PRIVACY_POLICY

    Use a expressão do corpo para chamar a função NO_PRIVACY_POLICY quando quiser que uma consulta tenha acesso irrestrito à tabela ou exibição à qual a política de privacidade foi atribuída.

    PRIVACY_BUDGET

    Use a expressão do corpo para chamar a função PRIVACY_BUDGET quando quiser retornar um orçamento de privacidade da política.

Para a sintaxe completa das funções NO_PRIVACY_POLICY e PRIVACY_BUDGET, consulte CREATE PRIVACY POLICY.

Exemplo de políticas de privacidade

Orçamento de privacidade único sem condições

Crie uma política de privacidade my_priv_policy que sempre retorne um orçamento de privacidade chamado analysts:

CREATE PRIVACY POLICY my_priv_policy
  AS ( ) RETURNS PRIVACY_BUDGET ->
  PRIVACY_BUDGET(BUDGET_NAME=> 'analysts');
Copy
Política de privacidade condicional

Crie uma política de privacidade my_priv_policy que dê acesso irrestrito de admin à tabela ou exibição protegida por privacidade, ao mesmo tempo que associa todos os outros usuários ao orçamento de privacidade analysts:

CREATE PRIVACY POLICY my_priv_policy
  AS () RETURNS PRIVACY_BUDGET ->
    CASE
      WHEN CURRENT_USER() = 'ADMIN'
        THEN NO_PRIVACY_POLICY()
      ELSE PRIVACY_BUDGET(BUDGET_NAME => 'analysts')
    END;
Copy
Política de privacidade condicional para compartilhamento entre contas

Crie uma política de privacidade my_priv_policy que faça o seguinte:

  • Fornece acesso irrestrito de admin à tabela ou exibição protegida por privacidade.

  • Associa o orçamento de privacidade analysts aos usuários na mesma conta.

  • Nomeia o orçamento de privacidade associado aos usuários de conta externas para que ele possa ser facilmente identificado. Os orçamentos de privacidade são automaticamente atribuídos a uma conta externa específica, mas usar um esquema de nomenclatura descritivo pode ajudar a gerenciar os orçamentos de privacidade.

CREATE PRIVACY POLICY my_priv_policy
  AS () RETURNS PRIVACY_BUDGET ->
    CASE
      WHEN CURRENT_USER() = 'ADMIN'
        THEN NO_PRIVACY_POLICY()
      WHEN CURRENT_ACCOUNT() = 'YE74187'
        THEN PRIVACY_BUDGET(BUDGET_NAME => 'analysts')
      ELSE PRIVACY_BUDGET(BUDGET_NAME => 'external.' || CURRENT_ACCOUNT())
    END;
Copy

Como usar funções de contexto no corpo da política

Você pode incluir funções de contexto no corpo de uma política de privacidade para que seu comportamento dependa do contexto no qual a consulta privada diferencial é executada.

Você pode usar as seguintes funções de contexto no corpo de uma política de privacidade:

Função de contexto

Descrição

CURRENT_ACCOUNT

Retorna o localizador de conta em uso para a sessão atual do usuário.

CURRENT_DATABASE

Retorna o banco de dados que contém a tabela protegida pela política de privacidade.

CURRENT_ORGANIZATION_NAME

Retorna o nome da organização em uso pelo usuário na sessão atual.

CURRENT_ROLE

Retorna o nome da função em uso para a sessão atual.

CURRENT_SCHEMA

Retorna o esquema que contém a tabela protegida pela política de privacidade.

CURRENT_USER

Retorna o nome do usuário que executa a consulta.

INVOKER_ROLE

Retorna o nome da função de execução.

INVOKER_SHARE

Retorna o nome do compartilhamento que acessou diretamente a tabela ou exibição onde a função INVOKER_SHARE é chamada.

Dica

O contexto funciona como cadeias de caracteres de retorno CURRENT_USER, portanto, as comparações que as utilizam diferenciam maiúsculas de minúsculas. Você pode usar LOWER para converter todas as letras das cadeias de caracteres para minúsculas se quiser fazer uma comparação sem diferenciar entre maiúsculas e minúsculas.

Modificação de uma política de privacidade

Use o comando ALTER PRIVACY POLICY para modificar uma política de privacidade. Você pode renomear a política, alterar seu corpo ou modificar um comentário.

Por exemplo, para substituir o corpo existente de uma política de privacidade my_priv_policy por um novo corpo que sempre retorna um orçamento external_analysts, execute:

ALTER PRIVACY POLICY my_priv_policy SET BODY ->
  PRIVACY_BUDGET(BUDGET_NAME => 'external_analysts');
Copy

Atribuição de uma política de privacidade

Uma política de privacidade pode ser aplicada a uma ou mais tabelas ou exibições para protegê-las com privacidade diferencial. Uma tabela ou exibição pode ter apenas uma política de privacidade atribuída a ela.

Use a cláusula ADD PRIVACY POLICY de um comando ALTER TABLE ou ALTER VIEW para atribuir uma política de privacidade à tabela ou exibição. A sintaxe é:

ALTER { TABLE | [ MATERIALIZED ] VIEW } <name>
  ADD PRIVACY POLICY <policy_name>
  { NO ENTITY KEY | ENTITY KEY ( <column_name> ) }
Copy

Onde:

  • name especifica o nome da tabela ou exibição.

  • policy_name especifica o nome da política de privacidade.

  • column_name especifica a chave de entidade para a tabela ou exibição. A chave de entidade é uma coluna que identifica exclusivamente uma entidade dentro da tabela ou exibição.

Na maioria dos casos, você desejará definir uma chave de entidade para implementar a privacidade em nível de entidade, embora possa usar a cláusula NO ENTITY KEY para proteger linhas individuais sem considerar se os dados pertencentes a uma entidade podem existir em várias linhas. Para obter mais informações, consulte Sobre a privacidade ao nível de entidade.

Por exemplo, para atribuir a política my_priv_policy à tabela t1 onde a chave da entidade é a coluna email, execute:

ALTER TABLE t1 ADD PRIVACY POLICY my_priv_policy ENTITY KEY (email);
Copy

Substituição de uma política de privacidade ou chave de entidade

O método recomendado para substituir uma política de privacidade ou chave de entidade é usar as cláusulas ADD e DROP no mesmo comando ALTER TABLE ou ALTER VIEW. Isso permite que você faça a alteração atomicamente porque ambas as operações ocorrem na mesma transação, não deixando nenhuma lacuna na proteção.

Para manter a mesma política, mas alterar a chave de entidade, você precisa remover a política e adicioná-la novamente com a nova chave de entidade.

Por exemplo, para atribuir uma nova política de privacidade a uma tabela que já está protegida por uma política de privacidade:

ALTER TABLE finance.accounting.customers
  DROP PRIVACY POLICY priv_policy_1,
  ADD PRIVACY POLICY priv_policy_2 ENTITY KEY (email);
Copy

Você também pode destacar a política de privacidade de uma tabela ou exibição em uma instrução e, em seguida, definir uma nova política na tabela ou exibição em uma instrução diferente. Se você escolher esse método, a tabela não será protegida por uma política de privacidade entre a desanexação de uma política e a atribuição de outra. Uma consulta poderia potencialmente acessar dados confidenciais durante esse período se os usuários ainda tivessem privilégios SELECT sobre os dados.

Desanexação de uma política de privacidade

Use a cláusula DROP PRIVACY POLICY de um comando ALTER TABLE ou ALTER VIEW para desanexar uma política de privacidade de uma tabela ou exibição. Após executar este comando, a tabela ou exibição não estará mais protegida por privacidade. A sintaxe é:

ALTER { TABLE | [ MATERIALIZED ] VIEW } <name> DROP PRIVACY POLICY <policy_name>
Copy

Onde:

  • name especifica o nome da tabela ou exibição.

  • policy_name especifica o nome da política de privacidade.

Por exemplo, para desanexar a política de privacidade my_priv_policy da tabela finance.accounting.customers:

ALTER TABLE finance.accounting.customers
  DROP PRIVACY POLICY my_priv_policy;
Copy

Monitoramento das políticas de privacidade

Para ajudar a monitorar o uso de políticas de privacidade, você pode listar todas as políticas de privacidade em sua conta, determinar quais tabelas e exibições são protegidas por uma política de privacidade específica ou listar todas as políticas atualmente atribuídas a uma tabela ou exibição.

Listagem de todas as políticas de privacidade

Você pode usar a exibição PRIVACY_POLICIES no esquema Account Usage do banco de dados SNOWFLAKE compartilhado. Esta exibição é um catálogo de todas as políticas de privacidade da sua conta Snowflake. Por exemplo:

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.PRIVACY_POLICIES
  ORDER BY POLICY_NAME;
Copy

Identificação de referências à política de privacidade

A função de tabela POLICY_REFERENCES do Information Schema pode identificar quais tabelas e exibições são protegidas por políticas de privacidade. Existem duas opções de sintaxe diferentes:

  1. Retornar uma linha para cada objeto (ou seja, tabela ou exibição) que tenha a política de privacidade especificada definida:

    USE DATABASE my_db;
    USE SCHEMA information_schema;
    SELECT policy_name,
           policy_kind,
           ref_entity_name,
           ref_entity_domain,
           ref_column_name,
           ref_arg_column_names,
           policy_status
    FROM TABLE(information_schema.policy_references(policy_name => 'my_db.my_schema.privpolicy'));
    
    Copy
  2. Retornar uma linha para cada política atribuída à tabela chamada my_table. Use a coluna POLICY_KIND para identificar quais políticas são políticas de privacidade.

    USE DATABASE my_db;
    USE SCHEMA information_schema;
    SELECT policy_name,
           policy_kind,
           ref_entity_name,
           ref_entity_domain,
           ref_column_name,
           ref_arg_column_names,
           policy_status
    FROM TABLE(information_schema.policy_references(ref_entity_name => 'my_db.my_schema.my_table', ref_entity_domain => 'table'));
    
    Copy

Privilégios e comandos

As subseções a seguir fornecem informações para ajudar a gerenciar as políticas de privacidade.

Privilégios da política de privacidade

O Snowflake oferece suporte aos seguintes privilégios no objeto de política de privacidade.

Observe que operar em qualquer objeto de um esquema também requer o privilégio USAGE no banco de dados e esquema principais.

Privilégio

Uso

APPLY

Permite atribuir uma política de privacidade ou desanexá-la de uma tabela ou exibição.

OWNERSHIP

Necessário para alterar a maioria das propriedades de uma política de privacidade. A propriedade da política de privacidade pode ser transferida, o que garante controle total sobre a política de privacidade.

Referência DDL à política de privacidade

A Snowflake oferece suporte aos seguintes DDL para criar e gerenciar políticas de privacidade.

Resumo de comandos DDL, operações e privilégios

A tabela a seguir resume a relação entre privilégios da política de privacidade e operações DDL.

Observe que operar em qualquer objeto de um esquema também requer o privilégio USAGE no banco de dados e esquema principais.

Operação

Privilégio necessário

Criar política de privacidade

Uma função com o privilégio CREATE PRIVACY POLICY no mesmo esquema.

Alterar política de privacidade

A função com privilégio OWNERSHIP na política de privacidade.

Descrever a política de privacidade

Um dos seguintes:

  • Uma função com o privilégio global APPLY PRIVACY POLICY.

  • Uma função com privilégio OWNERSHIP na política de privacidade.

  • Uma função com privilégio APPLY na política de privacidade.

Descartar a política de privacidade.

Uma função com privilégio OWNERSHIP na política de privacidade.

Mostrar políticas de privacidade.

Um dos seguintes:

  • Uma função com privilégio USAGE no esquema no qual a política de privacidade existe.

  • Uma função com o privilégio APPLY PRIVACY POLICY na conta.

Atribua uma política de privacidade ou desanexe uma política de privacidade de uma tabela ou exibição.

Um dos seguintes:

  • Uma função com o privilégio APPLY PRIVACY POLICY na conta.

  • Uma função com o privilégio APPLY na política de privacidade e o privilégio OWNERSHIP na tabela ou exibição.