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:
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.
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.
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:
Substituir uma política de privacidade atualmente atribuída a uma tabela ou exibição por outra política.
Desanexar uma política de privacidade de uma tabela ou exibição.
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>
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 chamadoanalysts
:CREATE PRIVACY POLICY my_priv_policy AS ( ) RETURNS PRIVACY_BUDGET -> PRIVACY_BUDGET(BUDGET_NAME=> 'analysts');
- Política de privacidade condicional
Crie uma política de privacidade
my_priv_policy
que dê acesso irrestrito deadmin
à tabela ou exibição protegida por privacidade, ao mesmo tempo que associa todos os outros usuários ao orçamento de privacidadeanalysts
: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;
- 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;
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 |
---|---|
Retorna o localizador de conta em uso para a sessão atual do usuário. |
|
Retorna o banco de dados que contém a tabela protegida pela política de privacidade. |
|
Retorna o nome da organização em uso pelo usuário na sessão atual. |
|
Retorna o nome da função em uso para a sessão atual. |
|
Retorna o esquema que contém a tabela protegida pela política de privacidade. |
|
Retorna o nome do usuário que executa a consulta. |
|
Retorna o nome da função de execução. |
|
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');
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> ) }
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);
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);
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>
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;
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;
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:
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'));
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'));
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:
|
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:
|
Atribua uma política de privacidade ou desanexe uma política de privacidade de uma tabela ou exibição. |
Um dos seguintes:
|