Introdução à privacidade diferencial¶
Introdução¶
Este tutorial demonstra como proteger dados confidenciais usando uma política de privacidade diferenciada para que você possa compartilhá-los com segurança com os analistas.
O que você aprenderá¶
Neste tutorial, você aprenderá a fazer o seguinte:
Criar uma política de privacidade diferenciada.
Aplicar essa política de privacidade a uma tabela para protegê-la com privacidade diferencial.
Definir domínios de privacidade para uma tabela.
Executar uma consulta em uma tabela protegida por privacidade diferencial.
Determinar a quantidade de ruído presente nos resultados de consulta.
Este tutorial não explica totalmente os principais conceitos de privacidade diferencial, como ruído, orçamentos de privacidade e domínios de privacidade. Este tutorial se concentra em como aplicar a privacidade diferencial aos seus dados.
Sobre administradores e analistas¶
Você assumirá dois papéis neste tutorial:
O administrador, que tem privilégios para os dados brutos e gerencia políticas de privacidade diferenciais em uma tabela.
O analista, que executa consultas sobre esses dados protegidos.
Em casos de uso no mundo real, podem ser duas pessoas ou grupos de pessoas diferentes, ou uma pessoa que deseja analisar e compartilhar resultados protegidos com segurança com outras pessoas.
Embora este tutorial mostre como executar consultas em dados protegidos, seu objetivo principal é mostrar como implementar a privacidade diferencial, e não como consumi-la.
Pré-requisitos¶
É necessário estar em uma conta Enterprise Edition ou superior.
É necessário ser capaz de usar a função ACCOUNTADMIN.
Importante
Neste tutorial, você executará todas as etapas do papel de administrador usando a função ACCOUNTADMIN. Na prática geral, porém, você deve usar funções com privilégios especificamente definidos para a ação que está executando. Os privilégios necessários para criar e aplicar políticas de privacidade estão descritos aqui.
Criação de funções, warehouse e dados¶
Nesta seção, você realizará as seguintes etapas de configuração:
Criar uma função para o analista.
Criar o warehouse usado para executar as consultas nos dados protegidos.
Criar dados confidenciais simulados que serão protegidos pela política de privacidade.
Nenhuma dessas etapas de configuração é específica para políticas de privacidade diferenciais. Se já existir uma função, um warehouse e/ou conjunto de dados adequados, é possível usá-los.
Criação da função de analista¶
Em uma planilha do Snowsight ou em outro ambiente que esteja conectado para executar o Snowflake SQL em sua conta Snowflake, execute os seguintes comandos para criar a função de analista e atribuí-la a você:
USE ROLE ACCOUNTADMIN;
CREATE ROLE dp_tutorial_analyst;
-- You can find your own user name by running "SELECT CURRENT_USER();"
GRANT ROLE dp_tutorial_analyst TO USER <user_name>;
Criação de um warehouse para os dados¶
CREATE OR REPLACE WAREHOUSE dp_tutorial_wh;
GRANT USAGE ON WAREHOUSE dp_tutorial_wh TO ROLE dp_tutorial_analyst;
Criação de dados confidenciais simulados¶
Os comandos a seguir criam um banco de dados, um esquema e uma tabela e os preenchem com dados. Os dados simulam um estudo simples de diabetes no qual queremos proteger as identidades dos pacientes. Mais adiante no tutorial, você usará a privacidade diferencial para proteger a identidade dos indivíduos no estudo.
-- Create the table
CREATE OR REPLACE DATABASE dp_db;
CREATE OR REPLACE SCHEMA dp_db.dp_schema;
USE SCHEMA dp_db.dp_schema;
CREATE OR REPLACE TABLE dp_tutorial_diabetes_survey (
patient_id TEXT,
is_smoker BOOLEAN,
has_difficulty_walking BOOLEAN,
gender TEXT,
age INT,
has_diabetes BOOLEAN,
income_code INT);
-- Populate the table
INSERT INTO dp_db.dp_schema.dp_tutorial_diabetes_survey
VALUES
('ID-23493', TRUE, FALSE, 'male', 39, TRUE, 2),
('ID-00923', FALSE, FALSE, 'female', 82, TRUE, 5),
('ID-24020', FALSE, FALSE, 'male', 69, FALSE, 8),
('ID-92848', TRUE, TRUE, 'other', 75, FALSE, 3),
('ID-62937', FALSE, FALSE, 'male', 46, TRUE, 5);
Notas:
Embora possa parecer que mascarar o ID do paciente seria melhor do que usar a privacidade diferencial, isso impediria as junções com essa coluna. Além disso, se você adicionasse uma tabela em que cada paciente tivesse várias linhas, como uma tabela de medicamentos ou uma tabela de visitas, o simples mascaramento o impediria o agrupamento dos resultados por pessoa. Esse é um caso em que a privacidade diferencial pode ser muito mais poderosa do que o simples mascaramento e a ocultação de linhas; é possível disponibilizar mais dados para os analistas e permitir consultas mais úteis e, ao mesmo tempo, proteger a privacidade da entidade.
Definição de uma política de privacidade¶
A aplicação de uma política de privacidade a uma tabela ou exibição protege-a com privacidade diferencial e atribui um orçamento de privacidade a grupos ou usuários para que o Snowflake possa evitar que várias consultas revelem muitas informações confidenciais.
Você criará a política de privacidade em seu próprio banco de dados. Essa é uma prática recomendada para todos os tipos de políticas no Snowflake. Se você criar a política no mesmo banco de dados, a clonagem do banco de dados criará cópias não sincronizadas da política. Colocar todas as políticas em um único banco de dados separado e aplicá-las a várias tabelas permite que você gerencie e atualize uma única cópia de cada política.
Você nomeará essa nova política como patients_policy
.
-- Define a privacy policy. Use default budget, budget window, max budget per aggregate.
CREATE OR REPLACE DATABASE policy_db;
CREATE OR REPLACE SCHEMA policy_db.diff_priv_policies;
CREATE OR REPLACE PRIVACY POLICY policy_db.diff_priv_policies.patients_policy AS () RETURNS privacy_budget ->
CASE
WHEN CURRENT_ROLE() = 'ACCOUNTADMIN' THEN no_privacy_policy()
WHEN CURRENT_ROLE() IN ('DP_TUTORIAL_ANALYST')
THEN privacy_budget(budget_name => 'clinical_analysts')
ELSE privacy_budget(budget_name => 'default')
END;
Notas:
A política de privacidade aplicada depende da função do usuário, conforme especificado na instrução CASE. Os nomes das funções são fornecidos aqui em letras maiúsculas porque CURRENT_ROLE() retorna valores em letras maiúsculas.
A criação de orçamentos de privacidade separados por função permite separar o orçamento usado para analistas e outros usuários e também monitorar o uso por cada grupo.
Se a política de privacidade resolver para um orçamento de privacidade válido quando avaliada, o usuário não poderá executar consultas não agregadas SELECT, o ruído será adicionado aos resultados e o número de consultas será limitado pelo orçamento de privacidade dessa política.
A função de administrador da conta não tem política de privacidade aplicada. Isso significa que as consultas executadas como essa função não têm privacidade diferencial aplicada. Para indicar que não há política de privacidade, é necessário retornar
no_privacy_policy()
em vez de NULL.A função DP_TUTORIAL_ANALYST usa uma política de privacidade denominada «clinical_analysts» com valores padrão para orçamento de privacidade, janela de orçamento e orçamento máximo por agregado.
Qualquer outro usuário com acesso a SELECT obterá um orçamento de privacidade denominado «padrão», também com valores de política de privacidade padrão. Se quiser impedir que outros usuários executem consultas nessa tabela, você deve fazer isso limitando os privilégios SELECT na tabela. As políticas em nível de tabela exigem uma cláusula ELSE e não podem retornar NULL.
Atribuição da política de privacidade¶
Em seguida, você atribuirá a política de privacidade que acabou de criar à tabela para protegê-la com privacidade diferencial.
-- Assign the privacy policy to the table.
ALTER TABLE dp_db.dp_schema.dp_tutorial_diabetes_survey
ADD PRIVACY POLICY policy_db.diff_priv_policies.patients_policy ENTITY KEY (patient_id);
Notas:
A cláusula ENTITY KEY especifica uma coluna que identifica exclusivamente a entidade que deve ser protegida por privacidade diferencial. Neste tutorial, que tem uma única tabela onde cada entidade é listada em uma única linha, definir a chave da entidade é menos importante. No entanto, se cada paciente pudesse aparecer em várias linhas (por exemplo, se ele capturasse visitas ou medicamentos de pacientes), seria importante definir a chave. Ainda é uma boa prática definir a chave aqui, caso uma segunda tabela desse tipo seja adicionada ao banco de dados posteriormente. Saiba mais sobre a privacidade ao nível de entidade.
Definição de um domínio de privacidade¶
Em seguida, você definirá os domínios de privacidade em colunas selecionadas na tabela.
Um domínio de privacidade informa ao sistema o intervalo de valores que podem ser mostrados nos resultados dessa coluna. O sistema usa essas informações de duas maneiras:
Os valores fora desse intervalo serão omitidos ou vinculados aos limites, dependendo do fato de a coluna ser uma cadeia de caracteres ou um valor numérico/de data.
O sistema usa esse «intervalo válido» como uma forma de determinar o intervalo de resultados para determinar o ruído aplicado a cada valor de medida.
Um analista pode restringir ainda mais um domínio, por exemplo, usando uma cláusula WHERE, para reduzir potencialmente a quantidade de ruído gerado pela privacidade diferencial (quanto menor o domínio, menor o ruído). Se você não definir um domínio de privacidade em uma coluna, o analista deverá adicionar um domínio de privacidade com uma cláusula WHERE para ver os valores dessa coluna (colunas sem um domínio de privacidade não podem ser exibidas ou usadas na consulta).
Para os dados da pesquisa sobre diabetes, você definirá domínios de privacidade em três colunas: gender
, age
e income_code
. Você não definirá domínios de privacidade em nenhuma coluna booliana (com apenas dois valores possíveis, um domínio de privacidade não faz sentido e não é necessário) e não deve definir um domínio de privacidade na coluna patient_id
porque o usuário pode ver os valores que você definiu no domínio de privacidade, o que informaria quais IDs de pacientes estão nos dados. Se você precisar especificar um domínio de privacidade para um número limitado de valores de cadeia de caracteres, como os códigos ZIP, deverá preencher a definição de domínio com valores adicionais não presentes para ocultar os valores possíveis.
-- Define privacy domains.
ALTER TABLE dp_db.dp_schema.dp_tutorial_diabetes_survey ALTER (
COLUMN gender SET PRIVACY DOMAIN IN ('female', 'male', 'other'),
COLUMN age SET PRIVACY DOMAIN BETWEEN (0, 90),
COLUMN income_code SET PRIVACY DOMAIN BETWEEN (1, 8)
);
Concessão de acesso à tabela ao analista¶
Conceda acesso à tabela somente depois que você tiver atribuído políticas de privacidade aos dados. Caso contrário, os usuários poderiam ver os dados antes de você aplicar as políticas de privacidade.
GRANT USAGE ON DATABASE dp_db TO ROLE dp_tutorial_analyst;
GRANT USAGE ON SCHEMA dp_schema TO ROLE dp_tutorial_analyst;
GRANT SELECT
ON TABLE dp_db.dp_schema.dp_tutorial_diabetes_survey
TO ROLE dp_tutorial_analyst;
Execução de algumas consultas¶
Finalmente, é possível começar a executar consultas em seus dados!
Você alternará as funções entre administrador e analista para comparar o comportamento e a saída de cada função.
Verifique se a privacidade diferencial está funcionando¶
Use a função de administrador para executar uma consulta que retorna linhas individuais. Esta consulta é bem-sucedida porque a política de privacidade é resolvida como no_privacy_policy() para a função ACCOUNTADMIN:
USE ROLE ACCOUNTADMIN;
SELECT * FROM dp_db.dp_schema.dp_tutorial_diabetes_survey;
Agora, execute a mesma consulta usando a função de analista. A consulta falha porque a privacidade diferencial não permite consultas SELECT *.
USE ROLE dp_tutorial_analyst;
SELECT * FROM dp_db.dp_schema.dp_tutorial_diabetes_survey;
Tente com uma terceira função para garantir que o resultado padrão seja o mesmo. (Não se esqueça de conceder SELECT na tabela para a pessoa ou função!)
Veja como é o ruído¶
Primeiro, execute uma consulta simples como administrador, sem aplicar a privacidade diferencial. Você verá os valores exatos da tabela.
-- Run a basic query without DP.
USE ROLE ACCOUNTADMIN;
SELECT COUNT(DISTINCT patient_id)
FROM dp_db.dp_schema.dp_tutorial_diabetes_survey
WHERE income_code = 5;
Agora, execute a mesma consulta como analista e você verá que o ruído foi aplicado aos resultados. Observe que a consulta demora um pouco mais porque a privacidade diferencial está sendo aplicada.
USE ROLE dp_tutorial_analyst;
SELECT COUNT(DISTINCT patient_id)
FROM dp_db.dp_schema.dp_tutorial_diabetes_survey
WHERE income_code = 5;
Os resultados são normalmente diferentes dos resultados de administração porque a privacidade diferencial introduziu ruído nos resultados para ocultar a presença de um indivíduo no conjunto de dados. No entanto, os resultados às vezes podem ser idênticos porque, em qualquer consulta, o ruído gerado aleatoriamente era pequeno o suficiente para ser arredondado para 0. Mas o analista não pode saber se há ou não ruído aplicado a uma determinada consulta. É possível tentar executar essa consulta novamente para ver um resultado diferente é obtido.
Análise da quantidade de ruído¶
Embora os analistas não consigam ver resultados sem ruído, eles precisam de uma maneira de entender o nível de ruído do resultado, em geral, para determinar se os dados podem ser usados para suas necessidades. Para fornecer essas informações, expomos o intervalo de ruído de cada parâmetro de consulta para o analista. O intervalo de ruído é recuperado usando as funções DP_INTERVAL_LOW e DP_INTERVAL_HIGH.
-- Retrieve noise interval for the previous query.
USE ROLE dp_tutorial_analyst;
SELECT COUNT(DISTINCT patient_id) as c,
DP_INTERVAL_LOW(c) as LOW,
DP_INTERVAL_HIGH(c) as HIGH
FROM dp_db.dp_schema.dp_tutorial_diabetes_survey
WHERE income_code = 5;
Há um mínimo de 95% de confiança de que o valor real da agregação está entre LOW e HIGH.
Observe que o intervalo para essa consulta nesses dados é amplo em comparação com a magnitude do resultado devido ao conjunto de dados artificialmente pequeno. Esse amplo intervalo de ruído significa essencialmente que há poucos pacientes aqui para que o Snowflake possa dar uma resposta precisa e, ao mesmo tempo, proteger a privacidade deles.
Visualização do orçamento e das consultas restantes estimadas¶
Os usuários que executam consultas em tabelas protegidas por privacidade diferencial podem ver o orçamento de privacidade diferencial usado e uma estimativa do número de consultas restantes, chamando a função de tabela ESTIMATE_REMAINING_DP_AGGREGATES. Assuma a função para a qual deseja ver o orçamento e, em seguida, chame a função conforme mostrado aqui:
USE ROLE <role_name>;
SELECT * FROM TABLE(SNOWFLAKE.DATA_PRIVACY.ESTIMATE_REMAINING_DP_AGGREGATES(dp_db.dp_schema.dp_tutorial_diabetes_survey));
Limpeza¶
Limpe seus recursos para que você, ou outra pessoa da organização, possa executar o tutorial novamente mais tarde.
USE ROLE ACCOUNTADMIN;
DROP ROLE dp_tutorial_analyst;
DROP WAREHOUSE dp_tutorial_wh;
ALTER TABLE dp_tutorial_diabetes_survey
DROP PRIVACY POLICY policy_db.diff_priv_policies.patients_policy;
DROP DATABASE dp_db;
DROP DATABASE policies_db;